git rebase合并冲突

时间:2012-07-29 14:11:12

标签: git github git-rebase

我分叉了一个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".

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

3 个答案:

答案 0 :(得分:83)

重新定位可能是一个真正令人头疼的问题。您必须解决合并冲突并继续重新定位。例如,您可以使用合并工具(根据您的设置而有所不同)

git mergetool

然后添加并提交您的更改并继续

git rebase --continue
祝你好运

答案 1 :(得分:23)

如果在rebase期间发生冲突,您有三种选择:

  • 您可以运行git rebase --abort来完全撤消rebase。 Git会让你回到你的分支状态,就像调用git rebase之前一样。

  • 您可以运行git rebase --skip来完全跳过提交。这意味着 没有任何由有问题的提交引入的更改将被包括在内。您很少选择此选项。

  • 你可以解决冲突,正如iltempo所说。完成后,您需要致电git rebase --continue。我的mergetool是kdiff3,但还有更多可用于解决冲突的东西。您只需要在git的设置中设置合并工具,以便在致电git mergetool https://git-scm.com/docs/git-mergetool

  • 时调用它

如果以上都不适合你,那就去散步再试一次:)

答案 2 :(得分:2)

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

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

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

仅此而已。我们通过隐藏合并进行了重新设置。

我还编写了一个脚本,因此可以通过对话的方式来完成,您可以找到它here