将提交的大块移动到单个rebase中的另一个提交

时间:2014-05-14 07:42:36

标签: git

使用GIT,我想将一个提交的大块移动到另一个,同时使用单个交互式rebase自动保留提交元数据。

例如,有这两个提交:

首先提交X:

  context
+ foo
  context

第二次提交Y:

  context
+ bar
  context
+ baz
  context

我想将bar块从提交Y移动到先前的提交X,而不必手动重置作者,提交者,日志等。

我能想到的最简单的方法需要2个互动的基础:

  1. 第一个rebase:将Y提交分为Z(bar)和Y'(baz),最后一个使用commit -c Y保留元数据。
  2. 第二次变换:将X和Z一起压入X',并按原样保留Y'。
  3. 哪会留下这个结果: 首先提交X'(与X相同的元数据):

      context
    + foo
      context
    + bar
      context
    

    第二次提交Y'(与Y相同的元数据):

      context
    + baz
      context
    

1 个答案:

答案 0 :(得分:1)

我很确定他们都在同一个分支上。使用git diffgit applygit add --patch

git rebase -i $theolderofthetwo^ branch-with-X-and-Y

编辑:上面有可怕的错误,它实际上做了它应该做的事情。)

标记X提交以进行编辑。如果Y提交较旧,请将其标记为编辑。

如果Y提交较旧,

git diff HEAD HEAD^ -- foobarbaz | git apply
git add --patch
git checkout -- foobarbaz
git commit --amend; git rebase --continue

在X提交中(无论它在哪里):

git diff Y^! -- foobarbaz  | git apply
git add --patch
git checkout -- foobarbaz
git commit --amend; git rebase --continue

如果Y提交更新,当rebase到达它时,Hunk已经在X'中没有必要进行编辑,Y'将没有那个大块 - 或者更确切地说,有那个大块头,它不会是一个差异


无论如何都要保留作者姓名和日期。