繁体   English   中英

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

[英]git pull merge conflicts from fully merged branch

这不是一个重复的git pull从干净的目录有合并冲突 - 在那个问题中,用户试图从一个提交不同于本地分支的远程提取。 在我的情况下,遥控器上没有提交,也不在我的本地分支中。

首先,这是我的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>

正如预期的那样,我的本地项目分支中没有任何东西丢失。 本地分支完全合并。 现在我在推送我的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的历史是新的和不同的,需要在拉动时合并到项目中(即使它不包含新的提交)。 这可能是这种情况吗? 我该如何解决这个问题?

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

你有git pull set来做一个自动rebase (而不是自动合并),所以这是粗略的git fetch; git rebase project origin/project git fetch; git rebase project origin/project

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

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

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

使用git pull并不能保证你是最快的并且“赢得”“推动竞赛”,这只是在观察错误后进行“获取,然后合并或重组”步骤的便捷方式。 你可以简单地尝试推送,看看你是否得到错误...如果是这样,使用git fetch而不是git pull ,然后自己决定如何处理“失去”“推挤竞赛”。


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

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

基本上我的建议是:

git checkout -b project_1 origin/project
git merge project

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM