web-dev-qa-db-ja.com

最後のgitadd / commitを元に戻すにはどうすればよいですか?

私はファイルを編集して次のことを行いました。

git add file.py
git commit -m 'fixed bug'

次に、別のファイルを編集して、マイナーなバグ修正を実行しました。 「バグ修正」を示す2つのコミットを次々に実行したくありません。 「バグ修正」で1つのコミットが必要です。

最後の追加/コミットを元に戻し、最初のコミットメッセージを変更するにはどうすればよいですか?

git resetgit revertgit undoコマンドを見ていましたが、推測でリポジトリを台無しにしたくありません

編集:それを行う方法を見つけました: http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

19
dave

2番目の変更を既にコミットしている場合は、最初にリセットします。

git reset HEAD^

これで、HEADが最初のコミットになり、ローカルファイルの内容は変更されません。

git add <the file(s) for the second bug fix>
git commit --amend -m'bug fixes'

追跡および変更されたすべてのファイルを2番目のバグ修正に含める場合は、通常どおり、代わりにこれを実行できます。

git commit -a --amend

コミットの修正はまさにこれです:

  • インデックスの変更を前のコミットに追加します(したがって、git addまたは-aが必要です)
  • コミットメッセージを変更できます

ただし、注意してください。最初のコミットを配布した場合、他の人のリポジトリは奇妙になります。他の誰かがフェッチしたコミットを変更しないでください。


おそらくgit merge --squashを使用することもできます。これは、より論理的に感じられますが、必ずしも簡単ではありません。これを使用して、2つのコミットを含むブランチを前のコミットにマージします。

押しつぶしはgit rebaseでも機能します。

34
Gauthier