【问题标题】:Do I need to perform a commit after a rebase?我需要在变基后执行提交吗?
【发布时间】:2010-04-22 09:33:37
【问题描述】:

我刚刚将一个特性分支重新定位到另一个特性分支上(准备将所有内容重新定位到我的主人的头部),它涉及到相当多的棘手合并解决方案。

rebase 是否会自动保存为某处的提交?

这些修改在哪里?我在 gitk 或 git log --oneline 中看不到任何内容。

(当我在变基后合并回我的分支时,同样的问题。)

【问题讨论】:

    标签: git rebase


    【解决方案1】:

    Rebase 将提交移至另一个分支之上。如果移动的提交导致合并冲突,则更改此提交以反映合并解决方案。

    rebase 的目的是让你的提交看起来像是对你 rebase 的分支的更改。所以最合乎逻辑的方法是将合并冲突合并到这些提交中。因此不需要额外的提交。

    Merge 是不同的,因为它是将分歧的分支合并在一起的显式操作。每个分支中的提交都没有更改。冲突解决反映在合并提交中。

    【讨论】:

      【解决方案2】:

      是的,成功的变基和合并会提交。他们只是不会提交存在需要解决的冲突,但是变基(或合并)的输出会告诉您这已经发生以及如何解决它。

      对于rebase,你只需要解决索引中的冲突,然后git rebase --continue。

      对于合并,您需要进行提交 (git commit),但系统会记住合并的事实,并会提供合适的默认提交消息供您编辑。

      【讨论】:

      • 这是我需要的答案——简明扼要。我很欣赏他们的附加价值的长期努力,但他们真的应该至少在一开始就包括上面的文字。当我变得更大胆时,我想我会开始编辑答案,以便排名最高的答案也简洁地包含“答案”......无论如何,想感谢你以我需要的方式回答。
      【解决方案3】:

      在过去(2006 年,1.5.3 之前和its user manual),git rebase 是presented like so:

      cherry-picking 的一个特例是如果你想移动整个分支 到较新的“基础”提交。
      这是由git-rebase 完成的。
      您指定要移动的分支(默认HEAD)以及将其移动到的位置(无默认), 和:

      • git cherry-picks 该分支的每个补丁,
      • 将其应用到目标之上,
      • 并将refs/heads/<branch> 指针移动到新创建的提交。

      所以根据定义,将进行提交(并且不需要进行提交)

      rebase 的一种特殊情况是当您想要划分工作、移动(并重新创建新的)提交时。
      来自同一个教程(作为 rebase 后不需要任何进一步提交的说明):

      假设您在当前的 HEAD 中混合了两个功能的开发,一个名为“dev”的分支。

      x-x-x-x  (master)
             \ 
              -f1a-f1b-f1c-f2a-f2b-f2c (dev, HEAD)
      

      你想把它们分成“dev1”和“dev2”。假设 HEAD 是 master 的一个分支,那么你可以查看

      git log master..HEAD
      

      或者只是获取提交的原始列表

      git rev-list master..HEAD
      

      无论哪种方式,假设您在dev1 中找出您想要的提交列表并创建该分支:

      git checkout -b dev1 master
      for i in `cat commit_list`; do
          git-cherry-pick $i
      done
      
              -f1a'-f1b'-f1c' (dev1, HEAD)
             /
      x-x-x-x  (master)
             \ 
              -f1a-f1b-f1c-f2a-f2b-f2c (dev)
      

      您可以使用您编辑的列表的另一半来生成 dev2 分支,但如果您不确定是否忘记了某些内容,或者只是不想做那种手动工作,那么您可以使用git-rebase 为你做这件事。

      git checkout -b dev2 dev    # Create dev2 branch
      git-rebase --onto master dev1   # Subreact dev1 and rebase
      

      这将找到所有在dev 而不是dev1 的补丁,将它们应用到master 之上,然后调用结果dev2。

              -f1a'-f1b'-f1c' (dev1, HEAD)
             /
      x-x-x-x  (master)
             \ 
              -f2a-f2b-f2c (dev2, HEAD)
      

      【讨论】:

      • 哇!这在两种意义上都令人兴奋(非常强大,而且很难让我头脑清醒)
      猜你喜欢
      • 2014-04-13
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多