web-dev-qa-db-ja.com

最後の2つのコミットをマージするにはどうすればよいですか?

最後の2つのコミットを結合したい。 git logの結果は次のとおりです:

Enter image description here

次に、最後の2つのコミット(これは読み取りボックスにあります)を1つのコミットにマージします。どうやってやるの?

11
stack

これを行うには多くの方法があります(rebaseまたはresetを使用)。

git reset を使用するアプローチ:

  1. アプローチに関係なく、何よりもまず作業コピーがクリーンであることを確認してください。 git status を使用して確認してください。コミットされていない変更がある場合は、それらをstash( git stash に保存するか、一時的なブランチでコミットします。
  2. git branch backup を実行して、現在のコミットでバックアップブランチを作成します。
    実際には必要ありません(同じ結果は reflog を使用するか、現在のコミットのハッシュを書き留めることで実現できます)が、最も簡単な方法です。問題が発生した場合に現在のステータスを復元します。
  3. git reset --soft HEAD~2 を実行します。
    これにより、作業ツリーまたはインデックスを変更せずに、過去2回のコミットHEADを(コミットe8de117で)移動します。インデックスと作業ツリーは、コミット6aa74e4を作成する直前のようになりました。最後の2つのコミットで変更されたすべてのファイルは、すでにインデックスに追加されています。 HEADe8de117上にあるため、次のコミットはe8de117の上に作成されます(コミット6aa74e477c15d6は「置き換え」られます)。
  4. git commit を実行します。新しいコミットメッセージを入力する必要があります。
  5. 結果が期待したように見えない場合( git diff backup は違いを報告しないはずです)、または気が変わった場合は git reset --hard backup を実行します元の場所に戻る(実際には、ステップ2の直後)。
  6. 出力に満足したら、ステップ2で作成したbackupブランチを削除します( git branch -D backup )。
  7. それで全部です。
16
axiac

インタラクティブsquashrebase機能を探しています:

使用する git rebase -i HEAD~2インタラクティブなリベースを開始します。最初のエディターには、リベースの一部であるすべてのコミットがリストされます。この場合、HEAD~2引数のrebase呼び出しには、2つのコミットがあり、それぞれにpickが前に付いています。何も変更しないと、リベースがpickにつながります。つまり、両方のコミットが適用され、違いはありません。代わりに、あなたがしたいことは、もう1つのコミットをpickingしながら、1つのコミットのみをsquashすることです。このようにして、2番目のコミットを最初のコミットに押しつぶし、1つのコミットを生成します。安全にして今すぐ終了すると、gitは新しいコミットメッセージを要求し、古いコミットの両方からの変更を含む新しいコミットが表示されます。

詳細な手順については こちら を参照してください。

いつものように履歴をいじくるとき(異なるコミットを新しいものに押しつぶすのは間違いなくそうです)、他の誰も自分の作業に基づいていないことが確かなコミットに対してのみ、そのような操作を実行する必要があります。

14
kowsky