使用GIT,我想将一个提交的大块移动到另一个,同时使用单个交互式rebase自动保留提交元数据。
例如,有这两个提交:
首先提交X:
context
+ foo
context
第二次提交Y:
context
+ bar
context
+ baz
context
我想将bar
块从提交Y移动到先前的提交X,而不必手动重置作者,提交者,日志等。
我能想到的最简单的方法需要2个互动的基础:
bar
)和Y'(baz
),最后一个使用commit -c Y
保留元数据。哪会留下这个结果: 首先提交X'(与X相同的元数据):
context
+ foo
context
+ bar
context
第二次提交Y'(与Y相同的元数据):
context
+ baz
context
答案 0 :(得分:1)
我很确定他们都在同一个分支上。使用git diff
,git apply
和git 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'将没有那个大块 - 或者更确切地说,将有那个大块头,它不会是一个差异
无论如何都要保留作者姓名和日期。