2011-07-26 1 views
2

これが通常の分岐シナリオであるかどうかは分かりませんが...gitでは、マスタから新しいコードをマスタに追加した後、マスタから元々作成されたブランチにマージすることは可能ですか?

masterからブランチを作成して、既存の他のブランチ、たとえばブランチAとブランチBをマージして、マスターに戻って、私はブランチCでAとBのコードのいくつかが必要ですし、マスターからブランチCにマージできますか?

もしそうなら、これが良い考えではない理由がありますか?これはgitの一般的な操作ですか?

+0

すごくお世話になりました。私はあなたが私の質問に答える時間を取ったことに本当に感謝しています。私はこれらすべてを見ていきます。私は今とても多くのことを学んでおり、私は本当にgitが好きだと言わなければなりません。 – racl101

答えて

2

はいとはい。

gitで好きな方法でマージできます。マージは、単に「これらの履歴を結合する」ことを意味します。 gitができない場合、デフォルトモードでは、あなたに変更をダンプするだけです。 "マージ競合"ですが、その動作を "ours"または "theirs"に傾けるように変更することもできます。あなたの説明から、だから... ...

のオプションの何百もの完全な説明のためのgit-mergeドキュメントを見て、歴史の図は、次のようになります。

*はほんの一部である
*-------*-------*------* master 
     | 
     *----*-----* A 
     | 
     *-------* B 
     | 
     *----* C 

をそれらがすべて作成されている点を除いて、そのブランチにコミットします。では、この問題をどのように修正しますか?まあ、私はなります

git checkout A 
A上にある

、基本的に我々はそうのようにマスターする中をマージするつもりだ:

git merge master 

それを行うための良い理由がある - 別に提示したときに開発者は、マージが正確であると仮定すると、これは単純な早送りマージを表します。つまり、Aを他の人のリポジトリの実際のマスターにマージすると、これは簡単になります。さて、あなたや他の開発者が行うことができ、次のステップ、:Aにマスターをマージするプロセスは、それらと開発者に責任を解決するので

git checkout master && git merge A 

A.に引っ張るそれは基本的に、全くマージの競合を持つべきではありませんAを統合して扱いました。

それでは

再び
git checkout B && git merge master 

、問題を解決するマージ、そしてgit checkout master && git merge B

は最後に、私はCへmasterをマージすることができます言っていますか?絶対に。私たちはそのプロセスを2回だけ実行しました。

私たちは職場でこのようなやり方をしています。基本的には、他の開発者にブランチの準備ができたら、私はそれらをマージしてから、すべての人がブランチにマージし、プロセスが繰り返されることを知らせます。リモートリポジトリでもこれを行うことができます。リモートでブランチを追跡している場合は、git pullが変更を反映します。これは実際にgit merge続いgit fetchで、あなたは誰か他の人のブランチを追跡していない場合、あなたはまだそのようにマージを適用することができます。

leaddeveloperがリモート名前である彼らはgit merge leaddeveloper/masterを行うことができます。その後、彼らは競合を訂正し、リード開発者に「プルしてください」と電子メールを送信し、リード開発者はgit fetch && git merge juniordeveloper1/somebranchまたはそれ以上の可能性があります。git fetch && git diff master..juniordeveloper1/somebranchを入力して最初に行ったことを解決します。

要するに、これはプロジェクトを管理する本当に良い方法だと思います。それは誰もが最新の状態を保ち、メインマスタを扱う人がコードを統合する仕事をしていないことを保証します。

git rebaseの件に関しては、this questionが非常にきちんと対処しています。

1

間違いなく通常のシナリオです。

$ git checkout your-branch 
$ git rebase master 

リベースをよく理解するために、次に例を示します。

 H--I--J [branch C] 
    /
A--B--C--D--E--F--G [master] 

このように、ブランチを作成してからmasterには複数の新しいコミットがあることがわかります。

マスターに対するあなたのブランチをリベースした場合、その歴史は、今のようになります。

    H'--I'--J' [branch C] 
       /
A--B--C--D--E--F--G [master] 

今、支店Cは最新のものである、とあなたが最初のブランチを作成したので、すべての変更が組み込まれています。

資源:

http://book.git-scm.com/4_rebasing.html

http://kernel.org/pub/software/scm/git/docs/git-rebase.html

2

これは非常に正常な動作です。

git checkout C 
git merge master 

これを行う通常の方法です(既にこのブランチに入っている場合は、最初の行を省略できます)。

アレックスに記載されているrebaseコマンドが代わりですが、これには他の結果があります。実際には、あなたのブランチのより線形な履歴が得られますが、rebaseの前の(そして元のブランチの後の)古いコミットは、AとBのコミットを持っているので、他の名前(コミットID)彼らの祖先。

0

分岐Cが重く共有されていない限り、それは他のユーザーによって上流のレポから引っ張られ、私はまだAlexanswerで述べたrebaseアプローチを好むでしょう。
Rebase first (C on top of master), merge later (C on master)

あなたがCに必要となるABの一部だけコミットをしていた場合は、cherry-pickingさは解決策になるだろうが、私は(それの終わり)「Use GIT fork/branches」に言及して、チェリーピックには欠点があります。

関連する問題