2つのコミットを1つのコミットに組み合わせるにはどうすればよいですか?


102

2つのコミットを持つブランチ「firstproject」があります。これらのコミットを取り除き、単一のコミットとして表示したいと思います。

このコマンドgit merge --squashは有望に聞こえますがgit merge --squash、ターミナルを実行すると、コマンドのオプションが表示されます。正しいコマンドは何ですか?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'

私はそれが正しいコマンドだとは思いません。また、そのようなコミットを変更できるかどうかも疑問です。
BSull 2012

いや 、複数のコミットを1つのコミットに変更できます:git-scm.com/book/en/Git-Tools-Rewriting-History私の質問は、そのための特定のコマンドについてです。
ドンP

@BSullあなたは絶対にあなたが望む方法でコミットを変更することができます。それらは文字通りいつでも完全に編集可能です。他の人とコードを共有している場合、そうすることで履歴が書き換えられ、他の人とは異なるブランチで効果的に作業できるようになります。
–meagar

これは決してだまされるべきではありませんでした。実際、他のものは広すぎるとして閉鎖されるべきでした。これが重複としてマークされているもう1つの質問は、以前のリベースを放棄する必要があるため、不必要に複雑です。
エヴァンキャロル

回答:


143

インタラクティブなリベースgit rebase -iを実行したい。

あなたが現在している場合には、あなたの「1をコミット」、およびマージするコミット、「2コミット」、以前はコミットされ、あなたが実行することができますgit rebase -i HEAD~2リベースを横断するすべてのコミットをリストエディタを起動しますました。「pick」で始まる2行が表示されます。押しつぶしを続行するには、2行目の最初の単語を「pick」から「squash」に変更します。次に、ファイルを保存して終了します。Gitは、最初のコミットを最後から2番目のコミットに押しつぶします。

このプロセスにより、ブランチの履歴が書き換えられることに注意してください。コードをどこかにプッシュしている場合はgit push -f、コードを共有している人は、変更をプルするためにいくつかのフープを飛び越えなければなりません。

問題の2つのコミットがブランチの最後の2つのコミットではない場合、プロセスはわずかに異なることに注意してください。


2
どうすればいいThen write your file, and quitですか?Android Studioターミナル、gitコンソール自体を使用しています。またはSourceTreeソフトウェアでgitコンソールを開いています。しかし、どのように保存して終了するのですか?
Dr.jacky 2017

1
ブランチの最後の2つのコミットではない2つのコミットを組み合わせる方法は?
Weishi Zeng 2017

1
@meagar私はそれが理にかなっていると思います...この問題(これの複製)をチェックすると、「方向」を押しつぶすことは大きな違いを生み、問題全体の根源でした(約200の賛成票を持つ最初のコメントを参照してください」 )間違った方法」を退治- stackoverflow.com/a/2568581/43453
PandaWood

1
@PandaWoodあなたは答えを読み間違えています。最初の方法は単純に間違っていましたが違いはありませんでした。後方にのみ押しつぶすことができます。古いコミットを新しいコミットに押しつぶすことを考えるのは意味がありませんが、可能であれば同じ操作になります。
meagar

1
「2行目の最初の単語を変更する」まで理解しました-何の2行目ですか?
AndrewTorr19年

74

私のような忘れ物のための怠惰なシンプルなバージョン:

git rebase -i HEAD~3 または、3ではなく多くのコミット。

これを回します

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

これに

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

あなたがヒットいくつかのアクションを行うesc、その後enter、変更を保存します。[1]

次の画面が表示されたら、それらのゴミ#行[2]を取り除き、新しいコミットメッセージなどを作成して、同じescape enterアクションを実行します。[1]

うわー、コミットが少なくなります。またはあなたはただすべてを壊しました。


[1]-またはgit構成で機能するものなら何でも。これは、私の設定を考えると効率的なシーケンスにすぎません。

[2]-# this is your n'th commitこれらのメッセージのすぐ下に元のコミットが表示され、数回のようなものが表示されます。これらの行を削除し、1に結合するn個のコミットの意図を反映するコミットメッセージを作成します。


1
非常に簡潔な解決策-ありがとうございます。sここで使用されているのはスカッシュの略であるという概要を説明すると便利かもしれません。以前にコミット使用していますが、メルドにコミットする
UrbanConor

2コミットしたばかりで、同じ2コミットを組み合わせたい場合は、とを実行する必要がgit reset --soft HEAD~ありgit commit --amendます。
scrutari

@Stachuこの後、プッシュをコマンドすると、プルとマージを要求されます。それを避けるために私は何ができますか?
AbhayKoradiya20年

プルしてマージしたくないのはなぜですか?
Stachu

23
  1. ブランチをチェックアウトして、すべてのコミットの数を数えます。
  2. git bashを開いて、次のように記述します:git rebase -i HEAD~<quantity of your commits>(ie git rebase -i HEAD~5
  3. 開いたtxtファイルで、最初のコミット(一番上にある)を除くすべてのコミットに対してpickキーワードをsquashに変更します。一番上のものをに変更しreword(つまり、次のステップでこのコミットに新しいコメントを提供します)、[保存]をクリックします。vimの場合は、を押してescからwq!Enterキーを押して保存し、Enterキーを押します。
  4. コメントを提供します。
  5. Gitを開き、[すべてフェッチ]を実行して、新しい変更を確認します。

完了


最初のものはvimでの使い方を教えてくれます。どうもありがとう
HoLuong20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.