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

sds*_*sds 31 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)
Run Code Online (Sandbox Code Playgroud)

我试过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 * ...
Run Code Online (Sandbox Code Playgroud)

所以我用git rebase恢复了 - 我现在在1号广场.

我想要的是:

  1. 将我的7个补丁"导出"到人类可读的差异文件中(la hg导出).
  2. 使我的树成为原点/主人的副本(la hg strip).
  3. 手动逐个重新应用我的7个补丁(la hg import).

我明白git rebase - 继续这样做.我做了它,它确实工作(经过一些手动合并和一个git添加).但是,我希望能够手动执行此操作,因此我想知道上面的hg命令对应的git命令是什么.

谢谢.

PS.请不要告诉我使用带有gitChangeLog文件是愚蠢的.即使是这样,也不适合我.

Pat*_*otz 45

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

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

git format-patch -M @{upstream}
Run Code Online (Sandbox Code Playgroud)

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

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

git reset --hard @{upstream}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用git am- 一次一个或一次全部重新应用补丁.

git am 0001-blah-blah.patch
git am 0002-blah-blah.patch
...
Run Code Online (Sandbox Code Playgroud)

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

git branch scrap
Run Code Online (Sandbox Code Playgroud)

然后将分支重置为上游:

git reset --hard @{upstream}
Run Code Online (Sandbox Code Playgroud)

然后樱桃挑选提交:

git cherry-pick scrap~6
git cherry-pick scrap~5
git cherry-pick scrap~4
...
Run Code Online (Sandbox Code Playgroud)

然后废弃废料分支:

git branch -D scrap
Run Code Online (Sandbox Code Playgroud)

  • 代替"@ {upstream}",您甚至可以使用"@ {u}". (4认同)

Sai*_*esh 17

你试过git merge origin/master吗?

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

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

如何解决Git中的合并冲突?


wil*_*ell 7

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

阅读他在Stackexchange文档中的"解决Git rebase之后的合并冲突".