git pull合并完全合并分支的冲突

时间:2013-11-27 23:22:41

标签: git version-control merge rebase

这不是git pull from clean directory has merge conflicts的重复 - 在该问题中,用户试图从具有不在本地分支中的提交的远程提取。在我的情况下,遥控器上没有提交,这些提交也不在我当地的分支机构中。

对于初学者来说,这是我的git状态:

asj@asj] git fetch
asj@asj] git status
# On branch project
# Your branch is ahead of 'origin/project' by 17 commits.
#   (use "git push" to publish your local commits)
#
nothing to commit, working directory clean

正如你所看到的,我在我自己的项目分支上,在原点/项目之前提交了17个提交。当我运行git log作为差异时,它列出了项目中17个不在源/项目中的提交:

asj@asj] git log project ^origin/project
<shows all 17 commits>

到目前为止一切顺利,现在我检查原始/项目中尚未进入项目的提交:

asj@asj] git log origin/project ^project
<shows nothing>

正如预期的那样,我的本地项目分支中缺少遥控器上的 nothing 。本地分支完全合并。现在我在推送我的17次提交之前运行git pull作为最佳实践。我希望这告诉我,我已经是最新的了:

asj@asj] git pull
First, rewinding head to replay your work on top of it...
Applying: SomeEarlierChange
Using index info to reconstruct a base tree...
M       SomeFile
Falling back to patching base and 3-way merge...
Auto-merging SomeFile
CONFLICT (content): Merge conflict in SomeFile
Failed to merge in the changes.
Patch failed at 0001 SomeEarlierChange
The copy of the patch that failed is found in:
   SomeDirectory/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

这不是我的预期。当我一起玩并解决SomeFile中的冲突然后git rebase - 继续它会在更多文件中出现更多冲突。我经历了几次迭代,继续沿着这个兔子洞走下去,但我不认识到我看到的任何变化或它们可能来自哪里。我已经完成了整个过程几次,并且总是最终运行git rebase --abort并返回到本文开头所描述的情况。

我想简单地将这17个新提交的更改推送到远程,因为项目迫切需要这些更改。但是,我担心这会导致更多神秘的冲突,而且我最终会花一整天时间修复远程分支而不是本地分支。在推动之前,我想解决一下我遇到的困难。

我能想到的唯一相关的事情是本地分支上的一些提交是从第三个分支合并而来的。这些提交可能与项目和原产地/项目之间的历史相冲突吗?我担心git现在认为origin / project的历史是新的和不同的,需要在拉动时合并到项目中(即使它不包含新的提交)。这可能是这种情况吗?我该如何解决这个问题?

关于这里可能会发生什么的任何其他想法?

2 个答案:

答案 0 :(得分:1)

您已将git pull设置为自动rebase(而不是自动合并),因此这相当于git fetch; git rebase project origin/project

如果你的所有提交都是线性的,那么在git fetch没有引入任何新提交之后,rebase将是一个no-op,你会收到Current branch project is up to date.消息。但是,正如您所说,您的提交包括另一个分支的合并提交。这是事情出错的地方,因为rebase试图平息合并。 (如果你要使用--preserve-merges进行变基,那可能就行了。)

这里要认识到的主要事情是不需要在这里运行git pull 。 Pull只是fetch-then-merge(如果配置为rebase,则为fetch-then-rebase,就像你的那样)。这里的想法是确保你拥有来自遥控器的所有提交。完成后,您可以git push将它们返回到遥控器,结果将是遥控器的快进操作。

唯一一次快进是指其他人潜入之前,您可以git push并将他们的提交添加到远程存储库中。 1 在这种情况下,您必须git fetch他们的提交,然后以某种方式将它们与您的提交相结合(通常是rebase或合并 - 即,git pull做什么!),然后重试你的推动。如果这种情况发生在十秒内,而第三组在9秒或更短的时间内推送新的提交,则会再次出现“非快进”错误,并且必须重复此过程(如果你的速度较慢,可能会永远重复比其他人都多,但在实践中这很快收敛了。)

使用git pull并不能保证你是最快的并且“赢得”“推动竞赛”,这只是一种方便的方法来完成“获取,然后合并或重组”之后所需的步骤观察错误。您可以简单地尝试推送并查看是否收到错误...如果是,请使用git fetch而不是git pull,然后自行决定如何处理“丢失”“推送竞赛”


1 好吧,有一两个其他情况,当有人强行推送“倒带”或“重置”分支名称,或删除并重新创建分支,或重命名它,或者通常会导致整个branch-name-to-commit-ID映射以某种不寻常/意外的方式发生变化。但这些都不是正常情况,除非提前谈判(有些项目有特定的“可重置”分支,你不应该依赖于“正确”行为,用git术语)。

答案 1 :(得分:1)

您是否尝试过创建新的跟踪分支并在那里合并您的提交?

基本上我的建议是:

git checkout -b project_1 origin/project
git merge project

您可以在合并时使用--squash选项来同时支持所有17次提交。