2016-12-10 20 views
2

gitブランチングとマージに基本的な疑問があります。 ブランチをマスターに変更せずにマージすることはできますか。もしそうなら、マスターとブランチの間に存在するデルタ変更はどうなりますか?それはマスターブランチの変更で上書きされますか?以下のシナリオを参照してください。gitのmasterブランチに変更を加えずにブランチをマージするには?

私は2つのブランチマスターとBugBranchを持っています。

STEP 1:

C--B--A (master) 
     | 
     X (branch) 

は、マスターから枝を取ったBugBranchを言います。 TestMerge.javaというファイルがあります。

public static void main(String[] args){ 
... 
... 
callSomeMethod(); 
    switch(decision) 
    { 
    case A: 
     do_something 
     break; 
    case B: 
     do_something 
     break; 
    } 
} 

したがって、ステップ1では、マスターとBugBranchは同じように見えます。

ステップ2: ファイル(TestMerge)が以下のように変更されました。 私はマスターとブランチをマージしようとすると、問題がある:

public static void main(String[] args){ 
... 
... 
callSomeMethod(); 
} 

C--B--A--1 (master) 
     | 
     X  (branch) 

STEP 3(単なるスイッチを削除)。デルタが存在し、BugBranchの変更を保存したいので、ファイル内のマージの競合が予想されます。しかし、奇妙なことは、マスターが変更されたことです。

は、以下試してみた

gitのチェックアウトのマスター

Gitはこれは本当に混乱してBugBranch

マージコマンド!

+0

BugBranchでこのファイルを変更しましたか? – chaoluo

+2

Gitにはデルタはありません。各コミットは、作業ディレクトリのフルスナップショットです。そして、ブランチはコミットするためのポインタに過ぎません。したがって、 'master'から分岐すれば' X'はなく、 'BugBranch'ブランチは' A'をコミットすることを指します。コミット 'A'をコミット' 1'にマージすると、コミット 'A'はすでにコミット' 1'の履歴の一部になっているので、それはノーオペレーションです。 – PetSerAl

+0

ブランチ 'X'(BugBranch)に変更を加えましたか? – axiac

答えて

2

Gitブランチはコミットのポインタに過ぎません。 XブランチはAをコミットし、多くのGitオペレーションではAの代わりにXを使用することができ、その逆も同様です。

Gitブランチを作成しただけでは、リポジトリに変更が加えられません。ファイルを変更してコミットするまで、ブランチはソースブランチ(あなたの場合はmaster)から分岐しません。

ファイルを変更してmaster(コミット1)にコミットしました。ブランチXで何も変更してコミットしていない場合、ブランチ1の履歴にあるコミットAを指しています(実際はその親です)。

ブランチXをブランチmasterにコミットすると、ブランチXがブランチmasterの過去にあることが検出されます。 masterから始まり、Gitが1つのコミットからその親の1つに繰り返しジャンプすると、ブランチX(これはAコミット)によって指し示されるコミットに到達することができます。

これは、ブランチXにブランチmasterにまだ含まれていないものが含まれていないことを意味します。言い換えれば、マージするものは何もありません.Gitは、この状況について、 "Already up-to-date"というメッセージであなたに知らせます。一方

あなたはmasterXの未来であるため、Xmasterをマージしたい場合は、Gitは「早送り」の操作にマージ操作を変換します。これは、不要な新しいマージコミットを作成せず、ブランチ(マージするブランチ)がmasterコミット(マージ元のブランチ)に達するまで前方にプッシュするだけです。

git mergeコマンドラインのフラグを使用して強制的にマージコミットを作成することはできますが、本当に例外的な状況を除いて、何もする必要はありません。ファイルに変更を加えないコミットが生成されます。

+0

はい--no-ffには、**既に最新の**と書かれています。だから、基本的には、それらの2つのブランチをマージするには何のポイントもありません。 – shashantrika

+0

マージの方向( 'X'は' master'は新しいものを生成しません、 'master'は' X'を 'master'に早送りする必要があります)に依存します。両方のブランチが同じコミットを指しているかどうかを調べるには、['git branch -v'](https://git-scm.com/docs/git-branch)を使用してください。 GUI Gitクライアントを試してみて、状況を視覚的に調べてみてください。 – axiac

関連する問題