1

8 つのコミットがありますが、戻ってコミットの 1 つを変更する必要があります。そこから 2 つのファイルを削除する必要があります。

私が試したのは

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

4 に答える 4

2

これらの変更をすでにプッシュしており、他の人が中央リポジトリからプルしている場合は、おそらくこれを実行したくないでしょう。これにより、git 履歴が書き換えられ、元のコミットをプッシュした後にプルした他の人に問題が発生します。この場合、git revert問題のコミットで使用し、そのコミットから保持したい変更のみを行う必要があります。次に、コミットしてプッシュします。

変更をプッシュしていない場合は問題ありません。プッシュする前に、任意の方法でローカル リポジトリを自由に修正できます。

于 2013-07-23T18:29:00.393 に答える
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 に答える
1

commit reset gitをリセットする必要があると思います

$ git reset --soft HEAD^      <1>
$ edit                        <2>
$ git commit -a -c ORIG_HEAD  <3>
于 2013-07-23T16:21:48.193 に答える
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 に答える