2012-03-12 17 views
8

私はgithubの会社プロジェクトのための古典的なOSSのメンテナー/コントリビュータのgitワークフローを実装しましたが、片方のケースではどうやって回避するのか分からない奇妙な結果が出ます。git pull --rebase upstreamとgit push originは早送りを拒否しますか?

私はフォークして上流のリモートを追加して最新の状態に保つという典型的なプロジェクトがあると言います。

git clone [email protected]:kozhevnikov/<project>.git 
git remote add upstream [email protected]:<company>/<project>.git 

この例では、このフォークはいくつかのコミットによって後ろにあります。

git reset --hard HEAD~5 && git push --force 

私は私の最後のコミットをプッシュして、私は私のフォークのクローンは、競合がないことを確認するために更新し、プルリクエストを作成する前に、このフォークに取り組み、いくつかのコミットを押してください。

touch foo && git add foo && git commit -m foo && git push 
touch bar && git add bar && git commit -m bar 

git pull --rebase upstream master 

From github.com:<company>/<project> 
* branch   master  -> FETCH_HEAD 
First, rewinding head to replay your work on top of it... 
Applying: foo 
Applying: bar 

私のフォークにプッシュしようとすると、私は拒否されます。

git push 

To [email protected]:kozhevnikov/<project>.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '[email protected]:kozhevnikov/<project>.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

次に何をすればよいですか?私が望むのは、fooとbarのコミットを含むプルリクエストです。

私がpullの場合、プルリクエストには重複fooコミットと余分なマージが含まれています。

git pull 
Merge made by the 'recursive' strategy. 

git push 

オンgithub pull要求は次のようになります。

I git pull --rebase代わりの pull、せいぜいそれは私のプルリクエスト(リセットからのもの)の中に他の人のコミットを含めますと、最悪の場合、それは私が競合をマージ与え
Showing 4 unique commits by 1 author. 
12345 
kozhevnikov foo 4 minutes ago 
67890 
kozhevnikov foo 4 minutes ago 
abcde 
kozhevnikov bar 2 minutes ago 
fghij 
kozhevnikov Merge branch 'master' of github.com:kozhevnikov/<project> just now 

すると任意のpullまたは--rebaseそれは、完璧に動作しますが、私が力を使うすべての人に言ったり、私はシングルを共同少数の人々や小さなサブチームを想像することができるよう、それを標準ワークフローの一部を製造するのに非常に不安だなしI git push --forceフォークし、強制的に押してお互いのつま先を踏む。

アイデア?私は何が欠けていますか?

答えて

16

とき

git pull --rebase upstream master 

あなたが更新され、上流のリポジトリにmasterブランチをリベースしているので、あなたは、あなた自身の歴史を書き換えています。リベースされたレポをフォークにプッシュすると、gitは文句を言う。あなたは--forceを押す必要があります -

git push --force origin master