6

有人可以提供一个简单的示例,说明由于无法进行快进而导致 Git 推送到中央仓库失败的原因吗?本地回购与中央回购的状态需要是什么样子才能发生这种情况?真的很难想象这个......

4

2 回答 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 正在做一个项目。他们每个人都有一个存储库,并且有一个中央存储库,它们都可以从中推送和拉取。最初,三个存储库如下所示:

初始同步回购

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

私人仓库有新的提交

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

由 Alice 更新的中央仓库

接下来,Bob 尝试推动。中央仓库的主分支指向提交 3。Bob 的推送尝试将其更新为指向提交 4。由于提交 4 没有提交 3 作为祖先,因此需要合并,但git push不会进行真正的合并。它只做“快进”,新主人以旧主人为祖先。所以 Bob 得到了错误,因为他试图推动一些需要真正合并的东西,而不是快进。

要成功推送,Bob 必须首先从中央仓库获取新的提交:

Bob 获取了 Alice 的提交

并且他必须将他的更改(commit #4)与 Alice 的更改(commit #3)合并,创建一个将两个提交都作为祖先的新提交:

Bob 已合并提交

提取和合并可以在两个命令(git fetch后跟git merge)或一个命令(git pull)中完成。

现在 Bob 可以推送成功了,因为中央 repo 看到新的 master 有旧的 master 作为祖先。

Bob 推动了合并

请注意,现在 Alice 缺少 Bob 的提交。如果她对她的 repo 进行更多提交并在从中央 repo 拉出之前尝试推送,她将得到非快进错误,她将不得不获取并合并来修复它,就像 Bob 所做的那样。

于 2012-08-06T20:15:41.477 回答
0

只需在同一分支上的中央仓库上提交,而无需拉到本地仓库。然后在本地提交并尝试推送。

于 2012-08-06T19:59:58.477 回答