116

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

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

4

3 回答 3

149

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

git mergetool

然后添加您的更改并继续

git rebase --continue

祝你好运

于 2012-07-29T14:33:22.433 回答
36

如果你有很多要 rebase 的提交,并且其中的某些部分正在产生冲突,那真的很痛苦。但我可以建议一种鲜为人知的方法来“消除所有冲突”。

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

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

就这样。我们通过隐藏合并做了一个变基。

我还写了一个脚本,所以可以以对话的方式完成,你可以在这里找到它。

于 2019-02-22T09:59:47.600 回答
15

注意:使用 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 期间未能应用补丁是一个常见问题,对于没有经验的用户来说可能非常不稳定。
重要的是引导他们解决冲突(这是一个 3 步过程,因此很复杂),并向他们保证他们可以摆脱他们无法用“ --abort”处理的情况。
这个提交通过详细说明解决过程和避免神秘的 git linguo 回答了这两点。

于 2017-08-12T09:36:18.097 回答