web-dev-qa-db-ja.com

Gitをプッシュする前に複数のコミットを組み合わせる

私は自分のローカルリポジトリにテーマ的に似たコミットをたくさん持っています。リモートにプッシュアップする前に、それらを1つのコミットにまとめたいと思います。どうすればいいのですか?私はrebaseがこれをすると思いますが、私はドキュメントを理解することができません。

356
muudscope

あなたがやりたいことはgitでは "潰し"と呼ばれています。これを行うときにはたくさんのオプションがあります(多すぎる?)が、プッシュされていないすべてのコミットを単一のコミットにマージしたいだけの場合は、次のようにします。

git rebase -i Origin/master

これはあなたのテキストエディタ(-iは "interactive"のためのものです)を次のようなファイルで起動します。

pick 16b5fcc Code in, tests not passing
pick c964dea Getting closer
pick 06cf8ee Something changed
pick 396b4a3 Tests pass
pick 9be7fdb Better comments
pick 7dba9cb All done

最初のものを除いて、すべてのpicksquash(またはs)に変更します。

pick 16b5fcc Code in, tests not passing
squash c964dea Getting closer
squash 06cf8ee Something changed
squash 396b4a3 Tests pass
squash 9be7fdb Better comments
squash 7dba9cb All done

ファイルを保存してエディタを終了します。その後、別のテキストエディタが開き、すべてのコミットからのコミットメッセージを1つの大きなコミットメッセージにまとめることができます。

ほら!グーグル "git squashing"はあなたに利用可能な他のすべてのオプションの説明を与えるでしょう。

540
Leopd

あなたがたくさんのコミットを持っていて、最後のX個のコミットだけをスカッシュしたいのなら、スカッシュを開始したいコミットのコミットIDを見つけてください。行う

git rebase -i <that_commit_id>

それから、leopdの答えに書かれているように、最初のものを除くすべてのpicksをsquashesに変更してください。

65
Noich

ここにはかなりの数の実用的な答えがありますが、私はこれが最も簡単であることがわかりました。このコマンドはエディタを開きます。そこでエディタを削除/マージするためにpicksquashに置き換えることができます。

git rebase -i HEAD~4

ここで、4は1つにまとめたいコミットの数です。これはここで説明されています。

32
vikas027

git rebase -iでこれを行うことができます。あなたが 'root'として使用したいリビジョンを渡します。

git rebase -i Origin/master

Origin/masterの最後のコミットの後に行ったすべてのコミットを表示するエディタウィンドウを開きます。コミットを拒否したり、コミットを単一のコミットにまとめたり、以前のコミットを編集したりできます。

おそらくこれをより良い方法で説明し、他の例をいくつか示すことができるリソースがいくつかあります。

http://book.git-scm.com/4_interactive_rebasing.html

そして

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

私が見つけることができた最初の2つの良いページです。

25
Justin Weiss

思いついた

#!/bin/sh

message=`git log --format=%B Origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft Origin
git commit -m "$message"

コミットメッセージから空の行を結合、ソート、統一、削除します。私はこれをgithubウィキへのローカルな変更に使用します(gollumを使用)

11
ruediste

そして私のsquashingの倍数Pushのやり方は(おそらくあなた自身のブランチにたくさんのコミットをプッシュしていて、今度はpull requestをしたいが、既にプッシュした多数のコミットでそれらを雑然とさせたくない)私がそうする方法(私が言うことができる限り他のより簡単なオプションはありません)。

  1. squashのために新しいブランチを作成します(あなたが要求を引っ張りたい元のブランチからのブランチ)。
  2. 新しく作成したブランチをプッシュします。
  3. 新しいブランチへのコミット(すでにプッシュ済み)を使ってブランチをマージします。
  4. 新しいブランチとスカッシュを再配置します。
  5. 新しいブランチをプッシュしてください。
  6. 新しいコミット用の新しいpull requestを作成します。これは現在シングルコミットです。

例:

git checkout from_branch_you_wish_to_pull_request_to
git checkout -b new_branch_will_have_single_squashed_commit
git Push -u new_branch_will_have_single_squashed_commit
git merge older_branch_with_all_those_multiple_commits
git rebase -i (here you squash)
git Push Origin new_branch_will_have_single_squashed_commit

これでリクエストをfrom_branch_you_wish_to_pull_request_toに引き込むことができます

6
Tomer Ben David

Interactive Rebase を使ってコミットを潰すことができます。コマンドラインまたは SmartGit を使用してこれを実行する方法を示した、かなり素敵なYouTubeのビデオがあります。

すでにSmartGitユーザーの場合は、すべての発信コミットを選択し(Ctrlキーを押しながら)、コンテキストメニュー(右クリック)を開いてコミットを取り消すことができます。

とても快適です。

enter image description here

それがどのように機能するかを示す Atlassian からのとても素晴らしいチュートリアルもあります。

5

あなたはおそらく Interactive Rebasing を使いたいと思うでしょう。

"git rebase interactive"を検索すれば他の良いリソースを見つけることができます。

2
Greg Hewgill