1

I have 8 commits but I need to go back and change one of my commits. I need to remove two files from it.

What I tried was

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

But it seems that nothing has changed, what did I do wrong?

4

4 回答 4

2

如果您已经推送了这些更改,并且其他人已从中央存储库中撤出,那么您可能不想这样做。这将重写 git 历史记录,并导致在您推送原始提交后已拉取的其他人出现问题。在这种情况下,您应该git revert在有问题的提交上使用,然后只进行您希望从该提交中保留的更改。然后提交并推送。

如果您没有推送更改,那么您可以在推送之前以任何您想要的方式自由地修复您的本地存储库。

于 2013-07-23T18:29:00.393 回答
1

我认为您需要重置提交 重置 git

$ git reset --soft HEAD^      <1>
$ edit                        <2>
$ git commit -a -c ORIG_HEAD  <3>
于 2013-07-23T16:21:48.193 回答
1

对提交进行更改后,您的树将如下所示:

(A) - (B) - (C) - (D)
       \
        (B')

您需要做的是将您的更改 C 和 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来进行新的更改以撤销之前的更改。这将使您的历史记录更加丑陋,但不会弄乱其他所有人的存储库。这仅适用于远程推送之前的本地更改。

于 2013-07-23T16:34:50.050 回答
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
...
于 2013-07-24T14:30:56.943 回答