我的本地树与主人分道扬弃:
$ 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号广场。
我想要的是:
我明白 git rebase --continue 可以做到这一点。 我做到了它确实有效(经过几次手动合并和 git add )。 但是,我希望能够手动执行此操作, 所以我想知道上面的 hg 命令对应的 git 命令是什么。
感谢。
PS。请不要告诉我使用带 git 的 ChangeLog 文件是愚蠢的。 即使是这样,也不适合我。
答案 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
,它会。)只需合并两个分支 - master
和origin/master
- 就像任何两个分支一样,并解决冲突(如果有的话)。
如果你需要知道如何解决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,并在其上重放您的更改。恭喜你,你恢复了正常。