在使用git的日常开发过程中,经常遇到如下情况:

1、某个时间你通过git clone/git fetch拉取了远程仓库代码到本地仓库

2、开始本地调试并开发某个功能,经过几天的奋斗,终于功能调试好了

3、当你开心地准备通过git push分享你的成果时,遇到git push失败,提示本地代码非最新,需要先更新本地代码

原来在你调试过程中,有人“偷偷地”提交了代码,导致出现类似下面所示的情况:

说明如下:

1、o/master为远程分支,master:本地跟踪分支

2、c0、c1是从远程仓库取到本地的,故o/master指向c1

3、c2代表别人提交的代码,c3是你准备git push的本地提交

4、左边实线圆圈是本地仓库,右边虚线圆圈是远程仓库

这时你是不是觉得一时无从下手呢?是否会抱怨别人不厚道?

别怕,git早就想到了,而且给出了两种不同的解决方案呢^_^

第一种:git pull --rebase

git pull --rebase可能一时不容易理解,这里先卖个关子,先看下如下操作:

git fetch

git rebase o/master

其中:

git fetch会基于c1,从远程仓库中拉取c2到本地,然后更新o/master指向c2

git rebase o/master, 这是一个变基操作,首先将master变基到o/master,这样就会在o/master分支上多了一个c3'(c3的副本),再将master指向c3', 具体效果如下图所示:

这样再git push即可,且push之后远程仓库结果如下:

 第二种:git pull

git pull 一般不建议直接使用,因为该命令往往会产生意想不到的后果,让你后悔不已,我们尽量使用下面两个命令来代替:

git fetch

git merge o/master 

其中:

git fetch效果同上

git merge o/master, 这是一个合并操作,与变基操作不同,git只会新创建一个节点c4,然后使c2和c3同时作为c4的父节点,然后使master指向c4,具体效果如下:

这时再git push即可,但是push之后远程仓库结果如下:

 你是不是觉得很惊讶呢?很可能和你预想的效果不同吧?所以尽量使用git pull --rebase,这样可以使远程仓库提交历史更清爽。 

本文参考git闯关游戏:Learn Git Branching

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐