git自创建以来一个分支

时间:2013-09-08 15:28:34

标签: git rebase git-rebase

当在合并到 master 之前重新定位分支(例如功能分支)时,我必须在创建分支时手动查找以告知{{1 } git rebase的起点。

我强烈认为这可以自动化 - 有没有办法告诉rebase在创建分支时启动?

4 个答案:

答案 0 :(得分:3)

假设您正在处理基于feature/foo分支的分支master

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

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

  1. 作为explained by 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/foo重新绑定到不共享公共分支库的feature/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. 作为explained by 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|
    
  4. 有关git rebase --onto的更多信息,请在此处推荐博客文章:

答案 1 :(得分:1)

完整rebase语法为git rebase --onto target starting-point mybranch。如果省略mybranch,则将使用当前的那个。

在大多数情况下,您可以git rebase target。在这种情况下,将使用当前分支(mybranch)和target的最后一个共同祖先(请参阅merge-base)。所以,如果你在它所基于的分支上重新定义一个特征分支,那么最后一个形式应该可以工作。

另请参阅page on rebase from the Git book

答案 2 :(得分:0)

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

    git checkout my-feature-branch

改装为主人或其他你喜欢的分支

    git rebase master

切换回主人

    git checkout master

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

    git merge my-feature-branch

有关详细信息,请查看Pro Git手册中的detailed explanation。 我希望这能回答你的问题。

答案 3 :(得分:0)

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

这假设你是1)站在你想要变基的分支上,2)变成主人。如果需要,它还允许我编辑每个提交。