2013-05-01 3 views
6

私のチームは10名ほどの開発プロジェクトにGitHubを使用しています。私たちにはメインのdevelopブランチがあり、開発ブランチを作成してから、開発ブランチをdevelopにマージします。コードレビューを行うためにプルリクエストを使用します。すべての標準的なもの。ブランチを比較するときにGitHubでマージコミットを「隠す」方法はありますか?

しかし、1つのことが私を悩ましています。

開発者Aは、myFeatureという名前の機能ブランチを作成します。このブランチでは、彼は1つのファイル、例えばLoop.javaに1行の変更を加えます。

一方、他の開発者は、無関係のコミットを他のブランチからdevelopにマージします。

開発者Aが変更をプッシュしてプルリクエストを発行する前に、彼は自分の変更が最新のdevelopブランチで動作するようにしたいと考えています。このように、彼は彼のブランチにdevelopのHEADをマージします。

git checkout develop 
git pull 
git checkout myFeature 
git merge develop 
# testing and stuff 
git push origin myFeature 

最後のコマンド(git merge develop)は、常に新しいコミットになります。したがって、開発者Aが変更をプッシュしてmyFeatureのプルリクエストを発行すると、プルリクエストのレビュー担当者はブランチmyFeatureに101コミットを追加して表示します.1つはLoop.javaに変更され、もう1つは無関係であり、 developに統合されました。ここで彼らは、この支店のdeveloperAによって実際に変更されたものを隠すための騒音としてのみ役立ちます。

レビュー者が開発者のA変更によって何が変更されたかを簡単に知る方法はありますか?developを使用してマージのコミットを何らかの形で隠すか?私は特に、プルリクエストビューの "ファイル変更"タブについて考えています。 (私は「コミット」タブを使用して、何が変更されたかを見るために1つ1つずつコミットすることができますが、コミットがたくさんあると面倒です。 "ファイルが変更されました"タブ)

編集git rebase developがオプションとして提案されていますが、私たちの目的には適切ではないと思います。しばしば、複数の開発者がmyFeatureに取り組んでいるので、rebaseは履歴を書き換えるので誰もが邪魔する可能性があります。

EDIT 2:はい、それはマージが(完全に罰金です)プル要求のタブを「コミット」にコミット表示されますが、下:@kanが親切に下記の指摘したように、GitHubには、実際にうまく動作しています[ファイル変更]タブには、この機能ブランチで変更されたファイル(マージからのものではなく)のみが一覧表示されます。これはまさに私が探しているものです。

+0

Aの 'myFeature'ブランチが' develop'から分岐していて、 'develop'の最新の変更をマージした場合、GitHubに何百もの追加コミットが現れるはずはないと思います。そのブランチに固有のものです。 Aは間違ったブランチにプルリクエストをしていますか?開発するのではなく「マスター」にしますか? –

+0

@ColdHawaiian:いいえ、Aは '開発する 'から分岐し、'開発する 'をマージし、'開発する 'に合併するように要求します。だから、私も混乱していた。 – stepthom

+0

もう1つの可能性は、Aの開発履歴のバージョンが既に変更されていることです(つまり、コミットシャーは対応するコミットで異なります)。おそらくAのコミットは 'rebase'、' cherry-pick'、 'commit --amend'で書き直されていますか?コマンドラインからGitを使うか、GitHub for WindowsのようなGUIを使っていますか? GitHub for Windowsは暗黙のうちにリベースすることで奇妙なことをする。 –

答えて

5

git rebase developになるのではなく、1つの方法が実行されます。これにより、マージコミットが発生することはなく、新しいコミットの末尾に新しいコミットが配置されます。

履歴には、プル要求で変更された新しいコミットのみが表示されます。 IMOではこれも履歴を非常に線形に保ちます。

+2

他の開発者もブランチを引っ張っている可能性があるので、フィーチャーブランチが既にリモートサーバーにプッシュされていると、 'git rebase'は良いアイデアではありません。本当?また、rebaseはどのようにマージ競合に対処しますか? – stepthom

+0

はい、それは本当です。それが追い出された歴史を書き換えることになるからです。 rebaseが動作する方法は、gitが分岐が分岐した場所にロールバックし、リモートからの変更を取り込んで、一度に1つずつロールバックすることです。したがって、競合が発生した場合は、先に進む前にコミットを変更します。この歴史の変化のために、あなたはそれに注意したい。 – Schleis

+0

@doofuslargeはい、基本的には、ブランチを持つすべての開発者もリベースを行う必要があります。あなたが 'git help rebase'を注意深く読むと、それはそれを「波及効果」と表現します。 gerritはチェンジセットの概念を導入し、よりエレガントな方法でそれを扱うことができます。 – kan

1

はい、リベースすることができます。

git checkout myFeature 
git fetch 
git rebase origin/develop 
git checkout develop 
git merge @{upstream} 
git merge myFeature # it will do fast-forward, so no merge commit 

ただし、myFeatureが他の開発者と共有されていない場合にのみリベースを使用するようにしてください。

ところで、私たちはゲリットを使用しています。マージする前にrebase a changesetにすることができます。もちろん、競合がない場合にのみ動作し、存在する場合は、ローカルでrebaseを行い、チェンジセットを再サブミットする必要があります。

関連する問題