git rebase合并冲突


91

我分叉了一个github仓库,并从事我的github仓库。
我已经提出请求,它已经完成。

在那之后上游有更多的提交,所以现在我想重新设定基准,我想那就是我要做的。
但是我遇到了这些合并冲突:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

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

我不知道如何解决这些问题,请帮忙。


看看我在这篇文章中的回答:stackoverflow.com/questions/48307297/…–
Abhishek

Answers:


121

变基础可能是一个真正的头痛。您必须解决合并冲突并继续重新定级。例如,您可以使用合并工具(具体取决于您的设置)

git mergetool

然后添加您的更改并继续

git rebase --continue

祝好运


2
是的,重新定购是头痛的事情,我可以使用git pull上游大师吗?
pahnin

2
是的,您可以尝试一下。区别在于,您的提交不会放在上游的提交之上。合并冲突可能会更少。
iltempo 2012年

7
@iitempo您不需要进行提交。只需添加一个git就足以使重新设置继续进行。
enigmaticPhysicist

45

当您在重新定基期间遇到冲突时,可以使用以下三种选择:

  • 您可以运行git rebase --abort以完全撤消变基。Git将使您返回到分支的状态,就像调用git rebase之前一样。

  • 您可以运行git rebase --skip以完全跳过提交。这意味着不会包含有问题的提交所引起的任何更改。您很少选择此选项。

  • 您可以按照iltempo所说的解决冲突。完成后,您需要致电git rebase --continue。我的mergetool是kdiff3,但是还有更多可以用来解决冲突的工具。您只需要在git的设置中设置合并工具,即可在调用https://git-scm.com/docs/git-mergetool时调用它git mergetool

如果以上方法都不适合您,请散步并重试:)


2
是的,但是如何解决冲突?这就是问题。“解决冲突”和“完成时”之间是什么?
KansaiRobot

@KansaiRobot一种完成手动修复的方法:在文本编辑器中打开有冲突的文件,然后查找<<<<<
旋转

16

如果您有很多要重新设置的提交,而其中有一部分正在产生冲突,那确实很痛苦。但是我可以建议一种鲜为人知的方法来“解决所有冲突”。

首先,签出临时分支并开始标准合并

git checkout -b temp
git merge origin/master

您将必须解决冲突,但是只有一次,只有真正的冲突。然后暂存所有文件并完成合并。

git commit -m "Merge branch 'origin/master' into 'temp'"

然后返回到您的分支(将其设置为alpha)并开始变基,但会自动解决所有冲突。

git checkout alpha
git rebase origin/master -X theirs

分支已经重新设置了基础,但是项目可能处于无效状态。没关系,我们还有最后一步。我们只需要恢复项目状态,因此将与分支“ temp”上的状态完全相同。从技术上讲,我们只需要通过低级命令git commit-tree复制其(文件夹状态)。加上合并到当前创建的分支中的提交。

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

并删除临时分支

git branch -D temp

就这样。我们通过隐藏合并进行了重新设置。

我也写了一个脚本,因此可以通过对话的方式完成,您可以在这里找到它。


13

注意:使用Git 2.14.x / 2.15(2017年第三季度)时,git rebase发生冲突时的消息将更加清晰。

参见William Duclot()的commit 5fdacc1(2017年7月16日(由Junio C Hamano合并--076eeec提交中,2017年8月11日)williamdclt
gitster

rebase:为没有经验的用户提供更清晰的解决消息

之前:

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"

后:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

可以通过向错误消息提供帮助的方式来改进git UI:经验不足和临时的git用户。
为此,确保此部分用户可以理解这些消息中使用的术语是有帮助的,并且可以指导他们解决问题。

特别是,在git rebase期间无法应用补丁程序是一个常见问题,对于没有经验的用户来说可能会非常不稳定。
重要的是要引导他们解决冲突(这是一个三步过程,因此很复杂),并向他们保证他们可以逃脱无法使用“ --abort”处理的情况。
此提交通过详细说明解析过程并避免使用晦涩的git linguo来回答这两点。


1
真好!帮助页面说通过提交更改来解决冲突,但是没有!在这里,我们需要跳过提交,而是继续合并!(帮助页面:help.github.com/articles/…
Jerther
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.