如何对一系列提交进行变基操作?

6

假设我有以下三个提交记录:

  • bb8d6cc3c7
  • aa213lk321
  • f0j9123r9j

我想对每一个提交记录执行交互式变基。唯一我能想到的方法是为每个提交记录键入 git rebase -i 'commit_hash' 并一个一个地进行变基。

有没有一种更简单的方式可以一次性变基所有提交记录,类似于:

git rebase -i 'commit_hash_1' 'commit_hash_2' 'commit_hash_3' ?


1
git rebase 适用于连续提交的范围。如果您的提交不是连续的,则您要查找的命令是 git cherry-pick - axiac
1
你使用的 Git 版本是否在提交哈希值中使用了非十六进制字符,还是这只是一个例子? - Kasper van den Berg
3个回答

4
这是您想要压缩的提交列表。
1. bb8d6cc3c7 <- This is the HEAD or latest commit
2. aa213lk321
3. f0j9123r9j

命令

git rebase -i HEAD~3,如果上述三个提交是连续的

那么你需要选择 pick bb8d6cc3c7 并通过输入 s 来压缩其他两个提交,这意味着压缩。

如果提交不是连续的,则只需执行 git rebase -i,这将打开一个编辑器,您选择一个提交并在其上压缩其他两个提交。


1

注意:此答案取决于 git rebase 打开的文本编辑器的功能。我使用的是 vim,它可以工作。

假设我们在一个名为 my-branch-base 的修订版(即分支或标签)之上有一系列提交,这些提交在分支 my-branch 中。

  • a8d737b50 (my-branch
  • bb8d6cc3c7
  • 79a2e5cc5
  • fec125378
  • 193cf566b
  • aa213lk321
  • f0j9123r9j
  • ea781de38
  • 61785bd55
  • 04428cafd (my-branch-base

在这个范围内,有一些提交需要编辑:

  • bb8d6cc3c7
  • aa213lk321
  • f0j9123r9j
也许它们来自文件,也许它们来自命令(例如git log -G"MyFunction")。我将展示如何通过命令选择它们。
复制您的分支HEAD pre rebase。
(原因:如果rebase不按您的意图进行,您将有一个备份;如果您通过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

将(生成的)修订列表转换为您的编辑器可以用作选择要编辑的行的表达式的格式。
在vim中,您可以执行以下操作(在正确的窗口中)
(注意:\ x选择十六进制数字,OP的哈希包含非十六进制数字,例如j和k,因此OP可能需要\ w;在我的情况下,git log --oneline产生了9个数字哈希缩写,您可能需要不同的长度(虚构的示例需要{9,10})。
:%s/\v(\x{7,9}).*\n/\1|/

\n会将多行连接成一行。

在vim中,我们将其复制到寄存器中,然后通过CTRL+r粘贴到minibuffer中。

返回到rebase操作的缓冲区。搜索并替换匹配所选提交哈希的行中的'pick'为'edit'。
在vim中:

:g/\vbb8d6cc3c7|aa213lk321|f0j9123r9j/ :s/pick/edit/

保存rebase操作列表并丢弃选定提交哈希的临时缓冲区。关闭编辑器。git rebase开始重新定位,并停止在标记的提交上。

-1

如果你有master分支和some-feature分支。

如果有人更新了master分支,而你想要将some-feature分支变基,...

只需要

git checkout some-feature
git rebase -i master

所有some-feature的提交已经合并到主分支


请给我解释一下"-1"的意义,因为我每天都会使用这个命令。 - sensorario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接