これを処理する方法は2つあります。どちらが簡単かは状況によって異なります
リセット
あなたが取り除きたいコミットが最後のコミットであり、あなたが単に使用できる追加の作業をしていない場合 git-reset
git reset HEAD^
現在のHEADの直前のコミットにブランチを戻します。ただし、実際には作業ツリー内のファイルは変更されません。その結果、そのコミットで行われた変更は変更されたものとして表示されます。これは「コミット解除」コマンドのようなものです。実際、私はそれを行うためのエイリアスを持っています。
git config --global alias.uncommit 'reset HEAD^'
その後git uncommit
、将来的に1つのコミットをバックアップするために使用できます。
潰れ
コミットを押しつぶすとは、2つ以上のコミットを1つにまとめることを意味します。私はかなり頻繁にこれを行います。あなたの場合、あなたは半分完了した機能をコミットしていて、それを終えて、適切な永続的なコミットメッセージで再びコミットするでしょう。
git rebase -i <ref>
はっきり言っておきたいのは、これはいくつでもコミットできるということです。削除git log
するコミットを実行して見つけ、そのSHA1をコピーして、の代わりに使用し<ref>
ます。Gitはインタラクティブなリベースモードに移動します。それはあなたの現在の状態とあなたがの代わりに置いたものの間のすべてのコミットを表示します<ref>
。つまり、<ref>
10コミット前であれば、10コミットすべてが表示されます。
各コミットの前には、と表示されますpick
。取り除きたいコミットを見つけ、それをpick
からfixup
またはに変更しsquash
ます。使用してfixup
簡単に破棄し、そのコミットメッセージを、リスト内のその直接の前身に変更をマージします。squash
キーワードは、同じことをしていますが、新しく結合されたコミットのコミットメッセージを編集することができます。
エディターを終了すると、リストに表示された順序でコミットが再コミットされることに注意してください。したがって、一時的なコミットを行い、同じブランチで他の作業を行い、その後のコミットで機能を完了した場合、リベースを使用すると、コミットを再ソートしてそれらを押しつぶすことができます。
警告:
リベースにより履歴が変更されます-他の開発者とすでに共有しているコミットに対しては、これを行わないでください。
隠しておく
今後、この問題を回避するために、を使用git stash
して、コミットされていない作業を一時的に保存することを検討してください。
git stash save 'some message'
これにより、現在の変更がスタッシュリストの横に保存されます。上記はstashコマンドの最も明示的なバージョンであり、コメントを付けて、何を隠しているかを説明できます。また、単に実行git stash
して他には何もできませんが、メッセージは保存されません。
あなたはあなたの隠しリストを閲覧することができます...
git stash list
これにより、すべてのスタッシュ、それらが行われたブランチ、メッセージと各行の先頭、および次のようなstash@{#}
スタッシュの識別子が表示されます。#はスタッシュの配列内の位置です。
stashを復元するには(stashが最初に作成された場所に関係なく、任意のブランチで実行できます)、単に実行します...
git stash apply stash@{#}
繰り返しますが、#はスタッシュの配列内の位置です。復元するスタッシュが適切な0
位置にある場合-つまり、それが最新のスタッシュだった場合。次に、スタッシュ位置を指定せずにコマンドを実行するだけで、gitは最後のものを意味すると想定しますgit stash apply
。
したがって、たとえば、自分が間違ったブランチで作業していることがわかった場合、次の一連のコマンドを実行できます。
git stash
git checkout <correct_branch>
git stash apply
あなたの場合、ブランチをもう少し移動しましたが、同じ考え方がまだ当てはまります。
お役に立てれば。
git stash