[TOC]
-
查看当前git配置:
git config [<option>]
-
Location:
--global
: 使用全局配置文件
--system
:使用系统配置文件--local
: 使用本地配置文件eg:
git config --local
eg:git config --local user.name 'hjj'
→ 设置本地user.name
-
Action:
-l
,--list
: 列出全部配置项
eg:git config --local --list
--unset
: 删除一个变量: name [value-regex]
eg:git config --local --unset user.name
→ 删除本地配置项中的user.name
- 查看提交历史。
git log
:显示当前分支的版本历史。git log --oneline
:将每次提交显示在一行上面(commit id仅显示头几位)。git log -1
:数字表示显示的提交日志条数。git log --pretty=oneline
:显示全部commit id。git log --all
:查看全部分支提交历史。
git add [file1] [file2] ...
:添加指定文件到暂存区。gir add -u
:可以添加所有已经被 git 控制的文件到暂存区
git rm [file1] [file2] ...
:删除工作区文件,并且将这次删除放入暂存区。
也可以先删除文件,然后使用git rm <file>
和git add<file>
效果是一样的。
git status
:查看状态和有变更文件。
git commit -m [message]
:提交暂存区到仓库区。git commit [file1] [file2] ... -m [message]
: 提交暂存区的指定文件到仓库区。git commit -a
: 提交工作区自上次commit之后的变化,直接到仓库区。
git branch
:显示所有本地分支。git branch -r
:列出所有远程分支。git branch -a
:列出所有本地分支和远程分支。git branch -v
:列出每个分支的最后一次提交内容。git branch -d [branch-name]
:删除分支。git branch [branch-name]
:新建一个分支,但依然停留在当前分支。git checkout -b [branch]
:新建一个分支,并切换到该分支。git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
:(有前后顺序)手动指定branch-name分支追踪upstream分支(--set-upstream
已经不再支持)。
git cat-file -t
:查看 git 对象的类型。git cat-file -p
:查看 git 对象的内容。git cat-file -s
:查看 git 对象的大小。
- git diff 命令详解(是可选)。
git diff HEAD HEAD^1
:表示HEAD
与HEAD
的parent
进行比较。git diff <filename>
:查看文件在工作目录与暂存区的差别。如果还没 add 进暂存区,则查看文件自身修改前后的差别。也可查看和另一分支的区别。
git reset --hard [版本(eg:HEAD^^ 或 [commit id])]
:彻底回退到某个版本,本地的源码也会变为该版本的内容;默认版本为HEAD,即当前版本,会重置暂存区与工作区,与上一次commit保持一致。git reset HEAD <file>
:可以把暂存区的修改撤销掉(unstage),重新放回工作区;不写file
表示撤销所有暂存区内容。
git checkout -- <filename>
:把filename
文件在工作区的修改全部撤销,这里有两种情况:一种是
filename
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是filename
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。git checkout [commit id]
:切换到某个commit上,并从此处开始建立分离头指针,可以在该分支继续进行操作,然后保存该分离头指针为一个分支,也可以选择舍弃。git checkout -b [branch]
:新建一个分支,并切换到该分支。git checkout -b [branch] [remote branch]
:将远端分支拉取到本地并命名。
-
git merge [branch]
:合并指定分支到当前分支。 -
如果合并的两个分支有冲突,解决冲突之后一定会生成一个新的
commit
,因为解决完冲突之后要讲解决完冲突的内容重新git add
和git commit
。 -
--no-ff
(禁用Fast forward
):如果使用--no-ff
,则合并分支时会新建一个commit
,否则会将当前分支的指针直接指向被合并分支。
而且,合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。图片1、2两处都是将分支合并到
master
之后删除分支,1处是没有使用--no-ff
,合并后的历史没有分支,2处使用了--no-ff
,合并后的历史有分支。
注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
git tag
:查看所有标签(按字母顺序排列)。git tag <tagname>
:给当前分支的最新commit打上tagname标签。git tag <tagname> <commit id>
:给对应commit id
的commit打上tagname标签。git tag -d <tagname>
:删除本地打错的标签。- 把标签推送到远程是
git push
命令。 git push origin :refs/tags/<tagname>
:从远程删除标签,记得从本地git tag -d <tagname>
删除对应本地标签。
git show <tagname>
:可以看到标签对应commit的信息,包括提交的修改内容。
git remote介绍
git remote
:列出所有远程主机。git remote -v
:可以参看远程主机的网址。
git push
git push <远程主机名> <本地分支名>:<远程分支名>
:git push命令用于将本地分支的更新,推送到远程主机。
如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。git push origin master
:将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。git push origin :master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。等同于git push origin --delete master
。
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
:将当前分支推送到origin主机的对应分支。git push -f
:强制推送到远程分支,即将远程分支同步至与本地一样(用于强制回退远程分支版本)。git push origin <tagname>
:推送名为tagname的标签到远程。git push origin --tags
:一次性推送全部尚未推送到远程的本地标签。
--pretty
:使用其他格式显示信息。git reflog
:用来查看命令历史,即历史提交和回退的记录,可用于找回过去的数据(如commit id
)。--hard
:
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
-
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
-
并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
-
master分支是主分支,因此要时刻与远程同步;
-
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
-
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
-
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
-
HEAD
是一个指向当前版本的指针。- 用
HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。 git
管理的是修改,不是文件,所以git commit
命令在不加其他指令的时候只会提交已经git add
到暂存区中的修改。
-
powershell
:powershell常用命令。 -
显示当前目录:
pwd
。 -
列出当前文件夹下的文件信息:
ls
。显示全部(包括隐藏文件):
ls -al
ingit bash
;ls -force
inpowershell
-
vi [file]
: 使用vi编辑文件。 -
创建目录:
mkdir
:创建删除文件夹命令。 -
创建文件:创建文件的几种方式。
-
查找文件:查找文件的命令。
-
cat 文件名(可以包含路径)
:查看文件的内容。