2013-02-12 15 views
11

開発中に、私はしばしばコミットし、 "中間"コミット、つまりコードをコンパイルできないか、何かを変更する途中などでコミットする必要があります。そのようなコミットを行いますが、これはオフィスから家への私の仕事を簡単に続けるために必要です。時には他の開発者が自分の仕事を始めるための基礎を得ることもあります。あるブランチから別のブランチへのコミットを含まずにGitをマージする

私はその問題の解決策を見つけたと思った:

  1. 私は別の「DEV」ブランチを作成し、すべての中間のコミットを作ります。

  2. コードが正常な状態になったら、マスターにマージします。したがって、マスターには「中間」コミットは含まれず、「通常」コミットだけが含まれます。

  3. "dev"ブランチをすべての中間コミットで削除します。

しかし、これは機能しません。私がマージすると、マージコミットだけでなく、すべての "中間"コミットも "dev"ブランチからコミットされます。したがって、 "dev"ブランチを削除すると何も得られません。 "中間"コミットはそこにとどまります。

質問には次のようなものがあります:マスターが自分自身のコミット+マージコミットのみを含み、2番目のブランチからのコミットを含まないようにマージすることは可能ですか?不可能な場合は、目標を達成する方法を教えてください。中間結果を一時的に保存する機能と、後でシームレスに削除する機能がありますか?

答えて

16

あなたがマスターにあなたの「DEV」ブランチをマージするとき、

git checkout master 
git merge --squash dev 
git commit -m "Add new feature." 

を試してみてください--squashオプションが一つの大きな変更にあなたの中間のすべての変更をスカッシュします。

もっと細かい制御が必要な場合は、git rebase --interactiveを使用することもできます(たとえば、reordering commitsと複数の小さなスクラッシュを行う)。 This answergit merge --squashgit rebase --interactiveの違いを説明しています。

+0

彼は他の開発者とこれらのコミットを共有しているので、スカッシュは良い考えですか? – jszakmeister

+1

+1は 'git rebase -i'と言います。そして、人々は本当にローカルのdevブランチについて知りませんでした。 –

+1

@jszakmeister、彼は地元のdevブランチの変更をマスターのローカルチェックアウトにマージしているので、それは問題ありません。彼が変更をプッシュすると、他の開発者には変更が1つの大きなコミットであるかのように見えます。言い換えれば、squashingは複数の "Oops。Fix typo"の代わりに "Add a new feature"という1つのコミットを持つことができます。 –

-1

マージ中にコミットを削除することはできません。あなたは中間のコミットを破棄することができますが、これはあなたがそれらを公開するときにおそらくあなたにとってうまくいかない悪い考えです。マージ(git merge --squashに続いてgit commitが続く)せずにマスターブランチにスクラッシュし、マスターブランチをdevブランチにマージすることもできます。何をしたい

+0

あなたのdownvoteを説明してください。 – wRAR

2

は「スカッシュ」はマージです:

git checkout master 
git merge --squash dev 
git commit -m 'current stable work from dev branch' 

これがないと、すべての中間のコミットとコミット定期的なマージと作業ツリーに同じ状態を作成しているが、マージを作成しません。祖先として。中間のコミットは、masterブランチの履歴には含まれません。 git mergeマニュアルページからこのオプションのドキュメントは言う:

は本当のマージ(マージ情報を除く) が起こったかのように作業ツリーとインデックスの状態を作り出すが、実際 コミットまたは移動することはありません。 HEAD$GIT_DIR/MERGE_HEADを記録して、次のgit コミットコマンドでマージコミットを作成させないでください。これにより、 を別のブランチ(またはタコの場合はさらに)をマージするのと同じ効果を持つ現在のブランチの上に 単一コミットを作成することができます。

0

RC(リリース候補)と呼ばれる別のブランチを追加します。このブランチには、完成したフィーチャーブランチのマージのみがあります。開発者は未完成のブランチを一緒に試してみることができます。マージされたフィーチャだけを含むマスタリリース候補に統合するだけです。

関連する問題