需要Git rebase参数上下文解释

时间:2015-09-13 18:27:22

标签: git github

在某些分支的上下文中经常使用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.

2 个答案:

答案 0 :(得分:7)

完整的rebase命令就是这个。

git rebase --onto <onto> <upstream> <branch-to-rebase>

Git将对branch-to-rebase中不属于upstream的所有更改进行处理,并将其置于onto之上。

默认值为......

  • branch-to-rebase :当前分支
  • 上游:branch-to-rebase的跟踪分支
  • :upstream

git checkout feature; git rebase master确实是git rebase --onto master master feature

您通常希望ontoupstream相同,但有时对于精细手术来说它们有所不同是有用的。在此示例中,upstreamonto之间的区别很明显。

           A--B--C--D master
               \
                E--F--G next
                       \
                        H--I--J topic

如果您git rebase master topic,它会重新定义topicmaster没有共同的所有提交。所有介入的分支头都将被忽略。那是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

如果您只想提交从nexttopic的提交,该怎么办?这是--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 man page

  • git rebase mastermaster之上重新定位当前分支(意味着master已签出,当前分支重置为master,其提交已重新定位在顶部它)。

考虑当前分支是测试分支:

A -- B -- C -- D -- E -- Z' -- W' (test-branch)
                 (master)
  • git rebase feature mastermaster之上重播feature次提交(很少见,最佳做法是反其道而行)

那是:

A -- B
      \
       1 -- 2 -- 3 -- C' -- D' -- E' (master)
              (feature)
  • git rebase --onto master feature会将功能之后的所有提交移至新基座master之上的当前分支。
    由于featuretest-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)到新基地@