ある開発ブランチで、自分のコードベースにいくつかの変更を加えました。取り組んでいた機能を完成させる前に、いくつかの機能をデモするために現在のブランチを master に切り替えなければなりませんでした。しかし、"git checkout master"を使うだけでは、開発ブランチで行った変更がそのまま保存されてしまい、masterの機能の一部が壊れてしまいました。そこで私が行ったのは、開発ブランチでの変更をコミットメッセージ "temporary commit" でコミットしてから、デモのために master をチェックアウトすることでした。
デモを終えて開発ブランチで作業を再開した今、私が行った変更を維持したまま、行った"temporary commit"を削除したいと思います。それは可能ですか?
これは簡単なことです。
git reset HEAD^
git resetで
--hardや
--softを指定しないと、ファイルを変更することなく、
HEADが指定したコミットを指すようになります。HEAD^
は現在のコミットの(最初の)親コミットを指し、あなたの場合は一時的なコミットの前のコミットになります。
別のオプションとして、通常通りに作業を進め、次のコミットで代わりに次のコマンドを実行することもできます。
git commit --amend [-m … etc]
を実行すると、最新のコミットを編集し、上記と同じ効果が得られます。
この方法は、ほぼすべての git の回答と同様に、悪いコミットを他の人が引っ張ってきた可能性のある場所にすでにプッシュしてしまった場合に問題が発生することに注意しましょう。これは避けましょう。
これには2つの方法があります。どちらが簡単かは、あなたの状況によります
**リセットする
削除したいコミットが最後のコミットで、何も追加作業をしていない場合は、単純に git-reset
を使用することができます。
git reset HEAD^
ブランチを現在の HEAD の直前のコミットに戻します。しかし、実際には作業ツリーのファイルは変更されません。その結果、そのコミットで行われた変更は修正されたものとして表示されます。これは「uncommit」コマンドのようなものです。実際、私にはそれを行うためのエイリアスがあります。
git config --global alias.uncommit 'reset HEAD^'
そうすれば、将来的には git uncommit
を使って、あるコミットをバックアップすることができます。
スカッシング。
Squashing a commitとは、2つ以上のコミットを1つにまとめることです。私はよくこの作業を行います。あなたのケースでは、機能の半分をコミットして、それを完成させて、適切で永続的なコミットメッセージで再度コミットします。
git rebase -i <ref>
上でと書いたのは、これが何回もコミットし直すことができることを明確にしたいからです。git logを実行して削除したいコミットを見つけ、その SHA1 をコピーしてそれを
の代わりに使います。Git は、インタラクティブなリベースモードに入ります。現在の状態と
の代わりに使ったものとの間のすべてのコミットが表示されます。つまり、
` が 10 コミット前のものであれば、その 10 コミットをすべて表示するということです。
それぞれのコミットの前には、「pick」という文字があります。削除したいコミットを見つけて、それを pick
から fixup
または squash
に変更します。fixupを使うと、単純にそのコミットのメッセージを破棄して、変更点をリストの直前のコミットにマージします。squash
キーワードは同じことをしますが、新しく結合されたコミットのコミットメッセージを編集することができます。
エディタを終了したときに、リストに表示されている順番でコミットが再実行されることに注意してください。つまり、一時的なコミットを行った後、同じブランチで別の作業を行い、後のコミットでその機能を完成させた場合、rebase を使用することでコミットを再ソートし、それらを潰すことができるのです。
警告:。
*リベースは履歴を変更するので、他の開発者と共有しているコミットには行わないでください。
**スタッシング
将来的には、この問題を回避するために、コミットされていない作業を一時的に保存するために git stash
を使用することを検討してください。
git stash save 'some message'
これにより、現在の変更点がstashリストの横に保存されます。上記は stash コマンドの最も明確なバージョンで、隠している内容を説明するコメントを入力することができます。また、単に git stash
を実行し、他に何もしないこともできますが、メッセージは保存されません。
スタッシュリストの閲覧には...
git stash list
これにより、あなたのすべての隠し場所、どのブランチで行われたか、メッセージ、各行の最初に、その隠し場所の識別子が表示されます。
スタッシュを復元するには(スタッシュが最初に作成された場所にかかわらず、どのブランチでも復元できます)、次のように実行します。
git stash apply stash@{#}
ここでも#はstashの配列内の位置を表します。復元したいスタッシュが 0
の位置にある場合、つまり、それが最新のスタッシュである場合には、コマンドを実行するだけでよいのです。その場合は、スタッシュの位置を指定せずにコマンドを実行すれば、git は最後のスタッシュのことだと判断します。
ですから、たとえば間違ったブランチで作業をしていることに気づいたときには、次のような一連のコマンドを実行します。
git stash
git checkout <correct_branch>
git stash apply
あなたの場合は、もう少しブランチを移動しましたが、同じ考えが当てはまります。
ご参考になれば幸いです。