2016-03-26 15 views
0

私は長年にわたって作業してきたブランチを持っています。定期的にメインブランチをマージしています。したがって、このブランチの履歴には、メインブランチからのすべてのコミットも含まれます。私はコミットのすべてをブランチ上の1つのコミットにスカッシングしてから、このブランチをマスターに戻してマージしたいと思っています。これはマスターのコミット履歴に影響しますか?GIT:ブランチ上のすべてのコミットをスクラッシュしてからマスタにマージすると、マスタからの以前のマージはどうなりますか?

答えて

1

あなたは間違いなくそれを行うことができます。ブランチ上のすべてのコミットを無効にすることができます。 git pull --rebase origin masterを実行して、すべてが正しいことを確認します。 すべての競合を解決してから、マスターにマージします。

注:通常、あなたはブランチで作業しているオフのもとbranch_aは、マスターではなく、mergeマスターオフあなたrebaseたびにマスター上の変更があることが推奨されるmasterを言うと言います。

+0

マスターからリバースする例がありますか? –

+0

したがって、ブランチ "branch_a"にいる場合は、次のコマンド "git pull --rebase origin master"を実行します。それでおしまい。 –

2

一般的な考えは、VCS内の履歴が保持されることです。したがって、単にコミットを追加するだけでは結果はありません。

しかし、あなたはかもしれません。あなたが望むなら履歴を書き換えてください。元の履歴を既に公開していて、他の人がそれに依存している(つまり自分の上に独自のコミットを作成した)場合、そのような履歴の書き換えは、彼らの新しい歴史の上の変化。

しかし、履歴がまだ公開されていない場合や、同僚と交渉することができ、変更に同意している場合は、あなたの行動は自由です。

更新: 変更されたブランチがマスターからいくつかのマージを持っているので、私はコミットの初期画面は多少このようになっていることとします

<letter> sが B<letter> sは masterコミット、ある
A ---> B ---> C ---> D ---> E --> F (master) 
    \    \   \ 
    --> BA --> BM1 -> BB --> BM2 --> BC (branch) 

「自分」branchがコミットし、BM<number>masterからbranchのマージになります。

今あなたがスカッシュしたいが、ブランチにコミットし、最後の絵は次のようになりますように:

A ---> B ---> C ---> D ---> E --> F (master) 
    \       \ 
    -----------------------> BZ (branch) 

BZのファイルツリーBCファイルツリーとまったく同じであることをコミットします。

マージコミットに関する既定の動作git rebaseは、マージレコードを削除する履歴をフラットにすることですが、対応するマージによって導入された変更を再生します。あなたは、単にgit checkout branch; git rebase -i Aを発行し、単一のものにコミットスカッシュしたがって、もし、あなたがこのような何か受信します:

A ---> B ---> C ---> D ---> E --> F (master) 
    \       
    -----------------------> BZ (branch) 

EBZ間のミッシングリンクを気づか)

をだから我々はいくつかを実行する必要がありますリベースの魔法タスクを簡略化するために、tagAマーキングコミットAtagEマーキングEtagBCBCとして作成します。これらのタグは、ジョブが完了した後に安全に削除することができます。

これで準備は完了です。問題git rebase -i tagA。挿入偽のマージは、リストの一番上に

pick 515de5f commit BA 
pick 1c749c6 commit B 
pick 4490402 commit C 
pick 4da9e96 commit BB 
pick 6d9dc01 commit D 
pick 7e469d6 commit E 
pick 861038b commit BC 

、あなたはこのような何かを取得しますので、fixup sのすべてpick Sを置き換えます:あなたはこのようなリストが表示されます

exec git merge -s ours -m "The resulting commit" tagE 
fixup 515de5f commit BA 
fixup 1c749c6 commit B 
fixup 4490402 commit C 
fixup 4da9e96 commit BB 
fixup 6d9dc01 commit D 
fixup 7e469d6 commit E 
fixup 861038b commit BC 

ファイルを保存して終了します。シーケンスが適用されると、望ましいコミット構造が得られます。 BZ(書き換えの先頭がbranch)が前のものと同じであるかどうかをテストしてください(tagBCとマークされています)。

git rebaseのすべての標準プラクティスが適用されます。何か問題が発生した場合は、いつでもgit rebase --abortで再開できます。いくつかの競合が発生した場合は、それらを解決し、git rebase --continueのように続ける必要があります。

+0

アイデアは、私がマスターにこれを1つのコミットとしてブランチでマージするのを見せたいということです。私が混乱しているのは、私が特定の地点でマスターを枝分かれし、マスターを途中で併合し続けるという事実です。だから私がすべてのコミットを押しつぶした場合、マスターはマージの違いだけを記録しますか?言い換えれば、マスタはブランチヒストリ上のブランチへのすべての以前のマージを無視するので、各変更に対して2つのコミットハッシュは存在しませんか? –

関連する問題