在某些分支的上下文中经常使用git rebase
。例如,如果我想在feature
分支的基础上移动master
分支的基础(基于最新提交) - 教程说:
git checkout feature
git rebase master
在这样的教程之后,有很多问题。例如:如何在不签出的情况下执行相同的操作。如何使用--onto
选项执行相同的操作。 --onto
和rebase之间有什么区别。我可以通过一系列提交,还是必须是整个分支?等。
我已多次阅读手册页但仍有很大差距。
所以主要问题是: git如何解析不同场景中的args以及我应该如何解释/想象它们在我脑海中?例如:
git rebase master
git rebase feature master
git rebase --onto master feature
git rebase HEAD~4 HEAD~2
git rebase --onto HEAD~4 HEAD~2
我们假设我们有以下回购:
Z -- W (HEAD, test-branch*)
A -- B -- C -- D -- E (master)
\
1 -- 2 -- 3 (feature)
test-branch is checked out.
答案 0 :(得分:7)
完整的rebase命令就是这个。
git rebase --onto <onto> <upstream> <branch-to-rebase>
Git将对branch-to-rebase
中不属于upstream
的所有更改进行处理,并将其置于onto
之上。
默认值为......
git checkout feature; git rebase master
确实是git rebase --onto master master feature
。
您通常希望onto
和upstream
相同,但有时对于精细手术来说它们有所不同是有用的。在此示例中,upstream
和onto
之间的区别很明显。
A--B--C--D master
\
E--F--G next
\
H--I--J topic
如果您git rebase master topic
,它会重新定义topic
与master
没有共同的所有提交。所有介入的分支头都将被忽略。那是E,F,G,H,I和J.由于onto
默认为upstream
,它会将这些放在master
上。你会结束这件事。
A--B--C--D master
\ \
\ E'-F'-G'-H'-I'-J' topic
\
E--F--G next
如果您只想提交从next
到topic
的提交,该怎么办?这是--onto
变得有用的地方。告诉Git上游是next
,但你要重新登上master
。所以运行git rebase --onto master next topic
。这将只选择H,I和J.
A--B--C--D master
\ \
\ H'-I'-J' topic
\
E--F--G next
答案 1 :(得分:1)
git rebase master
在master
之上重新定位当前分支(意味着master
已签出,当前分支重置为master
,其提交已重新定位在顶部它)。考虑当前分支是测试分支:
A -- B -- C -- D -- E -- Z' -- W' (test-branch)
(master)
git rebase feature master
在master
之上重播feature
次提交(很少见,最佳做法是反其道而行)那是:
A -- B
\
1 -- 2 -- 3 -- C' -- D' -- E' (master)
(feature)
git rebase --onto master feature
会将功能之后的所有提交移至新基座master
之上的当前分支。
由于feature
和test-branch
不相关,因此不会移动任何提交。
git rebase HEAD~4 HEAD~2
将当前分支重置为@~2
对于像test-branch
这样的Z -- Y -- X -- W
,这意味着Z -- Y
git rebase --onto HEAD~4 HEAD~2
会从当前分支中删除@~3
和@~2
,因为它会在 @~2
之后重播中的所有提交(即{{1} }}和@~1
)到新基地@
。