我需要在rebase之后执行提交吗?

时间:2010-04-22 09:33:38

标签: git rebase

我刚刚将一个功能分支重新设置到另一个功能分支上(准备将所有内容重新设置为我的主人),它涉及了一些棘手的合并解决方案。

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

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

(同样的问题,我在重新定位后合并我的分支。)

3 个答案:

答案 0 :(得分:8)

Rebase正在另一个分支上移动提交。如果移动的提交导致合并冲突,则更改此提交以反映合并解析。

rebase的目的是让你的提交看起来好像它们是你重新加入的分支的变化。因此,最合乎逻辑的方法是将合并冲突合并到这些提交中。因此,不需要额外的提交。

合并是不同的,因为它是将不同分支合并在一起的明确行为。每个分支中的提交都不会更改。冲突解决方案反映在合并提交中。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

在过去(2006年,1.5.3和its user manual之前),git rebasepresented 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是主分支,那么你可以查看

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中的所有修补程序,将其应用于主数据库,并调用结果dev2

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