假设我有以下情况:
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文档。虽然我无法弄清楚确切的命令是什么,但最终整个过程会是什么样子。
答案 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