git:分支分歧;如何进行?

时间:2012-01-03 17:23:02

标签: git git-rebase

我的本​​地树与主人分道扬弃:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 7 and 3 different commit(s) each, respectively.
#
nothing to commit (working directory clean)

我尝试了 git pull --rebase 并失败了:

$ git pull --rebase
First, rewinding head to replay your work on top of it...
Applying: * ...
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging ChangeLog
CONFLICT (content): Merge conflict in ChangeLog
Failed to merge in the changes.
Patch failed at 0001 * ...

所以我用 git rebase --abort 还原,我现在在1号广场。

我想要的是:

  1. 将我的7个补丁“导出”到人类可读的差异文件中(la hg export )。
  2. 让我的树成为原点/主人的副本(la hg strip )。
  3. 手动逐个重新应用我的7个补丁(la hg import )。
  4. 我明白 git rebase --continue 可以做到这一点。 我做到了它确实有效(经过几次手动合并和 git add )。 但是,我希望能够手动执行此操作, 所以我想知道上面的 hg 命令对应的 git 命令是什么。

    感谢。

    PS。请不要告诉我使用带 git ChangeLog 文件是愚蠢的。 即使是这样,也不适合我。

4 个答案:

答案 0 :(得分:45)

当然,有几种方法可以手动执行此操作。你仍然会有同样的冲突,因为git基本上是为你做这件事。但如果您想手动执行此操作,可以采取以下几种方法。

首先,将提交导出为一系列补丁。最简单的方法是使用git format-patch

git format-patch -M @{upstream}

将生成7个补丁文件 - 每个提交一个。 (注意“@ {upstream}”是文字的 - 它是git的一个不太知名的特性。)这比捕获git diff的输出更好,因为所有的提交信息(作者,日期,消息,保存。

然后你可以重置你的存储库以匹配上游:

git reset --hard @{upstream}

然后,您可以使用git am重新应用修补程序 - 一次一个或全部一次。

git am 0001-blah-blah.patch
git am 0002-blah-blah.patch
...

第二个选择是在你的工作上创建一个备用分支:

git branch scrap

然后将分支重置为上游:

git reset --hard @{upstream}

然后樱桃挑选提交:

git cherry-pick scrap~6
git cherry-pick scrap~5
git cherry-pick scrap~4
...

然后废弃废料分支:

git branch -D scrap

答案 1 :(得分:17)

您是否尝试过git merge origin/master

您的远程更改存储在分支origin/master中。 (或者,如果你git fetch,它会。)只需合并两个分支 - masterorigin/master - 就像任何两个分支一样,并解决冲突(如果有的话)。

如果你需要知道如何解决git冲突,这可能会有所帮助。

How to resolve merge conflicts in Git?

答案 2 :(得分:7)

Git表示它试图完全按照您的意愿行事(在原始/主人的最新变更之上重新应用补丁)但失败并发生冲突。在git pull --rebase冲突之后立即打开包含冲突文件的编辑器(git status将在“已更改”下列出这些文件)并解决冲突,标记为diff diffua。当您完成解决冲突时git rebase --continue(或git rebase --skip,如果您的决议未引入任何更改)。

了解他的Stackexchange documentation for 'Resolving merge conflicts after a Git rebase'

答案 3 :(得分:0)

以下是对同一问题的一些好的答案(仅在没有冲突解决的情况下):

master branch and 'origin/master' have diverged, how to 'undiverge' branches'?

首先,您可能希望查看远程主服务器上与本地版本相比已更改的内容:

git log HEAD..origin/master

为了解决你的实际问题,它归结为wilhelmtell建议的同一行:

git pull --rebase

正如你所说,你会发生冲突。

解决冲突是一个反复出现的问题。如果您还没有完成,可以查看git mergetool(有关详细信息,请参阅git help mergetool)。要获得图形支持,我建议覆盖merge.tool配置。例如,如果要将meld用于3向合并,则可以使用:

git config --global merge.tool meld

所以在你解决了冲突之后,git pull --rebase做了什么?它将所有更改从origin / master合并到您的本地master,并在其上重放您的更改。恭喜你,你恢复了正常。