pick c ...
pick a ...
squash d ...
squash e ...
squash g ...
pick b
squash f
现在历史应该是这样的:
c - [a+d+e+g] - [b+f] (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
现在,让我们获取branchB新压缩的提交b+f。
git checkout branchB
git cherry-pick branchA # cherry-pick one commit, the tip of branchA
而同样的a+d+e+g为主:
git checkout master
git cherry-pick branchA^
最后,更新branchA,使其指向c:
git branch -f branchA branchA^^
我们现在应该:
c (branch A) - [a+d+e+g] - [b+f] (dangling commits)
/
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master)
\
x-x-x-x-x-[b+f] (branchB)
请注意,如果您有多个提交要在分支之间移动,您可以再次使用rebase(非交互式):
# create a temporary branch
git branch fromAtoB branchA
# move branchA back two commits
git branch -f branchA branchA~2
# rebase those two commits onto branchB
git rebase --onto branchB branchA fromAtoB
# merge (fast-forward) these into branchB
git checkout branchB
git merge fromAtoB
# clean up
git branch -d fromAtoB
最后,免责声明:很有可能重新排列提交的顺序会导致一些提交不再适用,这可能是因为你选择了一个错误的顺序(在提交之前放置一个补丁来引入它所修补的特性);在这种情况下,您将需要中止rebase(git rebase --abort)。否则,您将不得不智能地修复冲突(就像您处理合并冲突一样),添加修复,然后运行git rebase --continue继续。这些说明也在冲突发生时打印的错误消息中提供。
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git status
On branch master
nothing to commit, working tree clean
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
a6e3c6a (HEAD -> master) Fourth commit
9a24b81 Third commit
7bdfb68 Second commit
186d1e0 First commit
我想重新排序提交9a24b81(第三次提交)和7bdfb68(第二次提交)。为此,我首先找到要更改的第一次提交之前的提交。这是提交186d1e0(第一次提交)。 要执行的命令是git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE,在本例中:
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git rebase --interactive 186d1e0
这将在默认编辑器中打开一个包含以下内容的文件:
pick 7bdfb68 Second commit
pick 9a24b81 Third commit
pick a6e3c6a Fourth commit
# Rebase 186d1e0..a6e3c6a onto 186d1e0 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
5条答案
按热度按时间mum43rcc1#
您要查找的命令是
git rebase
,特别是-i/--interactive
选项。我假设你想把提交c留在分支A上,你的意思是你想把其他提交移到其他分支,而不是合并,因为合并是直接的。让我们从操作分支A开始。
^
表示上一次提交,所以这个命令要求用“a”之前的提交作为基础来重定分支A的根。Git会给你一个在这个范围内的提交列表,重新排序并告诉git压缩相应的提交:现在历史应该是这样的:
现在,让我们获取branchB新压缩的提交b+f。
而同样的a+d+e+g为主:
最后,更新branchA,使其指向c:
我们现在应该:
请注意,如果您有多个提交要在分支之间移动,您可以再次使用rebase(非交互式):
最后,免责声明:很有可能重新排列提交的顺序会导致一些提交不再适用,这可能是因为你选择了一个错误的顺序(在提交之前放置一个补丁来引入它所修补的特性);在这种情况下,您将需要中止rebase(
git rebase --abort
)。否则,您将不得不智能地修复冲突(就像您处理合并冲突一样),添加修复,然后运行git rebase --continue
继续。这些说明也在冲突发生时打印的错误消息中提供。0yycz8jy2#
其中
3
是需要重新排序的提交数(source)。这将打开vi,列出从oldest(顶部)到newest(底部)的提交。
现在重新排序行,保存,并退出编辑器。
ddp
将当前行 * 下移 *ddkP
将当前行上移 *(source)2w2cym1i3#
git rebase --interactive
是所需的命令。示例:
当前状态为:
我想重新排序提交
9a24b81
(第三次提交)和7bdfb68
(第二次提交)。为此,我首先找到要更改的第一次提交之前的提交。这是提交186d1e0
(第一次提交)。要执行的命令是
git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE
,在本例中:这将在默认编辑器中打开一个包含以下内容的文件:
注意文件中提交的顺序与git log相反,在git log中,最近的提交在顶部,而在这个文件中,最近的提交在底部。
正如文件底部的注解所解释的,我可以做很多事情,比如压缩、丢弃和重新排序提交。为了重新排序提交,我编辑了文件,使其看起来像这样(底部的注解没有显示):
每行开头的
pick
命令表示“使用(即包含)this commit”,当我保存包含rebase命令的文件并退出编辑器时,git会执行命令并更新仓库和工作目录:请注意重写的提交历史记录。
链接:
z4bn682m4#
如果你想重新排序只有最后两次提交,你可以使用这个
git reorder
别名:https://stackoverflow.com/a/33388211/3385814c8rllxm5#
git rebase是您想要的。请查看--interactive选项。