2012-03-15 11 views
1

私は現在のリリースブランチ "base"に取り組んでいましたが、すぐにリリースされる予定です。最後に私の機能が引き抜かれていて、ベースブランチにいくつかのプッシュされていない変更があります。これは約400のコミットの巨大なマージを含む大きなセットです。プッシュされているので、私はそれをベースにプッシュすることはできません。また、私はマージをやり直したくありません。 、マージされた変更を持っている木からgitブランチを使ってメインラインコードに影響を与えずにコードをコミットする方法

新しい枝を分岐、言う「リリース後に」とし、ベースを変更せずに、リポジトリにプッシュ:私はこれを行うことができれば

だから、私は思っていました。出来ますか?私は偶発的な基底へのコミットを防ぎたがっています(私はときどき複数のrefがワンプッシュで更新されるのを見ました)。

この図は、問題を視覚化するのに役立ちます。

master 
-------------------------------------------> 
    \       
    \---release1--->    
        \ 
         \--base (releasing soon)------> 
          (I have some changes merged on a local tree 
          based off "base" but not pushed to base)  

ベースがリリースされますので、私は(私はレポにプッシュすることができた。)私の地元の変更をプッシュしたいが、いくつかのブランチでこれらの変更を保存しません。

理想的には、「ベース」ブランチに基づいてブランチを作成し、それを後でマージすることから始めるべきでしたが、私はそれをしませんでした。

+0

ビット混乱:分岐構造を示す並べ替えの図を追加できますか? –

+0

@MattGibson、ありがとう、ダイアグラムで質問を編集しました。 –

答えて

1

まず、マージを保存することが心配な場合は、rerereが対象です。

これ以外にも、ブランチに変更を保存することは簡単に可能です。

ちょうどgit branch my_new_branch、次にgit reset --hard base(すべての作業コピーの変更が最初にコミットされていることを確認してください!reset --hardはインデックスに登録されていない変更を削除します)。現在、HEADにはbaseが、その後には未修正の変更とトラッキングbaseが含まれている2番目のブランチ(my_new_branch)があります。 git mergeまたはgit rebaseは、再統合する前に、baseを基準にしてmy_new_branchを最新の状態に保つことができます。

1

あなたの質問が分かりません。あなたのダイアグラムからいくつかの新しいダイアグラムを作成してみましょう。

[master] * --- [possibly more commits] 
      \ 
[release1] * --- A --- B --- C 
        \ 
[base]    D --- E 

そして、あなた自身のプライベートレポで:どうやらあなたは、リモート共有レポでは、持っている

[master] * --- [possibly more commits] 
      \ 
[release1] * --- A --- B --- C 
        \ 
[base]    D --- E 
         \ 
[devel]     F --- G --- I --- J 
         \    /
          --- H -------- 

枝の先端「develのは」FGI +のマージであるJをコミットになるように、 Hは、すべて「A」(リリース1)を指すD(「ベース」)を指す。今、誰かがABC + DEをマージして "release2"をリリースする予定ですか?

"devel"ブランチがそのマージに基づいている場合は、そのマージの結果にリベースするだけです(まだ存在しないので、待たなければなりません)。

または、上記のリモート共有レポが多かれ少なかれ正確であることを意味しますが、には独自の "devel"ブランチがありません。おそらく、あなたの(ローカル)レポコミットツリーがより次のようになります。

[master] * --- [possibly more commits] 
      \ 
[release1] * --- A --- B --- C 
        \ 
[base]    D --- E --- F --- G --- I --- J 
            \    /
            --- H --------- 

あなたはそれが代わりに次のようになりたい場合:

[master] * --- [possibly more commits] 
      \ 
[release1] * --- A --- B --- C 
        \ 
[base]    D --- E 
          \ 
[devel]      F --- G --- I --- J 
           \    /
           --- H --------- 

を、あなたはその「develの」ブランチを作成することによって開始することができますEをコミットオフにハング:

git branch devel E # use the commit-ID for commit E 

と再度ポイントローカルブランチ "ベース" Eをコミットする:

git branch -d base; git branch base E # again you'll want the sha1 
# or: git update-ref refs/heads/base E 

あなたは完了です(とにかく、とにかく;最終的にはあなたの "devel"ブランチを後でrebaseする必要があります)。


私は私のダイアグラムの各ツリーレベルの左側にブランチラベルを置いていますが、ブランチラベルは実際には右側にあります。 (各支店の「先端」にあります)。ブランチ上で "git commit"を実行すると、新しいコミットが追加され、ブランチチップが更新されます。私は、ほとんどの人が "git branch"コマンドを実行したときにラベルが一度設定されているかのようにブランチを "考える"と思っていて、それから永遠にそこにとどまる。ブランチラベルは、ブランチの先端に続きます。ブランチの「水平部分」は、コミットツリーを見て、ここに描いたように描かれている場合、コミットツリー構造に基づいて作業しなければならないものです。