4

在重新设置分支(例如合并到master之前的功能分支)的那一刻,我必须在创建分支时手动查找以告知.git rebaserebase

我有强烈的感觉,这可以自动化 - 有没有办法告诉在创建分支git rebase时开始?

4

4 回答 4

3

假设您正在feature/foo基于分支的master分支上工作。

        F--J--K--|feature/baz|
       /
A--B--D--G--|master|
    \
     C--E--H--|feature/foo|HEAD|

为了rebase工作master,有不同的选择:

  1. 正如remram 所解释的,您可以使用以下命令显式命名目标提交--onto

    // 1.1. Will move the flag `feature/foo`
    git rebase --onto master B feature/foo
    // 1.2. Will not move the flag `feature/foo`
    git rebase --onto master B H
    // 1.3. If the HEAD is at H
    git rebase --onto master B
    

    由于--onto允许您定义目标提交,因此如果您想重新设置不共享公共分支库的基础,它会很有feature/foofeature/baz

    // 1.4. Will rebase `feature/foo` onto `feature/baz`
    git rebase --onto feature/baz B feature/foo
    
                /--|feature/baz|
               /
        F--J--K--C'--E'--H'--|feature/foo|HEAD|
       /
    A--B--D--G--|master|
    
  2. 正如Stefan Fleiter 所解释的,feature/foo如果基于以下内容,则不必命名祖先master

    // 2.1. Explicitly naming feature/foo as the branch to be rebased onto master
    git rebase master feature/foo
    // 2.2. Assuming that feature/foo is currently checked out aka. HEAD
    git checkout feature/foo
    git rebase master
    
  3. 如果你对这个过程感到不舒服,rebase因为你以前的分支feature/foo“消失”cherry-pick了,这对你来说可能是一个感觉良好的选择。该命令允许指定提交范围,其行为与rebase --onto. 不同之处在于,您从中挑选的分支将保持不变。

    // 3.1.1. Start by creating a new branch where master is
    git checkout master
    git checkout -b feature/foo-cherried
    
            F--J--K--|feature/baz|
           /
    A--B--D--G
        \     \
         \     \-|master|feature/foo-cherried|HEAD|
          \
           C--E--H--|feature/foo|
    
    
    // 3.1.2. Pick a range starting at the common branch base
    git cherry-pick B..H
    
            F--J--K--|feature/baz|
           /
    A--B--D--G--C'--E'--H'--|feature/foo-cherried|HEAD|
        \     \
         \     \-|master|
          \
           C--E--H--|feature/foo|
    
    
    // 3.1.3. Later on if everything worked fine you can 
    // delete the unmerged branch feature/foo
    git branch -D feature/foo
    
            F--J--K--|feature/baz|
           /
    A--B--D--G--C'--E'--H'--|feature/foo-cherried|HEAD|
              \
               \-|master|
    

有关git rebase --onto我在这里推荐一篇博文的更多信息:

于 2013-09-18T11:45:27.763 回答
2

对我来说非常有效的就是git rebase master -i.

这假设您 1) 站在要变基的分支上,以及 2) 变基到 master。如果需要,它还允许我编辑每个提交。

于 2018-02-21T09:43:41.337 回答
1

完整的变基语法是git rebase --onto target starting-point mybranch. 如果mybranch省略,将使用当前的。

在大多数情况下,您只需执行git rebase target. 在这种情况下,将使用当前分支 ( mybranch)的最后一个共同祖先target(参见merge-base)。因此,如果您要在它所基于的分支上重新构建功能分支,那么最后一种形式应该可以工作。

另请参阅Git book 中关于 rebase 的页面

于 2013-09-08T17:22:48.053 回答
0

使用 git 重新定义功能分支时,您不必知道共同祖先。只需切换到您的功能分支

    git checkout my-feature-branch

rebase 到 master 或你喜欢的其他分支

    git rebase master

切换回主人

    git checkout master

和(快进)合并功能分支以将主分支中的 HEAD 设置为最新的重新提交。

    git merge my-feature-branch

有关更多详细信息,请查看Pro Git 书中的详细说明。我希望这回答了你的问题。

于 2013-09-08T17:01:02.030 回答