web-dev-qa-db-ja.com

GitHub / BitBucketでmerge-commit hellを回避する方法

リポジトリでこのような多くのコミットが行われています:

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

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

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

ローカルでVMのみ、GitHub/BitBucket UIに同等のものがあれば、git rebaseを実行できます。

どうやってやるの?

82
Niklas9

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

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

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-only

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

117
Todd A. Jacobs

既に述べた「Todd A. Jacobs」は「リベース」という概念です。これは、より詳細な方法です。

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

$ git branch
  * master

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

$ git checkout -b fixbranch

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

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

$ git checkout master
$ git pull Origin master

マスターを使用してフィックスブランチをリベースし、クリーンな履歴を保持し、ローカルリポジトリ自体に競合がある場合は競合を解決します。

$ git checkout fixbranch
$ git rebase master

これで、fixbranchは中央マスターで最新になりました。fixbranchをmasterブランチにマージします。

 $ git checkout master
 $ git merge fixbranch

私はこれで終わりです!ローカルマスターを中央マスターにプッシュさせます

$ git Push Origin master

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

2
Kondal Kolipaka