GitHub / BitBucketでマージコミット地獄を回避する方法


100

リポジトリでは、次のような多くのコミットが発生します。

Merge branch 'master' of bitbucket.org:user/repo

これは、開発者がローカルフォークをトップレベルのリポジトリに同期するたびに発生します。

とにかく、このマージコミット地獄がすべてのレポログを散らかすのを避ける方法はありますか?何らかの方法でプルリクエストを開始するときにそれらを回避できますか?

これがローカルVMでのみ行われる場合、git rebaseを実行できることはわかっていますが、GitHub / BitBucket UIに同等のものはありますか?

どうやってやるの?

回答:


135

マージする前に機能ブランチをリベース

マージコミットを回避する場合は、すべてのコミットが早送りであることを確認する必要があります。これを行うには、次のように、マージ前に機能ブランチが開発ラインに完全にリベースされるようにします。

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebaseには、フラグを使用したインタラクティブなリベースを含め、多くのフラグ-iがありますが、できるだけシンプルにして、マージですべてのブランチ履歴を保持したい場合は、必要ない場合があります。

--ff-only旗を使う

リベースとは別に、--ff-onlyフラグを使用すると、早送りコミットのみが許可されます。マージコミットの場合、コミットは行われません。git-merge(1)のマニュアルページにはこう書かれています:

--ffのみ

現在のHEADが既に最新であるか、マージが早送りとして解決できる場合を除き、マージを拒否してゼロ以外のステータスで終了します。


1
これは素晴らしい答えです。私はリベースをできるだけ頻繁に使用しています。--ff-onlyフラグについては知りませんでした。かなりクール!
レオコレア2013年

3
リベースと--ffのみのアドバイスをありがとう。しかし、私の質問で述べたように、GitHub / BitBucketのUI内でこれを行うにはどうすればよいですか?
Niklas9 2013年

3
@ニクラス私はあなたがやりたいことをするためにCLIに頼る必要があると確信しています。GitHubはGitの全機能を公開していません。その機能のほんの一部に加えて、いくつかのグラフィカルおよびソーシャルネットワーキングの付加価値です。幸運を!
トッドA.ジェイコブス

3
このプロセスで注意すべき点の1つは、トピックブランチ(feature / foo)をマスターにマージする前に、マスターブランチが最新であることを確認するためにgit pull originマスター(リモートを使用している場合)を使用することをお勧めします。 。更新が見つかった場合は、マスターに再度マージする前に、必ずマスターをトピックブランチにリベースしてください。
chikamichi 2013年

19
@CodeGnomeをCLIの「再ソート」と呼ばないでください...実際には、UIの「再ソート」について警告する必要があります。
Droogans 2014年

9

すでに述べた「トッド・A・ジェイコブス」「リベース」がここのコンセプトです。これは、より詳細な方法です。

あなたがマスターブランチにいるとしましょう

$ git branch
  * master

修正したいので、マスターから分岐した「fixbranch」を作成します

$ git checkout -b fixbranch

たぶん、あなたはこのブランチで数日間働いていて、2、3回コミットしていたでしょう。

コミットを中央マスターリポジトリにプッシュしたい日!マスターをチェックアウトし、中央のマスターリポジトリから最新の変更を取得する

$ git checkout master
$ git pull origin master

修正ブランチをマスターでリベースして、クリーンな履歴を取得し、ローカルリポジトリ自体に競合があれば解決します。

$ git checkout fixbranch
$ git rebase master

これで、フィックスブランチはセントラルマスターで更新されました。フィックスブランチをマスターブランチにマージします。

 $ git checkout master
 $ git merge fixbranch

私はこれで終わりです!ローカルマスターをセントラルマスターにプッシュします

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing


この回答に感謝します。
lasec0203
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.