我已经提交了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——interactive,在你想修改的提交上使用edit命令。

其他回答

我用过另一种方法几次。事实上,它是一个手动的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

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

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

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

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

git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^

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

git rebase -i HEAD^^^

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

现在就做出你的改变吧

git add .
git rebase --continue

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