如何修改较早的 git 提交,就像 git --amend 修改最新的提交一样?

问题描述 投票:0回答:1

它是按一定时间间隔发生的一系列自动提交。 是否有任何命令或算法可以简单地删除提交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
1个回答
0
投票

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

这意味着:

  • 保持 1 相同
  • 删除a,使2指向1
  • 保持 2 相同(新父级除外)
  • 保留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
© www.soinside.com 2019 - 2024. All rights reserved.