Git push无法进行快进合并是什么意思?

6

请问有没有一个简单的例子,说明当Git推送到中央仓库时快进合并失败会导致什么情况?为了出现这种情况,本地仓库和中央仓库的状态需要如何呈现?我真的很难想象...


很好的问题!许多人不理解这一点,但我发现大多数问题都没有写得很好。 - erikbstack
2个回答

11
我假设您正在遇到以下问题:
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '/Users/mayoff/t/test/central'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

这里是“非快进更新被拒绝”的问题出现方式。
假设Alice和Bob正在开发一个项目。他们各自有一个代码仓库,并且有一个中央代码仓库,他们都会推送和拉取代码。最初,这三个代码仓库看起来像这样:

initial synchronized repos

现在,Alice和Bob都在做一些工作。每个人向他们的本地仓库提交了不同的更改:

private repos have new commits

下一步,Alice 将她的更改推送到中央仓库:

central repo updated by Alice

下一步,Bob 尝试推送。中央仓库的主分支指向提交 3。Bob 的推送尝试将其更新为指向提交 4。由于提交 4 没有提交 3 作为祖先,需要进行合并,但是 git push 不执行真正的合并。它只执行“快进”,其中新的主分支具有旧的主分支作为祖先。因此,Bob 因为试图推送需要真正合并而不是快进的内容而出现错误。
要成功推送,Bob 必须先从中央仓库获取新的提交。

Bob has fetched Alice's commit

他需要将他的更改(提交 #4)与爱丽丝的更改(提交 #3)合并,创建一个新的提交,该提交具有这两个提交作为祖先:

Bob has merged the commits

可以使用两个命令(git fetchgit merge)或一个命令(git pull)完成获取和合并操作。

现在Bob可以成功推送,因为中央代码库看到新主分支的祖先是旧的主分支。

Bob pushed the merge

注意现在Alice缺少Bob的提交记录。如果她在从中央仓库拉取之前向她的仓库进行更多提交并尝试推送,她将收到非快进错误,并且她必须获取和合并以解决它,就像Bob一样。

我刚意识到我的箭头指错了方向。噢,算了吧。希望还是足够清楚的。 - rob mayoff
现在它们展示的是时间上的开发进度,而不是 Git 树。这也不错。 - erikbstack
一致性是关键。指向前进的方向可能对某些人来说更加舒适。 - araqnid

0

只需在中央存储库的相同分支上进行提交,而无需将其拉到本地存储库。然后在本地进行提交并尝试推送。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接