git rebase
经常在某些分支的上下文中使用。例如,如果我想将 feature
分支的基础移动到 master
分支之上(基于最新的提交)——教程说:
git checkout feature
git rebase master
在这样的教程之后,有很多问题。例如:如何在不 checkout 的情况下执行相同的操作。我如何使用 --onto
选项执行相同的操作。 --onto
和 rebase 有什么区别。我可以传递一系列提交还是必须是整个分支?等等。
我已经阅读了好几遍手册页,但仍然有很大差距。
所以主要问题是:git 如何在不同的场景中解析参数,我应该如何在脑海中解释/想象它们?例如:
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.
最佳答案
完整的 rebase 命令是这样的。
git rebase --onto <onto> <upstream> <branch-to-rebase>
Git 会将 branch-to-rebase
中不在 upstream
中的所有更改放在 onto
之上。
默认是...
- branch-to-rebase:当前分支
- upstream:branch-to-rebase 的跟踪分支
- 到:上游
git checkout 功能; git rebase master
实际上是 git rebase --onto master master 特性
。
您通常希望 onto
和 upstream
相同,但有时对于精密手术而言它们不同很有用。 upstream
和 onto
之间的区别在这个例子中很清楚。
A--B--C--D master
\
E--F--G next
\
H--I--J topic
如果您git rebase master topic
,它将对topic
与master
没有共同点的所有提交进行rebase。所有介入的分支负责人都将被忽略。即 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
,但你想 rebase 到 master
。所以运行 git rebase --onto master next topic
。这将只选择 H、I 和 J。
A--B--C--D master
\ \
\ H'-I'-J' topic
\
E--F--G next
关于需要 Git rebase 参数上下文解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32553077/