私はGitを使い始めたばかりで、次のような状況にあります。
- 4つのブランチ(master、b1、b2、およびb3)があります。
- b1-b3に取り組んだ後、他のすべてのブランチにあるはずのブランチマスターに変更を加える必要があることに気付きました。
- 私は必要なものを変更しました
master
...ここに私の問題があります:
他のすべてのブランチをmaster
ブランチコードで更新するにはどうすればよいですか?
私はGitを使い始めたばかりで、次のような状況にあります。
master
...ここに私の問題があります:他のすべてのブランチをmaster
ブランチコードで更新するにはどうすればよいですか?
回答:
次の2つのオプションがあります。
1つ目はマージですが、これによりマージ用の追加のコミットが作成されます。
各ブランチをチェックアウト:
git checkout b1
次にマージします:
git merge origin/master
次にプッシュ:
git push origin b1
または、リベースを行うことができます:
git fetch
git rebase origin/master
got push origin master
...意味がありません。あなたはマスターブランチを変更していません。私はそれが119の賛成投票の誤りだと思います:/
git rebase master
正しい答えが使用されます
基本的に2つのオプションがあります。
あなたはマージします。これは実際には非常に単純で、完全にローカルな操作です。
git checkout b1
git merge master
# repeat for b2 and b3
これにより、発生したとおりの履歴が残ります。マスターから分岐し、すべてのブランチに変更を加え、最後にマスターからの変更を3つのブランチすべてに組み込みました。
git
この状況を非常にうまく処理でき、同時にすべての方向でマージが発生するように設計されています。すべてのスレッドを正しくまとめることができると信頼できます。これは単に分岐するかどうかを気にしないb1
マージmaster
、またはmaster
マージb1
、マージがすべてのgitに同じルックスをコミットします。唯一の違いは、どのブランチがこのマージコミットを指すようになるかです。
あなたはリベースします。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つのコミットのどれを区別することができないということであってもよいE
、F
と、G
実際の値を減少させる、回帰を導入しましたgit bisect
。
使用すべきではないと言っているのではありませんgit rebase
。それには用途があります。しかし、それを使うときはいつでも、あなたは歴史について嘘をついているという事実を認識する必要があります。そして、少なくとも新しいコミットをコンパイルしてテストする必要があります。
git checkout <source branch>
git pull
。その後、上記を続行します:git checkout b1
...
git merge
で発生しgit rebase
ます。それらを回避することはできません。git rebase
リベースのいくつかの段階を隠すことができるという利点があります(つまり、同じブランチをいくつかの異なるコミットに順番にリベースして、各段階での競合の量を減らします)。それにもかかわらず、リベースが歴史について嘘をついているという単なる事実は、そのような多段階のリベースでうまくやりくりすることをはるかに簡単にします...それは、私が常にマージを好む理由です、それは私がいくつかのマージコミットで履歴を乱雑にする必要があることを意味するときでさえ。
git rebase master
これを行う適切な方法です。マージは、マージのためにコミットが作成されることを意味しますが、リベースは作成されません。
ブランチのオンとオフで作業している場合、または何かを作業しているときに他のブランチで多くのことが発生した場合は、ブランチをマスターにリベースするのが最善です。これにより、履歴が整理され、物事をより簡単に追跡できるようになります。
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にリベースに関する章があり、ウェブ上には他の多くのリソースがあります。
(バックアップ)などの他のブランチをマスターブランチコピーで更新します。どちらの方法でも実行できます(リベースまたはマージ)...
ブランチをマージする(バックアップブランチへの追加のコミットが自動的に行われます)。
注:Rebaseは新しいベース(新しいコピー)を確立することに他なりません
git checkout backup git merge master git push
(backup2などの場合は、他のブランチについても繰り返します。)
git checkout backup git rebase master git push
(backup2などの場合は、他のブランチについても繰り返します。)
git cherry-pickを使用すると、マージしたり、ブランチ全体に個別のコミットを適用したりできます。