2つのブランチをGITでマージする


131

私はGITを使い始めたばかりで素晴らしいと思いますが、mergeコマンドの機能について少し混乱しています。

ブランチ「A」に作業中のプロジェクトがあるとします。

家に帰り、このブランチに変更を加えて、「B」という名前で保存します。別のプログラマーが "A"を変更し、 "C"として保存します。

2つのブランチ「B」と「C」をマージして、変更を新しいブランチとしてコミットする方法はありますか、「D」と言いますか?

または「マージ」のポイントを逃していますか?


別のブランチで「変更を保存」する必要はありません。Aを処理してから、それらの異なるAをマージする
knittl 2010

私はついていません。Aは私のローカルコンピュータにあり、dev1は彼のコンピュータにAのコピーを持ち、dev2は彼のコンピュータにAのコピーを持っています。両方の開発者が変更を行いますが、これらの変更をどのようにマージしますか?
dotty

回答:


196

merge 2つ(またはそれ以上)のブランチをまとめるために使用されます。

小さな例:

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

だから今は異なるヘッドを持つ3つの別々のブランチ(つまりABとC)があります

変更をBおよびCからAに戻すには、Aをチェックアウトし(この例ではすでに実行済み)、次にmergeコマンドを使用します。

# create an octopus merge
$ git merge B C

すると、履歴は次のようになります。

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

リポジトリ/コンピューターの境界を越えてマージしたい場合はgit pull、たとえばブランチAのPCからコマンドを見てください(この例では2つの新しいコミットが作成されます)。

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C

つまり、両方のブランチが同じコードを変更しました。conflitcsを修正してgit add conflicting_filesからgit commit
knittl

Aのファイルに「hello」という単語が含まれていて、Aが「HELLO」に修正し、Bが「Hello world」に修正したとします。これらのファイルをマージするとどうなりますか?
dotty

おっと、Bが修正し、Cが修正したことを意味します。
dotty

gitでは別の意味(既存のコミットの変更)を意味する「修正」という語に注意してください。一方で「hello」ファイルを「HELLO」に、もう一方で「Hello World」にファイルを変更すると、マージの競合が発生します
knittl

19
@dotty:gitはしばしば魔法のように見えますが、実際にはあなたの心を読み取ることができません。2つのブランチが同じコンテンツに2つの異なる変更を加えた場合、人間だけがそれらを調整する方法を理解できます。それがマージの競合です。
Cascabel

47

あなたはの変化マージしたい場合はサブブランチMainBranchを

  1. あなたはMainBranchにいるはずです git checkout MainBranch
  2. 次にマージコマンドを実行します git merge SubBranch

2
@luckytaxi:同意し、時にはそれよりも少ない
Marcelo Scofano

これを元に戻すことはできますか?
Yohanelly

0

ケース:デフォルト作成されたマージコミット無視する必要がある場合は、次の手順に従います。

たとえば、新しい機能ブランチがすでに2つのコミットがあるマスターからチェックアウトされているとします。

  • 「追加A」、「追加B」

Checkout a new feature_branch

  • 「Cを追加」、「Dを追加」

次に機能ブランチは2つのコミットを追加します->

  • 「追加E」、「追加F」

ここに画像の説明を入力してください

ここで、feature_branchの変更をマスターにマージする場合git merge feature_branchは、マスターに座ってください。

これにより、すべてのコミットがマスターブランチに追加されます(マスターに4つ+ feature_branchに2つ=合計6)+ 'Merge branch 'feature_branch'マスターが分岐しているため、マージコミットのようなものを追加ます。

これらのコミット(FBで行われたもの)を本当に無視して、feature_branchで行われた変更全体を'Integrated feature branch changes into master'、Run などの単一のコミットとして追加する必要がある場合git merge feature_merge --no-commit

--no-commitを使用すると、マージが実行され、マージコミットが作成される直前に停止します。機能ブランチに追加されたすべての変更がマスターになり、新しいコミットを独自のものとして作成する機会を得ます。

詳しくはこちらをご覧くださいhttps : //git-scm.com/docs/git-merge

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.