鍍金池/ 問(wèn)答/Linux/ Git 既落后(ahead)又超前 (behind)到底是怎么回事?

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

使用 SourceTree 進(jìn)行合并變基后,有事就會(huì)出現(xiàn) 落后 N個(gè)版本,超前 N 個(gè)版本。

然后需要先 git pull ,才能繼續(xù)操作。 git pull的時(shí)候會(huì)經(jīng)常性的沖突。

一致不明白這個(gè)既落后又超前具體是怎么形成的,是什么意思。

希望大神指點(diǎn)!

回答
編輯回答
心夠野

你拉取代碼的時(shí)候線(xiàn)上版本為1,然后你本地commit了代碼,版本為2,但是線(xiàn)上版本已經(jīng)發(fā)展為3了,這個(gè)時(shí)候把線(xiàn)上代碼拉下來(lái)就出現(xiàn)了又落后,又超前的情況

2017年10月9日 01:29
編輯回答
只愛(ài)你

你本地commit了代碼,沒(méi)有push,就是超前。
remote上有更新,本地沒(méi)有pull,就是落后。

這不沖突,因?yàn)榕袛嘀黧w不一樣。

2017年8月31日 04:39
編輯回答
別硬撐

很好解釋。假如現(xiàn)在有一個(gè)項(xiàng)目,master branch 有三個(gè) commit,分別是 A,B,C:

A - B - C

你在這時(shí)候新建了一個(gè) branch (tracking master branch),叫 myBranch,然后寫(xiě)了代碼并提交,這時(shí)候你的 branch 是這樣:

A - B - C - X

在這期間,你的同事在 master 上也寫(xiě)了代碼并提交,這時(shí)候 master 變成:

A - B - C - D

那么現(xiàn)在,你的 myBranch 就是既 behind 又 ahead 了。


順便,這時(shí)候如果你在 myBranch 上執(zhí)行 git rebase origin/master 命令,那么 myBranch 就會(huì)是:

A - B - C - D - X'

注意 X'X 的 "實(shí)際作用" 相同,但 hash 不同


如果你在 myBranch 上執(zhí)行 git pull origin master 命令,那么 myBranch 就會(huì)是:

A - B - C - X - E

其中,E 是一個(gè) merge commit。也就是把當(dāng)前 master 的 HEAD 加到 myBranch


你還有一個(gè)選擇,就是 git cherry-pick D,那么你的 myBranch 就會(huì)是:

A - B - C - X - D'

注意 D'D 的 "實(shí)際作用" 相同,但 hash 不同..而且 D' 不是一個(gè) merge commit。

2017年6月11日 13:22
編輯回答
不舍棄

我也用SourceTree ,個(gè)人認(rèn)為:這種情況是你的項(xiàng)目里有些文件跟遠(yuǎn)程分支不一致,例如項(xiàng)目里有A,B,C三個(gè)文件,你和你同事共同開(kāi)發(fā),A文件你修改了,就是超前咯,當(dāng)B文件被人修改后再提交到遠(yuǎn)程分支,這樣就是你本地的B文件落后咯,C文件大家都沒(méi)改過(guò),所以沒(méi)變動(dòng)

2017年3月15日 08:41