更改旧提交并删除一些更改

时间:2013-07-23 16:16:03

标签: git

我有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

但似乎没有任何改变,我做错了什么?

4 个答案:

答案 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-pickmaster继续提交到新提交并重置master

或者,而不是rebase,更容易理解:

...
git cherry-pick 3043b71..master
git checkout -B master
...