2016-05-30 6 views
0

私たちの開発者の中には、マスターでコミットしていないものがあります。私はそれをきれいにしたいので、マスターのすべてのコミットは動作するバージョンです。マスターから別のブランチにコミットを除外する方法

A - B - C - D - E - F 

別のブランチへの1つ以上のコミットを抽出する方法::

は、我々は、以下のコミットがあると仮定し

A - B   E - F 
     \  /
     C - D 

編集:

  • C及びDがあるべきコミット除去された。
+0

'master'ブランチからコミット' C'と 'D'を削除したいのですか、あるいはそれらを別のブランチに"抽出 "したいだけですか? –

+0

編集した質問。 – SimpleMath

+2

リモートの 'master'ブランチからコミット' C'と 'D'を削除すると、多くの開発者が自分のローカルブランチを削除してスクラッチから引っ張ってしまうかもしれません。 –

答えて

2

実行します。

git rebase -i B 

が次にあなたが選ぶと-iフラグは、エディタが表示されます意味インタラクティブ、の略B.

以降に導入されたコミットから選択することができます(コミットメッセージを編集するときと同じように、デフォルトではviです)、各行にコミットのリストがあります。行を削除してコミットをスキップしたり、コミットの順序を入れ替えたり、2つ以上のコミットを1つのコミットに結合することもできます。

さらに詳しい情報は、公式なgitのドキュメントのRewriting Historyの章を参照してください。

1

あなたはそれが公共の(そしておそらく多くの開発者によって使用中)であるにもかかわらずmasterブランチの歴史を書き換え許容することができるように見えるので、あなたが次の戦略を検討することができます

  • git cherry-pickCし、 Dはその順序でCを削除し、Dする
  • git rebase --interactivemaster分岐が
012をコミットし、新しいブランチにコミットここで

git checkout new_branch 
git cherry-pick dk8cnj2 
git cherry-pick dn52bd6 

は、cherry-pick後に面白いに見える文字列が実際にCDコミットのSHA-1ハッシュされ、q.v.:

まず桜は新しいブランチにCDコミットを選びます以下。これはGitに実際のコミットを参照するように指示する方法です。

今、あなたはCDコミットを引き揚げていることを、あなたはmasterブランチからそれらを削除するには、対話型リベースを開始することができます。

git rebase -i HEAD~4 

これはあなたの最も最近のリストを示すエディタを起動しなければなりません4コミット(cf.HEAD~4)は次のように、最新の最古のために:

pick 9m38b2f Commit E 
pick ldkj093 Commit F 

pick dk8cnj2 Commit C 
pick dn52bd6 Commit D 
pick 9m38b2f Commit E 
pick ldkj093 Commit F 

)すなわち削除(エディタで次のようにあなたを残して、CDをコミットの行をを削除します

ファイルを保存して閉じ、リベースを続行します。この後、masterブランチからCDのコミットが効果的にスプライスされます。さて、あなたはローカルでこれをしなかった、そしてあなたもmasterの歴史を書き直しているので、あなたがリポジトリにプッシュ強制する必要がありますので、:

git push --force origin 

が、これはmasterの歴史を書き換えることに留意してくださいその支店で働いている他の人に混乱を引き起こす可能性があります。これに対処する1つの方法は、インタラクティブ・リベースを完了した後、すべての人にmasterの作業を凍結させるように指示することです。翌朝、誰もがローカルmasterを削除し、新しいコピーをチェックアウトします。

0

TMGが提供する対話型リベースのもう1つの解決策は、マスターに一時的なブランチを作成し、マスターをリセットしてBをコミットし、チェリーピックアップで保持する必要があるすべてのコミットを選択することです。

これらのコマンドが表示されます。警告:現在の変更を加えたり、隠したりしないでください。

// Starting point 
git checkout master 
// Create a new branch to avoid loosing some commit 
git branch tmp 
// Change master HEAD 
git reset --hard master commit_B 
// Get the commits you want 
git cherry-pick commit_E 
git cherry-pick commit_F 
// DONE, you can clean up tmp branch if you don't need commit C and D (you will loose them) 
git branch -D tmp 
関連する問題