18

デタッチされた HEAD 状態で「git commit --amend」を見たことがあります。この質問には、必要以上に複雑な回答が必要です。

git commit --amend通常の HEAD 状況でどのように機能するかを理解したいと思います。

4

3 に答える 3

32

クリーンな作業状態にあり、リポジトリが次のようになっているとします。

ここに画像の説明を入力してください

次に実行すると

git commit --amend

コミットメッセージを書き、エディタを保存して終了すると、次のことが起こります:

  1. ステージング領域 (新しい変更をステージングしていない場合、コミット f42c5 と同じになります) は、新しいコミット31b8eを作成するために使用されます。その親は、修正するコミットの親と同じになります: f42c5
  2. マスターブランチ参照は、その新しいコミット ( 31b8e )を指すように移動されます。
  3. masterの後にHEAD参照が続きます。

ここに画像の説明を入力してください

修正されたコミット ( f42c5 ) は、リポジトリ内のどの参照からも到達できないことに注意してください (したがって、私のグラフでは「透明な」スタイルになっています)。それはまだリポジトリのオブジェクト データベースに存在しますが、Git が定期的なハウスキーピングを実行するか、git gcガベージ コレクションを実行して明示的にトリガーすると、最終的に完全に削除されます。


補遺( Jason Baker のコメントに基づく): 修正されたコミットf42c5がリポジトリにまだ存在し、そのコミット ID を見つける方法がある限り (たとえば、マスターブランチの reflogから釣り上げるなど) があることに注意してください。 )、まだチェックアウトできます。ランニング

git checkout master # just to be sure that master is the current branch
git reset --hard f42c5

または(その間、 master で新しいコミットを行ったり、 masterをリセットしたり、 masterブランチ参照を移動したりしていないと仮定します)

git checkout master # just to be sure that master is the current branch
git reset --hard master@{1}

次のような状況になります。

ここに画像の説明を入力してください

しかし今、コミット31b8eは到達不能になります。


于 2014-09-26T00:53:12.070 に答える
8

「B」をコミットしたとしましょう

... --- A --- B
              ^
              |
            master
             HEAD

「B」を修正すると、新しいブランチ ヘッドとなる並列コミットが作成されます。

        +---- B
        |
... --- A --- B'
              ^
              |
            master
             HEAD

B' は、B からの変更と、 を発行したときにステージングした変更を組み合わせた結果のコミットですgit commit --amend

于 2014-09-26T00:46:53.657 に答える