2017-04-26 20 views
0

通常、ブランチをマスターからスカッシュにマージする前に、小さなコミットを修正する前に(コミットメッセージは単に「リファクタ」です)、マスターと子の両方をマージしたより大きく複雑なブランチではどうしたらいいですか?様々なステージ?私はこの単純なシナリオ(グーグル・グーグル)に基づいてrebaseが動作すると確信しています:git - マスターにマージする前に複雑なブランチをクリーンアップする方法は?

* (newest commit) 
    |\ 
    * | 
    | * grandchild 
    * | 
    |/ 
    * child 
    | 
/
| 
* master (oldest commit) 

しかし、これはどうですか?

* (newest commits) 
    |\ 
    * | 
/| * grandchild 
* * | 
| |/ 
| * child 
* | 
|/ 
| 
* master (oldest commit) 

多大な労力をかけずにこの履歴を簡略化する方法はありますか?私はちょうどgit rebase -i masterを試して、多くの競合があります(そのうちのいくつかはrerereのおかげで空白ですが、解決するのは難しいものがあります)。明確にするために、これは私の望ましい結果である(明らかに私達はちょうどキャッチアップマスターにマージ実行することができますし、我々は線形の歴史を持っています;子ブランチのコミットの最終的な数は任意である):

* (newest commit) 
    | 
    * child 
    | 
/
| 
* master (oldest commit, though newest in master) 

私の謝罪これが重複した質問であれば、それは可能です(ただし、私の問題を具体的に解決するものは見つかりません)。

+1

この場合、 'rebase -i'を試しましたか? –

+0

あなたは 'rebase -i'を使い、無用なコミットを落とす必要があります(コンフリクトを解消するために変更を保存してください) –

+0

@JoshLeeはい - rerereでも多くの競合があります – AlexMA

答えて

1

いくつかのオプションがあります。

まず、rebase -iとなります。これは試してみる価値があります - これはgitですので、必要に応じて前の状態に戻ることができます。 (rebaseを起動するとbranch-Xになっていて、すべてが間違っている場合、(a)rebaseはbranch-X refのみを変更し、(b)reflogを使用してそれを元に戻すことができることを知っているので、

git reset --hard [email protected]{1} 

と害は行われません。)

が今では、いくつかの特定の方法で失敗した場合、または権利を取得することが非常に困難と思われる場合、それが問題のために)より多くの情報(およびIMOよりよい出発点です。バット私は、この特定のケースのために、「スカッシュマージ」は、すべてのシングルでのマージに関与していることでしょうどんなトポロジー交換についてあるよう

git checkout child 
git merge --squash branch-X 
git commit 
git branch -f branch-X 

を行うことが容易になるかもしれないと思う、と述べ

コミット。

いずれにしても、実際にはとなります。あなたはこのことをやっています。あなたが置き換えているコミットがリモートにプッシュされていると、ベストプラクティスはそれをしないと言います。これは通常、リベースについての注意点として述べられていますが、履歴を変更する操作にも適用されます。

+0

私はマージコマンドのフレーズ'git merge --squash branch-X'または' git merge --squash newest-commit'として実行します。同じ結果でなければなりません –

+0

私は現在、 'child'に乗っていて、gitの" already-to-date "を取得しています。私はこれが正しい軌道でなければならないと思う。 – AlexMA

+0

私はマスターの新しいブランチを作成しましたが、 'git merge --squash child'が動作しました。ニース! – AlexMA

関連する問題