Git推送不能快速合并是什么意思?

时间:2012-08-06 19:06:30

标签: git merge git-merge fast-forward

有人可以提供一个简单的例子,说明什么会导致Git推送到中央仓库失败,因为快进不会发生?为了让这种情况发生,本地回购与中央回购国的状态需要是什么样的呢?真的无法想象这个......

2 个答案:

答案 0 :(得分: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

现在爱丽丝和鲍勃都做了一些工作。每个都对其本地存储库进行不同的更改:

private repos have new commits

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

central repo updated by Alice

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

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

Bob has fetched Alice's commit

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

Bob has merged the commits

获取和合并可以通过两个命令(git fetch后跟git merge)或一个命令(git pull)完成。

现在Bob可以成功推送,因为中央回购会看到新主人将旧主人作为祖先。

Bob pushed the merge

请注意,现在Alice失去了Bob的提交。如果她更多地提交她的回购并试图在从中央仓库撤出之前推送,那么她将获得非快进错误,她将不得不取出并合并修复它,就像鲍勃那样。 / p>

答案 1 :(得分:0)

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