git-rebase:汇聚两个不同的分支/存储库

时间:2011-06-22 15:40:30

标签: git

假设我有以下情况:

User Foo有一个存储库主要版本。用户栏会分叉此存储库,因此两个存储库都处于同步状态。现在,用户栏实现了一个功能,并创建了一个名为“barbranch”的本地分支。当用户Bar完成实现功能时,Foo已提交并将某些内容推送到主存储库。所以情况基本上如下:

A---B---C---D    main repository
         \
          E      forked repository (where C=E)
           \
            F    barbranch on forked repository

现在用户Foo的回购中的东西怎么能恢复正常?

天真的我会说:

# switch to the local master and merge barbranch into it
git checkout master
git pull
git pull upstream
git push
git merge barbranch
# merge conflicts occur
vi somefile
git commit -a
git rebase origin master
# this conflict occurs again
vi somefile
git commit -a
git status # says I'm on (no branch) ?!
git push
g    it checkout master
# conflict occurs again!
vi somefile
git commit -a
git push
# send merge request to user Foo

最后,这给了我三个丑陋的提交,而不是一个。

检查我发现的git rebase --onto ...的git-rebase文档。虽然我无法弄清楚确切的命令是什么,但最终整个过程会是什么样子。

2 个答案:

答案 0 :(得分:2)

我认为以下情况应该适合您的情况。

  • 结账大师
  • 将叉形分支拉入本地主分机
  • 手动修复冲突
  • 提交有关冲突解决的更改
  • 推送到掌握

这实际上会导致3次提交到您的主人(您将提交提交E& F并提交冲突解决方案)。

答案 1 :(得分:2)

这取决于你想要的树。

如果你想要一棵代表真实工作历史的树,你不应该使用“rebase”而只能使用“merge”

# on bar repo
git fetch upstream
git checkout master
git merge upstream/master (fast-forward)
git merge barbranch
# resolve conflicts (adding resolved files)
git commit
git push upstream master

如果你想用rebase“线性化”这项工作,你应该做的就是:

# on bar repo
git fetch upstream
git checkout master
git merge upstream/master (fast-forward)
git checkout barbranch
git rebase master
# resolve conflicts + commits (each commit will be processed separately: so you may need to do that several times if various commits are in conflict with the upstream)
git checkout master
git merge barbranch **(fast-forward after the rebase)**
git push upstream master