私は自分のローカルリポジトリにテーマ的に似たコミットをたくさん持っています。リモートにプッシュアップする前に、それらを1つのコミットにまとめたいと思います。どうすればいいのですか?私はrebase
がこれをすると思いますが、私はドキュメントを理解することができません。
あなたがやりたいことは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
最初のものを除いて、すべてのpick
をsquash
(または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"はあなたに利用可能な他のすべてのオプションの説明を与えるでしょう。
あなたがたくさんのコミットを持っていて、最後のX個のコミットだけをスカッシュしたいのなら、スカッシュを開始したいコミットのコミットIDを見つけてください。行う
git rebase -i <that_commit_id>
それから、leopdの答えに書かれているように、最初のものを除くすべてのpick
sをsquash
esに変更してください。
ここにはかなりの数の実用的な答えがありますが、私はこれが最も簡単であることがわかりました。このコマンドはエディタを開きます。そこでエディタを削除/マージするためにpick
をsquash
に置き換えることができます。
git rebase -i HEAD~4
ここで、4
は1つにまとめたいコミットの数です。これはここで説明されています。
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つの良いページです。
思いついた
#!/bin/sh
message=`git log --format=%B Origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft Origin
git commit -m "$message"
コミットメッセージから空の行を結合、ソート、統一、削除します。私はこれをgithubウィキへのローカルな変更に使用します(gollumを使用)
そして私のsquashing
の倍数Push
のやり方は(おそらくあなた自身のブランチにたくさんのコミットをプッシュしていて、今度はpull requestをしたいが、既にプッシュした多数のコミットでそれらを雑然とさせたくない)私がそうする方法(私が言うことができる限り他のより簡単なオプションはありません)。
squash
のために新しいブランチを作成します(あなたが要求を引っ張りたい元のブランチからのブランチ)。例:
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
に引き込むことができます
あなたはおそらく Interactive Rebasing を使いたいと思うでしょう。
"git rebase interactive"を検索すれば他の良いリソースを見つけることができます。