2011-11-04 3 views
5

(注、私は答えgit rebase -iを探していないよ)gitコミットを "再オープン"するにはどうすればよいですか?水銀で

、私は私のパッチキューにそれをインポートすることでコミットを「再度開く」ことができます。

hg qimport tip 

コミットは「オープン」であります私がそれをコミットする前のように、私は元に戻すことができるという意味で、hg diffhg status、など私はgitでこれを行うには?

(私はウェブ上で見つけたすべてがgit rebase -iを示唆し、その後編集を選択しますが、コミットは、同じように「オープン」ではありませんので、それは、違う。)

+0

もう1つの選択肢は、そこにコミットを残し、さらにいくつかを変更し、それらを使ってコミットを修正することです( 'git commit --amend')。 – Cascabel

答えて

16

あなたは自分の作業コピーに変更を加えることなく、あなたのHEADポインタを上に移動する必要があります。

git reset --soft HEAD^ 

リセットは、ポインタを移動させ、ソフトなオプションは、それはあなたのファイルを変更しないことを指定します。デフォルトは混在していますので、インデックスがリセットされ、hardオプションは実際に作業コピーでコミットした後に変更を削除します。

HEADは、常に最新のref(作業コピーの親)を指し示す「魔法の」gitポインタです。キャレット(^)は親を示します。これを繰り返し使用することができます。 HEAD ^^は最後のコミットの親を指します。

+0

偉大な答え、ありがとう! @ wulongのようにコミットメッセージを失うことに注意してください。 –

+0

実際に繰り返し使用したい場合は、 'HEAD ^^^^^'は 'HEAD〜5'と同じです。 (そして、より正確には、 'HEAD'は現在チェックアウトされているコミットを指し示す、現在チェックアウトされているブランチを指し示す象徴的なリファレンスであり、ブランチがチェックされていない状態でHEAD状態になっているならば、 ) – Cascabel

+3

@PaulBiggar:コミットメッセージを失うのを避けることは、リセットする代わりに修正する大きな理由です。リセットしても、間接的にコミットメッセージを回復することはできます。 'HEAD @ {1}'は前にチェックアウトされたコミットを指します。あなたが何か他のことをしていなければ、リセット前のコミットになります。 'git commit -c HEAD @ {1}'を使ってコミットメッセージを開始場所として使うことができます。 (それ以降、HEADを移動した場合は、 'git reflog'を使用して、reflogs内のコミットをさらに遠くに見つけることができます)。 – Cascabel

2

あなたはまだ持っていないと仮定すると、リモートのリポジトリにプッシュされた場合、git reset --soft HEAD^は最後のコミットを "再オープン"しますが、コミットメッセージが失われます。

2

git commit --amendを使用しても同じ結果が得られます。

comparison chartをHg & Gitの間で参照してください。

1

スコット・チャコンは、(すばらしいことに) 'git reset'コマンドについて詳しく説明しています:http://progit.org/2011/07/11/reset.html これを見るのをためらってください。

+0

素晴らしいリファレンス! –

関連する問題