如何修改旧的Git提交?[duplicate]

x7yiwoj4  于 2023-02-11  发布在  Git
关注(0)|答案(6)|浏览(156)
    • 此问题在此处已有答案**:

(19个答案)
八年前就关门了。
我已经提交了3次git,但是还没有被推送。我怎么修改旧的(ddc6859af44)和(47175e84c),哪一个不是最近的?

$git log
commit f4074f289b8a49250b15a4f25ca4b46017454781
Date:   Tue Jan 10 10:57:27 2012 -0800

commit ddc6859af448b8fd2e86dd0437c47b6014380a7f
Date:   Mon Jan 9 16:29:30 2012 -0800

commit 47175e84c2cb7e47520f7dde824718eae3624550
Date:   Mon Jan 9 13:13:22 2012 -0800
vatpfxk5

vatpfxk51#

git rebase -i HEAD^^^

现在用edite(替换pick)标记您要修改的。现在保存并退出。
现在做你的改变,然后

git add .
git rebase --continue

如果你想添加一个额外的delete,可以从commit命令中删除选项;如果你想调整消息,可以只省略--no-edit选项。

332nm8kg

332nm8kg2#

我准备了我的提交,我想用一个旧的来修改它,并惊讶地看到rebase -我抱怨我有未提交的修改。但我不想再次修改旧提交的编辑选项。所以解决方案非常简单和直接:
1.准备对旧提交的更新,添加并提交

  1. git rebase -i <commit you want to amend>^-注意^,以便在文本编辑器中看到所述提交
    1.你会得到这样的结果
pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync
pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
pick e23d23a fix indentation of jgroups.xml

1.现在,要将e23 d23 a与8 c83 e24组合,您可以更改行顺序并使用squash,如下所示:

pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync    
squash e23d23a fix indentation of jgroups.xml
pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies

1.写入并退出该文件,您将看到一个编辑器来合并提交消息。执行此操作并保存/退出文本文档
1.您已完成,您的提交已修改
功劳归于:http://git-scm.com/book/en/Git-Tools-Rewriting-History还有其他有用的git魔术演示。

fnatzsnv

fnatzsnv3#

我也用过几次另外一种方法。实际上,这是一个手动的git rebase -i,当你想重新排列几个提交,包括压缩或拆分其中的一些时,它很有用。主要的优点是你不必在一个单一的时刻决定每个提交的命运。在这个过程中,你也可以使用所有的Git特性,而不像在rebase过程中。例如,你可以在任何时候显示原始的和重写的历史记录,甚至可以重新定基!
我将以下面的方式引用提交,这样更容易阅读:

C # good commit after a bad one
B # bad commit
A # good commit before a bad one

您的历史在开始时看起来像这样:

x - A - B - C
|           |
|           master
|
origin/master

我们将按以下方式重新创建:

x - A - B*- C'
|           |
|           master
|
origin/master

程序

git checkout B       # get working-tree to the state of commit B
git reset --soft A   # tell Git that we are working before commit B
git checkout -b rewrite-history   # switch to a new branch for alternative history

现在使用git addgit add -igit stash等)来改进您的旧提交。您甚至可以将旧提交拆分为两个或更多。

git commit           # recreate commit B (result = B*)
git cherry-pick C    # copy C to our new branch (result = C')

中间结果:

x - A - B - C 
|    \      |
|     \     master
|      \
|       B*- C'
|           |
|           rewrite-history
|
origin/master

让我们完成:

git checkout master
git reset --hard rewrite-history  # make this branch master

或者只使用一个命令:

git branch -f master  # make this place the new tip of the master branch

就这样,你现在可以push你的进度了。
最后一项任务是删除临时分支:

git branch -d rewrite-history
qpgpyjmq

qpgpyjmq4#

您可以使用git rebase重写提交历史,这可能会对您的更改造成潜在的破坏,因此请谨慎使用。
首先把你的“修正”修改作为一个普通的提交,然后从你最早提交的父提交开始进行交互式的变基

git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^

这将启动你的编辑器处理所有提交。重新排列它们,使你的“修正”提交位于你想修正的提交之下。然后用s替换“修正”提交行的第一个单词,这将把它与之前的提交合并(squash)。保存并退出编辑器,按照说明操作。

23c0lvtd

23c0lvtd5#

你可以使用git rebase --interactive,在你想要修改的提交上使用edit命令。

eyh26e7m

eyh26e7m6#

如果OP想要将指定的2个提交压缩为1个,这里有一个替代方法,可以不进行重定基

git checkout HEAD^               # go to the first commit you want squashed
git reset --soft HEAD^           # go to the second one but keep the tree and index the same
git commit --amend -C HEAD@{1}   # use the message from first commit (omit this to change)
git checkout HEAD@{3} -- .       # get the tree from the commit you did not want to touch
git add -A                       # add everything
git commit -C HEAD@{3}           # commit again using the message from that commit

@{N)语法很容易理解,因为它允许你引用你的引用历史,在这里HEAD代表你当前的提交。

相关问题