我有8个提交,但我需要返回并更改我的一个提交。我需要从中删除两个文件。
我试过的是
git checkout 3043b71 //this is the commit that I want to change
git rm src/tcp.rs
git rm src/ip.rs
git commit --amend
git checkout master
git push -f
但似乎没有任何改变,我做错了什么?
答案 0 :(得分:2)
如果您已经推动了这些更改,而其他人已从中央仓库撤出,您可能不希望这样做。这将重写git历史记录,并在推送原始提交后引发其他问题。在这种情况下,您应该在有问题的提交中使用git revert
,然后只进行您希望保留的更改。然后提交并推送。
如果您没有推动更改,那么您可以在推送之前以任何方式自由修复本地仓库。
答案 1 :(得分:1)
我认为您需要重置提交 reset git
$ git reset --soft HEAD^ <1>
$ edit <2>
$ git commit -a -c ORIG_HEAD <3>
答案 2 :(得分:1)
一旦您对提交进行了更改,您的树将看起来像这样:
(A) - (B) - (C) - (D)
\
(B')
你需要做什么来改变你的变化C&amp; D到您的更改B'。你可以轻松地做到这一点。
git rebase B' D
这会使它看起来像
(A) - (B) - (C) - (D)
更新:
只是为了让这个更清楚。您应该按照OP步骤git commit --amend
进行操作,然后执行我提到的操作。所以你的整个工作流程都是这样的
git checkout B
<make changes>
git commit --amend
git rebase B' D
更新2:
@gtrig在另一个答案中提出了一个很好的观点。这是重写历史记录,所以如果你已经推送到另一个存储库(或其他人已从你那里撤走),这是一个非常糟糕的主意,你应该使用git revert
代替进行一项新的更改,以支持前一个。这将使你的历史更加丑陋,但它不会搞砸其他人的存储库。这仅适用于远程推送之前的本地更改。
答案 3 :(得分:0)
git checkout 3043b71
git rm src/tcp.rs
git rm src/ip.rs
git commit --amend
git rebase 3043b71 master --onto HEAD // <-- [1]
git push -f
[1] cherry-pick
从master
继续提交到新提交并重置master
。
或者,而不是rebase
,更容易理解:
...
git cherry-pick 3043b71..master
git checkout -B master
...