Git 既落后(ahead)又超前 (behind)到底是怎么回事?

使用 SourceTree 进行合并变基后,有事就会出现 落后 N个版本,超前 N 个版本。

然后需要先 git pull ,才能继续操作。 git pull的时候会经常性的冲突。

一致不明白这个既落后又超前具体是怎么形成的,是什么意思。

希望大神指点!

阅读 22k
4 个回答

很好解释。假如现在有一个项目,master branch 有三个 commit,分别是 A,B,C:

A - B - C

你在这时候新建了一个 branch (tracking master branch),叫 myBranch,然后写了代码并提交,这时候你的 branch 是这样:

A - B - C - X

在这期间,你的同事在 master 上也写了代码并提交,这时候 master 变成:

A - B - C - D

那么现在,你的 myBranch 就是既 behind 又 ahead 了。


顺便,这时候如果你在 myBranch 上执行 git rebase origin/master 命令,那么 myBranch 就会是:

A - B - C - D - X'

注意 X'X 的 "实际作用" 相同,但 hash 不同


如果你在 myBranch 上执行 git pull origin master 命令,那么 myBranch 就会是:

A - B - C - X - E

其中,E 是一个 merge commit。也就是把当前 master 的 HEAD 加到 myBranch


你还有一个选择,就是 git cherry-pick D,那么你的 myBranch 就会是:

A - B - C - X - D'

注意 D'D 的 "实际作用" 相同,但 hash 不同..而且 D' 不是一个 merge commit。

你本地commit了代码,没有push,就是超前。
remote上有更新,本地没有pull,就是落后。

这不冲突,因为判断主体不一样。

我也用SourceTree ,个人认为:这种情况是你的项目里有些文件跟远程分支不一致,例如项目里有A,B,C三个文件,你和你同事共同开发,A文件你修改了,就是超前咯,当B文件被人修改后再提交到远程分支,这样就是你本地的B文件落后咯,C文件大家都没改过,所以没变动

你拉取代码的时候线上版本为1,然后你本地commit了代码,版本为2,但是线上版本已经发展为3了,这个时候把线上代码拉下来就出现了又落后,又超前的情况

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进