我已经提交了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

当前回答

我用过另一种方法几次。事实上,它是一个手动的git rebase -i,当你想重新安排几个提交,包括压缩或分割一些提交时,它很有用。主要的优点是,您不必在某个时刻决定每个提交的命运。在这个过程中,你还可以使用所有的Git特性,而不是在重基过程中。例如,您可以在任何时候显示原始和重写的历史记录的日志,甚至可以进行另一次重基!

我将以以下方式引用提交,因此它易于阅读:

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 add (git add -i, git 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

好了,现在你可以继续前进了。

最后一个任务是删除临时分支:

git branch -d rewrite-history

其他回答

你可以使用git rebase重写提交历史。这可能会对您的更改造成潜在的破坏,因此请谨慎使用。

首先,像正常提交一样提交“修正”更改。然后从最老的提交的父节点开始进行交互式重基

git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^

这将用所有提交激活编辑器。重新排列它们,使你的“修改”提交在你想修改的提交下面。然后将该行的第一个单词替换为“amend”commit with s,这将结合(s quash)它与之前的提交。保存并退出编辑器,并按照说明操作。

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

git rebase -i HEAD^^^

现在用edit或e (replace pick)标记想要修改的内容。现在保存并退出。

现在就做出你的改变吧

git add .
git rebase --continue

如果您想添加额外的删除,请从commit命令中删除选项。如果要调整消息,只需省略——no-edit选项。

如果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,表示当前提交。

我准备了我的提交,我想用一个旧的修改,并惊讶地看到了rebase -我抱怨我有未提交的更改。但我不想再次指定旧提交的编辑选项进行更改。所以解决方案非常简单直接:

prepare your update to older commit, add it and commit git rebase -i <commit you want to amend>^ - notice the ^ so you see the said commit in the text editor you will get sometihng like this: 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 now to combine e23d23a with 8c83e24 you can change line order and use squash like this: 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 write and exit the file, you will be present with an editor to merge the commit messages. Do so and save/exit the text document You are done, your commits are amended

荣誉归于:http://git-scm.com/book/en/Git-Tools-Rewriting-History 这里还演示了其他有用的git魔法。