2016-07-25 24 views
1

あるブランチから別のブランチに変更をマージする方法について質問があります。git - 1つのコミットとして一連のコミットをマージする

Dは、M Fは、理想的にはM.オフ、再作成される前に、Dオフに作成されたマスター(M)、機能(F)開発(D):

は、3つの分岐があります。ここでは、物事の仕組みですFから階層構造で作成されている必要があります。

 M 
     | 
     | 
     F 
     | 
     | 
     D 

Mは、他のコミットからの変更を常に最新の状態に更新します。

私のDブランチで、変更は一連のコミットで構成されていますが、これはFに1つのコミットとしてマージしたいものです。それ、どうやったら出来るの?これは、後でMに併合されます。

DとFは感謝M.

で別のコミットを分岐することができることに注意してください!

答えて

7

は今私のDの枝に、変更は私は1つが

git checkout F 
git merge --squash D 
git commit 
+0

'git log'を実行すると、出力には一緒に押しつぶされたコミットのリストが表示されます。それを行う方法はありますか?「マージ」というコメントを持つ新しいコミットIDだけが表示されますか? – Maddy

+1

はい、 'git commit -m 'を使用してください。ここで空の 'git commit'は' merge --squash'のデフォルトを使います。これはブランチコミットの連結リストです。 – RJFalconer

+0

非常にきちんとした、また、おそらくリベースが含まれていないので、おそらく最も安全な方法です。 –

1

私のDブランチでは、変更は一連のコミットで構成されていますが、これをFにマージしてコミットしたいと思います。それ、どうやったら出来るの? (、git help rebaseは同様に十分なはずですが、それは実際には非常に複雑ではありません)

git checkout D 
git rebase -i F  # pick "squash" for every commit 

git checkout F 
git merge D 

は良い例えばhttp://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.htmlを参照してください。基本的には、あなたに提供されたファイルをgit rebase -iで編集し、すべての行に "squash"と入力します。

これは、後でMにマージされます。

git checkout M 
git merge F 
2

あなたはgit rebaseコマンドを探しています。単純なケースの場合は、代わりに

git checkout D 
git rebase F 

を行い、これは単一のコミットにスカッシュません

git rebase D F 

を行います。これを行うには、おそらく、少なくともエラーが発生しやすいオプションは、対話型のコミットを行うことになります。

git checkout D 
git rebase -i F 

これはリベースしようとしているDでコミットとエディタが表示されます。

pick 293a24d Some commit message 
pick a015bbe Some commit message 
pick e19f4fa Some commit message 
pick 40ae959 Some commit message 
pick fba6b72 Some commit message 

# Rebase 419206d..fba6b72 onto de95063 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

は指示に従ってくださいとsquashの代わりpickで開始するすべてが、最初の行を変更します。それは次のようになります。これにより、エディタを保存して終了するとメッセージをマージするオプションが提供されます。

またはpickrewordに変更し、残りの部分をfixupに変更することができます。これにより、最初のコミットメッセージのみが表示されます。このオプションは、すべての古いコミットメッセージを完全に破棄したい場合は、より簡単です。

あなたは非常に冒険を感じている場合は最後に、あなたは自動的にリベースの最初のインタラクティブな部分をバイパスし、コミットリストをフィルタリングすることができます

EDITOR='sed -i -e "2,$s/pick/squash/"' git rebase -i F 

これは自動的に始まるすべての行にsquashpickを変更します2行目は、通常のインタラクティブエディタの代わりにsedでエディタファイルをフィルタリングします。

+0

リベースがであなたを残すことができる強力なツールですコミットとしてFにマージしたいコミットの一連の構成しますあなたが慎重でないなら奇妙な状態。このコマンドを初めて使用する場合は、先に進む前にレポをバックアップすることをお勧めします。 –

+0

-1;これはOPが求めていることをしません。はい、彼はDはMよりもFから分岐するべきだと言いますが、それは彼の質問ではありません。彼はコミットを1つのコミットにスカッシュしたいと思っています。これは簡単なrebaseが行うことではありません。 – RJFalconer

+0

@JoeChryslerこれは悪いアドバイスだと思います。 Reposは、ソース管理に関係なくバックアップされる必要があります。このようなコメントは、人々が 'git'の使用を恐れているだけです。質問者が実際に 'git rebase --abort'や' git checkout'/'git reset'が修正できないように、彼のレポを現実的に混乱させることができますか? – RJFalconer

関連する問題