2011-06-22 12 views
2

私は以下の状況を想定しています:git-rebase:2つの分岐ブランチ/リポジトリが収束します

ユーザFooのリポジトリメインがあります。ユーザーバーがこのリポジトリをフォークするので、両方のリポジトリが同期します。ユーザーバーは機能を実装し、 "barbranch"というローカルブランチを作成します。ユーザーBarがフィーチャの実装を完了するまでに、Fooは何かをコミットしてメインリポジトリにプッシュしました。したがって、基本的に状況は次のようになります。

A---B---C---D main repository 
     \ 
      E  forked repository (where C=E) 
      \ 
      F barbranch on forked repository 

これで、ユーザーFooのレポでどのように元に戻すことができますか?

単純に私が言う:

# switch to the local master and merge barbranch into it 
git checkout master 
git pull 
git pull upstream 
git push 
git merge barbranch 
# merge conflicts occur 
vi somefile 
git commit -a 
git rebase origin master 
# this conflict occurs again 
vi somefile 
git commit -a 
git status # says I'm on (no branch) ?! 
git push 
g it checkout master 
# conflict occurs again! 
vi somefile 
git commit -a 
git push 
# send merge request to user Foo 

最後に、これは私の3つの醜いのコミットの代わりのものを提供します。

私はgit rebase --onto ...を見つけたgit-rebaseのドキュメントをチェックしています。私は正確なコマンドが何であるかを理解することはできませんが、そのプロセス全体が最後のように見えるでしょう。

答えて

2

これは、取得するツリーによって異なります。

あなたが本当の作業履歴を表すツリーをしたい場合は、「リベース」だけあなたがリベースと仕事を「線形化」したい場合は、ここで何がある

# on bar repo 
git fetch upstream 
git checkout master 
git merge upstream/master (fast-forward) 
git merge barbranch 
# resolve conflicts (adding resolved files) 
git commit 
git push upstream master 

を「マージ」使用するべきではありません

# on bar repo 
git fetch upstream 
git checkout master 
git merge upstream/master (fast-forward) 
git checkout barbranch 
git rebase master 
# resolve conflicts + commits (each commit will be processed separately: so you may need to do that several times if various commits are in conflict with the upstream) 
git checkout master 
git merge barbranch **(fast-forward after the rebase)** 
git push upstream master 
+0

ありがとう、ええ、私は "線形化された"バージョンが欲しいです。ちょうど明確にする: 'git fetch upstream'をどのブランチで行うかは重要ですか? "resolve conflicts + commit"の各ステップは、最後に 'vi somefile;があります。 git commit -a'、そう? – user694971

+1

どこからでもフェッチできます。解決方法conflict =( "vi" + "git add resolved_file")を各競合ファイル+最終的な "git commit"で解決します。この方法は、いくつかのファイルが競合しているときに優れています。 "git status"を使ってファイルがまだ解決されていない場合はいつでも知ることができます。 –

+0

これは本当に奇妙です、私は[this](http://pastebin.com/NFirzz6g)のようなメッセージを受け取ります。このブランチは、問題のパッチが承認される前に作成されていますが... – user694971

2

私はあなたの状況のた​​めに次のシナリオは大丈夫だと思います。

  • アウトマスターは
  • がプッシュ
  • マスターする

  • 手動
  • 紛争解決についての変更をコミットし、競合を解決し、あなたのローカルマスタにフォーク枝を引き
    • この実際になりますあなたのマスターに3つのコミットをもたらします(あなたにコミットE & Fとあなたの紛争解決commi t)。

  • 関連する問題