私は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要求は次のようになります。
Igit 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
フォークし、強制的に押してお互いのつま先を踏む。
アイデア?私は何が欠けていますか?