マスターからGitブランチを更新する


674

私はGitを使い始めたばかりで、次のような状況にあります。

  • 4つのブランチ(master、b1、b2、およびb3)があります。
  • b1-b3に取り組んだ後、他のすべてのブランチにあるはずのブランチマスターに変更を加える必要があることに気付きました。
  • 私は必要なものを変更しましたmaster...ここに私の問題があります:

他のすべてのブランチをmasterブランチコードで更新するにはどうすればよいですか?



58
さらに別の単純なタスクがGitによって困難になりました。Git開発者は、SDLCループのフィードバックとしてスタックオーバーフローを使用する必要があります。300,000人は、Gitのワークフローに重大な問題があることを示しているはずです。UXのエキスパートを雇う必要があるのは、自分でgitを実行するのは明らかに難しいためです。
jww 2018

回答:


619

次の2つのオプションがあります。

1つ目はマージですが、これによりマージ用の追加のコミットが作成されます。

各ブランチをチェックアウト:

git checkout b1

次にマージします:

git merge origin/master

次にプッシュ:

git push origin b1

または、リベースを行うことができます:

git fetch
git rebase origin/master

14
私はこのアプローチについて心配しています。git log --graphを実行すると、グラフはマスターが実際にトピックブランチにマージされていることを示しています。これは長期的に問題を引き起こしますか?ベストプラクティスは、常にトピックブランチをマージしてマスターに戻すことだと思いました。コメントしてください。
Patrick

2
マージワークフローを使用する場合は、この問題に注意してください。randyfay.com
node

22
マスターをb1にマージしています。なぜあなたはgot push origin master...意味がありません。あなたはマスターブランチを変更していません。私はそれが119の賛成投票の誤りだと思います:/
イヴ・ランゲ

22
マージ方法は使用しないでください。git rebase master正しい答えが使用されます
Weston Ganger

6
後で読む人のために-誤植に関する@Kursionの懸念は、著者の編集によって対処されました。また、下から2番目に高い回答の回答は、基本的にこの回答と同じですが、ブランチ構造の図と、リベースしたくない理由に関する警告が表示されます。
18

494

基本的に2つのオプションがあります。

  1. あなたはマージします。これは実際には非常に単純で、完全にローカルな操作です。

    git checkout b1
    git merge master
    # repeat for b2 and b3
    

    これにより、発生したとおりの履歴が残ります。マスターから分岐し、すべてのブランチに変更を加え、最後にマスターからの変更を3つのブランチすべてに組み込みました。

    gitこの状況を非常にうまく処理でき、同時にすべての方向でマージが発生するように設計されています。すべてのスレッドを正しくまとめることができると信頼できます。これは単に分岐するかどうかを気にしないb1マージmaster、またはmasterマージb1、マージがすべてのgitに同じルックスをコミットします。唯一の違いは、どのブランチがこのマージコミットを指すようになるかです。

  2. あなたはリベースします。SVNまたは同様の背景を持つ人々は、これをより直感的に理解します。コマンドはマージの場合と類似しています:

    git checkout b1
    git rebase master
    # repeat for b2 and b3
    

    このアプローチは、すべてのブランチで線形履歴を保持するため、好まれています。しかし、この線形の歴史は嘘であり、あなたはそれがそうであることに注意する必要があります。このコミットグラフを考えてみましょう:

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1
    

    マージは真の歴史をもたらします:

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1
    

    ただし、リベースはこの履歴を提供します。

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1
    

    ポイントはコミットということ、であるE'F'G'本当に存在しなかっ、そしておそらくテストされていませんでした。それらはコンパイルさえしないかもしれません。特にの変更がでmasterの開発にとって重要である場合、リベースを介して無意味なコミットを作成することは実際には非常に簡単b1です。

    この結果は、次の3つのコミットのどれを区別することができないということであってもよいEFと、G実際の値を減少させる、回帰を導入しましたgit bisect

    使用すべきではないと言っているのではありませんgit rebase。それには用途があります。しかし、それを使うときはいつでも、あなたは歴史について嘘をついているという事実を認識する必要があります。そして、少なくとも新しいコミットをコンパイルしてテストする必要があります。


私は別のソースブランチ(マスターではない)をマージしており、この素晴らしい答えに追加する追加の手順は、マージする前にローカルリポジトリでそれを更新することでした(最新のコードをローカルに保持するため)git checkout <source branch> git pull。その後、上記を続行します:git checkout b1...
ロッド

3
私は長年のSVNユーザーとして、リベースよりもマージオプションを好みます。バージョンコントロールを使用する場合、行った変更とその理由を正確に記録することが非常に重要です。見かけの履歴を簡略化するためのリベースの魅力を見ることができますが、戻ってE '、F'、G 'のコミットコメントに追加する必要があります。できれば、リベースをそれらのコメントに自動的に追加してください。そうでない場合、ビルド/テスト/テストデプロイプロセスがG 'で中断した場合、完全な情報なしに変更が行われた理由を解明する必要があります。
WillC、2016年

12
歴史はうそです
海賊マーレイ

ありがとうございます。「git merge any-branch-name」を使用して、1つのブランチコードを別のブランチにマージします。ローカルで、ブランチ2にいる間にブランチ1のコードをテストできます
Priti

1
@blambマージの競合はとの両方git mergeで発生しgit rebaseます。それらを回避することはできません。git rebaseリベースのいくつかの段階を隠すことができるという利点があります(つまり、同じブランチをいくつかの異なるコミットに順番にリベースして、各段階での競合の量を減らします)。それにもかかわらず、リベースが歴史について嘘をついているという単なる事実は、そのような多段階のリベースでうまくやりくりすることをはるかに簡単にします...それは、私が常にマージを好む理由です、それは私がいくつかのマージコミットで履歴を乱雑にする必要があることを意味するときでさえ。
cmaster

238

git rebase masterこれを行う適切な方法です。マージは、マージのためにコミットが作成されることを意味しますが、リベースは作成されません。


52
すでにオリジンにプッシュしている場合はどうですか。リベースすると、コミット履歴が書き直され、リモートブランチと競合します。リベースはプルで、またはリモートブランチにプッシュしていない場合にのみ使用する必要があると思います。
Matt Smith、

6
リモートブランチで作業しているのがあなただけの場合は、git push --force origin機能を使用して、リモートブランチをリベースのローカルブランチで更新できます。stackoverflow.com/questions/8939977/...
stormwild

7
両方の作業をリベースおよびマージします。リベースはよりきれいな履歴グラフを提供するため、プライベートブランチに最適です。この答えは最高です
Junchen Liu

5
明快さ(シングルユーザーまたは小規模チームに最適)と散らかった真実(複数の貢献者のコードブランチ-保守性に必要(私の経験では-YMMV))の間のトレードオフについて明確にする必要があります。
WillC、2016年

1
「あなたがすでにプッシュした場合はどうなりますか?」-> git rebaseのゴールデンルールは、それをパブリックブランチで使用しないことです。
Trevor Boyd Smith、

53

ブランチのオンとオフで作業している場合、または何かを作業しているときに他のブランチで多くのことが発生した場合は、ブランチをマスターにリベースするのが最善です。これにより、履歴が整理され、物事をより簡単に追跡できるようになります。

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

ノート:

  • 他の人と共同作業したブランチをリベースしないでください。
  • 常にマスターであるとは限らない、マージするブランチをリベースする必要があります。

http://git-scm.com/book/ch3-6.htmlにリベースに関する章があり、ウェブ上には他の多くのリソースがあります。


単純な解決策をありがとう
他の背の高い男

18

@cmasterが最も精巧な答えを出しました。簡単に言えば:

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

将来の参照のために、ブランチ履歴を書き直さず、実際の状態に保つ必要があります。マージしてマスターする間、1つの追加のコミットが作成されますが、それは安価です。コミットメントには費用はかかりません。


13

(バックアップ)などの他のブランチをマスターブランチコピーで更新します。どちらの方法でも実行できます(リベースまたはマージ)...

  1. リベースを実行します(バックアップブランチに対して追加のコミットは行われません)。
  2. ブランチをマージする(バックアップブランチへの追加のコミットが自動的に行われます)。

    注:Rebaseは新しいベース(新しいコピー)を確立することに他なりません

git checkout backup
git merge master
git push

(backup2などの場合は、他のブランチについても繰り返します。)

git checkout backup
git rebase master
git push

(backup2などの場合は、他のブランチについても繰り返します。)



1

この問題には2つのオプションがあります。

1)git rebase

2)gitマージ

マージの場合は上記の両方との差分のみ、履歴に追加のコミットがあります

1)git checkout branch(b1、b2、b3)

2)git rebase origin / master(git rebase --continueを実行して競合がローカルで解決された場合)

3)git push

または、git mergeオプションも同様の方法です

1)git checkout "your_branch"(b1、b2、b3)

2)git merge master

3)git push


0

マスターからブランチを更新するには:

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