它是按一定时间间隔发生的一系列自动提交。 是否有任何命令或算法可以简单地删除提交A而不需要调整以下提交? 事实上,B 已经包含了 A 的所有更改,并且后续对其他文件的提交不会受到其丢失的影响。
为了进行比较,我首先给出了一个正常提交 --amend 的示例。
master
↓
1 --- 2 --- A
$ git commit --amend → B
master
↓
1 --- 2 --- A B
\_________/
master
↓
1 --- A --- 2
$ ???
master
↓
1 --- A 2 --- B
\_________/
使用
git rebase --onto 1 A
会产生不必要的合并冲突。有趣的非交互式选项。
编辑: 更简单地问一下,如何将“Parent A”更改为“Parent 1”?
$ git cat-file -p 2
tree 228f55
parent A
git rebase --interactive
是实现此目的的一种方法。
请注意,定义提交的部分内容是它的父级,因此这是重写历史..我们最终会得到如下所示的结果。
master
↓
1 --- A --- 2 2' --- B
\_______________/
就像
--amend
一样,这意味着如果A
或2
已经与其他人共享,他们将需要强制拉动。
首先,对于后续的人员,我们将在您描述的状态下创建一个存储库以进行演示。
git init
git commit -m initial --allow-empty
touch 1
git add .
git commit -m 1
touch a
git add .
git commit -m a
touch 2
git add .
git commit -m 2
touch b
git add .
git commit -m b
现在,我们使用交互式rebase来重写历史
git rebase --interactive c424a7d~ # sha of commit 1 (`~` means it's parent)
您的编辑器将打开,显示类似这样的内容,以及下面的一些帮助文本
pick c424a7d 1
pick aa32596 a
pick 61fd303 2
pick 6ff8a8f b
我们要编辑它,使其看起来像这样
pick c424a7d 1
drop aa32596 a
pick 61fd303 2
edit 6ff8a8f b
这意味着:
保存并关闭。出现提示时,验证提交
B
是否符合您的预期,然后运行
git rebase --continue
然后我们可以验证新状态是否符合我们的预期:
$ git log --graph --reflog --oneline
* 438733e (HEAD -> main) b
* 5b86d44 2
| * 6ff8a8f b
| * 61fd303 2
| * aa32596 a
|/
* c424a7d 1
* 9681553 initial