工作期间学习git陆陆续续近一个月,在此将一些常用的命令进行记录,共同学习。
git fetch、 git merge、 git pull、 git push、 git reset、 git log。
1、git fetch
说git fetch前先了解下FETCH_HEAD
FETCH_HEAD:是一个版本链接,记录在本地的一个文件(项目的.git)中,指向着目前已经从远程仓库取下来的分支的末端版本。
git fetch有四种基本用法:
1)、$ git fetch :--创建并更新所有远程分支的本地远程分支的最新commit-id,将其记录在 .git/FETCH_HEAD中
(如果有多个分支的话,默认使用的远程仓库查看.git/config:[branch "master"]配置)
2)、$ git fetch remote_repo :--将更新仓库名为remote_repo 的远程仓库上的所有branch的最新commit-id,将其记录
3)、$ git fetch remote_repo remote_branch_name :--将更新仓库名为remote_repo 的远程的remote_branch_name 分支
(不会创建本地没有的远程分支到本地)
4)、$ git fetch remote_repo remote_branch_name:local_branch_name :--将更新仓库名为remote_repo 的远程分支名为remote_branch_name到本地分支,本地分支名:local_branch_name
(如果本地没有local_branch_name分支,将在本地进行创建保存remote_branch_name的最新数据)
2、git merge
取回远程主机的更新后,可以在它的基础上,使用git checkout命令创建一个新的分支。
$ git checkout -b newBranch origin/master
该命令表示,在取回的origin/master的基础上,创建一个新分支。
此外,可以使用git merge命令,在本地分支上合并远程分支。
$ git merge origin :在当前分支上,合并origin/master
3、git pull
git pull命令的作用是,取回远程主机的某个分支的更新,再与本地的指定分支合并。
$ git pull <远程主机名> <远程分支名>:<本地分支名>
比如:取回origin主机的next分支,与本地的master分支合并 :$ git pull origin next:master
如果远程分支是与当前分支进行合并,则冒号后面的部分可以省略 :$ git pull origin next(省略的是本地分支名)
如果该远程分支(next)不存在,则报fatal: Couldn't find remote ref '远程分支名'(找不到该的远程分支)。
$ git pull origin next 表示,取回origin/next分支,再与当前分支合并。着等同于先做git fetch,再做git merge。
$ git fetch origin
$ git merge origin/next
在某些时候,git会自动在本地分支与远程分支之间建立一种追踪关系(tracking)。比如git clone的时候,所有本地分支默认与远程主机的同名分支建立追踪关系,也就是说,本地的master分支会自动追踪origin/master分支。
当然,git也提供了自动建立跟踪关系(下面讲解的git push同样适用)
$ git branch --set-upstream master origin/next :表示指定master分支追踪origin/next分支。
此时当前分支与远程分支存在追踪关系了,便可省略远程分支名进行pull :$ git pull origin
如果当前分支只有一个追踪分支,远程主机名也可省略 :$ git pull
(建议使用git fetch(拉取)与git merge(合并)替换git pull)
4、git push
git push命令用于将本地分支的更新推送到远程主机。格式与git pull相仿。
$ git push <远程主机名> <本地分支名>:<远程分支名>
注意:分支推送的顺序是<来源地>:<目的地>,所以git pull的是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>
如果省略远程分支名,则表示将本地分支推送与之存在追踪关系的远程分支(通常两者同名),如果该分支不存在,则会被新建,分支名与本地相同。
$ git push origin master(省略的是远程分支名)
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
$ git push origin :master
#等同于
$ git push origin --delete master
上面命令表示删除origin主机的master分支。
另:关于git push操作的默认行为
在git的全局配置中,有一个push.default属性,其决定了git push的默认行为。在Git2.0之前,这个属性默认为‘matching’,2.0后被改成‘simple’。
我们可以通过git version确定当前的git版本(如果小于2.0,更新是个更好的选择),通过git config --global push.default 'option' 改成push.default的默认行为(或者也可以直接编辑~/gitconfig文件)。
push.default有以下几个可选值:nothing、current、upstream、simple、matching
分别表示:
--nothing :push操作无效,除非显示指定远程分支。
--current :push当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支。
--upstream :push当前分支到它的upstream分支上(这一项其实用于经常从本地分支push/pull到同一个仓库的情景,该模式叫做central workflow)。
--simple :simple和upstream是相似的,只是有一点不同,simple必须保证当前本地分支和它的远程upstream分支同名,否则会拒绝。
--matching :push所有本地和远程两端都存在的同名分支(本地分支没有跟踪也会被push上去(没测试过)和simple最大的区别)。
(前四种均是操作的当前分支,这一点很重要)
5、git reset
这里只说明一下reset命令的3中常用方式
1)、$ git reset --mixed :此为默认方法,不带任何参数的git reset,即是这种方法,它回退到某个版本,只保留工作目录,回退commit和index信息。
2)、$ git reset --soft :回退到某个版本,只回退了commit的信息,不会恢复index信息,如果还要提交,直接commit即可。
3)、$ git reset --hard :彻底会退到某个版本,本地的工作目录也会被删除(危险操作)。
(退回的记录可通过git reflog进行查看。)
6、git log
git log常用的命令:
1)$ git log -n : 查看前多少条日志记录。默认整屏,也是分页显示的。
2)$ git log --decorate :查看各个分支当前所指的对象。
3)$ git log --pretty=oneline :每个提交信息单行显示。
4)$ git log --abbrev-commit :显示commit-id的简略形式(一般显示前7位)。
3)与4)可使用git log --oneline代替。
还有很多日志输出的形式,这里不一一介绍了。
有异议望留言,共同学习。