假设我有以下三个提交记录:
bb8d6cc3c7
aa213lk321
f0j9123r9j
我想对每一个提交记录执行交互式变基。唯一我能想到的方法是为每个提交记录键入 git rebase -i 'commit_hash'
并一个一个地进行变基。
有没有一种更简单的方式可以一次性变基所有提交记录,类似于:
git rebase -i 'commit_hash_1' 'commit_hash_2' 'commit_hash_3'
?
1. bb8d6cc3c7 <- This is the HEAD or latest commit
2. aa213lk321
3. f0j9123r9j
命令
git rebase -i HEAD~3
,如果上述三个提交是连续的
那么你需要选择 pick bb8d6cc3c7
并通过输入 s
来压缩其他两个提交,这意味着压缩。
如果提交不是连续的,则只需执行 git rebase -i
,这将打开一个编辑器,您选择一个提交并在其上压缩其他两个提交。
注意:此答案取决于 git rebase 打开的文本编辑器的功能。我使用的是 vim,它可以工作。
假设我们在一个名为 my-branch-base
的修订版(即分支或标签)之上有一系列提交,这些提交在分支 my-branch
中。
my-branch
)my-branch-base
)在这个范围内,有一些提交需要编辑:
git log -G"MyFunction"
)。我将展示如何通过命令选择它们。git log
选择要编辑的提交,git需要对它们进行引用。)
git branch -c my-branch my-branch-prerebase
git rebase --interactive my-branch-base
打开您配置的编辑器并使用以下内容:
选择a8d737b50 {提交信息}
选择bb8d6cc3c7 {提交信息}
选择79a2e5cc5 {提交信息}
选择fec125378 {提交信息}
选择193cf566b {提交信息}
选择aa213lk321 {提交信息}
选择f0j9123r9j {提交信息}
选择ea781de38 {提交信息}
选择61785bd55 {提交信息}
在由git rebase
启动的编辑器中打开第二个缓冲区,其中包含修订选择命令的输出或要编辑的哈希文件。
在vim中,您可以执行以下操作:
(注意,您需要将my-branch-prerebase
指定给git log
,因为HEAD
现在指向my-branch-base
,而git log
不会选择任何适用的提交哈希。):
:vsplit
:enew
:r !git log --oneline -G"MyFunction" my-branch-prerebase
:%s/\v(\x{7,9}).*\n/\1|/
\n
会将多行连接成一行。
在vim中,我们将其复制到寄存器中,然后通过CTRL+r粘贴到minibuffer中。
返回到rebase操作的缓冲区。搜索并替换匹配所选提交哈希的行中的'pick'为'edit'。
在vim中:
:g/\vbb8d6cc3c7|aa213lk321|f0j9123r9j/ :s/pick/edit/
git rebase
开始重新定位,并停止在标记的提交上。如果你有master
分支和some-feature
分支。
如果有人更新了master
分支,而你想要将some-feature
分支变基,...
只需要
git checkout some-feature
git rebase -i master
所有some-feature
的提交已经合并到主分支
git rebase
适用于连续提交的范围。如果您的提交不是连续的,则您要查找的命令是git cherry-pick
。 - axiac