10

I understand that the correct way of amending an old Git commit is to use rebase --interactive, but just to get clear on the concepts, I would like to understand what happens when I do

  • git checkout <commit>
  • change something in a file
  • add the changed file to the index
  • and then git commit . --amend

When I do this, instead of amending the commit, it branches a new commit off of the PARENT of that same commit.

Is this just Git's way of telling me that I cannot amend a commit that already has children commits?

4

1 に答える 1

24

Git では、コミットが作成されると、確定されます。変更することはできません。あなたができることは、それを修正したり、厳選したりして、それに「似た」新しいコミットを作成することだけです。

私はあなたの混乱を理解しています。適切な場所で何かを変更することを示唆しているため、やや誤解を招く可能性があります。Git では、コミットを修正するということは、元のコミットと同じ親を持つ新しいコミットを実際に作成することです。

例として、 を実行した後git checkout B、次の状況になったとします。

ここに画像の説明を入力

(あなたHEADは切り離されていますが、それは重要ではありません。)変更を行ったりステージングしたりするかどうかに関係なく、実行git commit --amendすると次のような状況になります。

ここに画像の説明を入力

コミットDは、非常に非常に似ている可能性がありBます。特に、まったく同じパッチ、まったく同じコミット メッセージBなどがある場合があります。ただし、(commit, author) タイムスタンプは通常異なります ( 1 秒未満でコミットを修正できない限り! )。つまり、SHA-の 1 は のDそれとは異なりますB。2 つのコミットの SHA が同じでない場合、それらは同じコミットではありません。

Bが の親コミットであるCと言うとき、コミットはその SHA によるコミットをC参照することBを意味します。ただし、 commitは のに作成されたため、 commitはCcommit の SHA について何も知る方法がありません。したがって、の親になることはできません。そのため、commitは接線上で開始され、子孫がありません。DD CDCD


以下の状態で着陸したい場合は、

ここに画像の説明を入力

どこB'が と少しでも違うB場合は、 を使用する必要がありgit rebase -iますgit commit --amend

于 2014-09-20T11:41:56.680 に答える