2016-06-18 8 views
1

私はgitの中に深く埋もれています。 Git rebaseは早送りではないことを示します

は、どのように私はそこに手に入れた:

私はGitの専門家ではないです。詳細が不明な場合は、私に明確な説明をしてください。 数日前に次のコマンドを実行して、変更をリモートブランチにプッシュしました。

% git checkout master 
% git pull 
% git checkout redactor_changes <-- this is the branch that I made my changes 
% git commit -m "changes" # I added my changes previously 
% git rebase master 
% git push origin redactor_changes # pushed changes to remote branch 

すべてが変更をマスターブランチにマージするための書き込み権限を持っているわけではありません。リモートリポジトリへの書き込み権限を持っている人には、競合があり、再分配して再送信すると私に伝えられました。だから今日は次のコマンドを正確な順序で実行しました。

[email protected]:~/oblog$ git add oblog/static/css/styles-custom.css 
[email protected]:~/oblog$ git add oblog/static/js/redactor.upload_image.js 
[email protected]:~/oblog$ git add oblog/static/images/loading.gif 
[email protected]:~/oblog$ git commit -m "Throw a toast when user upload an non-image file with image extension" 
[email protected]:~/oblog$ git branch 
[email protected]:~/oblog$ git checkout master 
[email protected]:~/oblog$ git pull 
[email protected]:~/oblog$ git checkout redactor_changes 
[email protected]:~/oblog$ git rebase master 
[email protected]:~/oblog$ git merge master 
[email protected]:~/oblog$ git branch 
[email protected]:~/oblog$ git push origin redactor_changes 

このコマンドのセットは、私が逃げることのできない渦に私を吸い込んだようです。

症状:

上記のコードの最後の行は、次のエラー

! [rejected]  redactor_changes -> redactor_changes (non-fast-forward) 
error: failed to push some refs to 'https://git.<domain>.com/web/oblog.git' 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Integrate the remote changes (e.g. 
hint: 'git pull ...') before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

をスローだから私は

  1. https://stackoverflow.com/a/20467414/1431184
  2. https://stackoverflow.com/a/6897674/1431184
  3. SO仲間からのアドバイスに従っ

でも問題は解決しません。

LABLE:私は(ローカル)のマスターと私のブランチをリベースすると

、それは私が、手動でリベース--continueを修正してくださいいくつかの競合をスローします。 Rebaseは成功しました。それから私の支店を元に戻して、同じエラーが表示されました。 [拒否]。

gitとSOによって提案されているように、私は自分のリモートブランチの変更を自分のローカルブランチ(redactor_changes)にプルします。そして、LABELに私をバック置く

git rebase master 

を実行します。これはちょっと変わっていません。

私のpushコマンドはmasterでリベースせず、リモートgitの所有者が自分のブランチ(redactor_changes)をマスターにマージしようとしたときにもコンフリクトを表示することに注意してください。

+0

私が見ている一つの問題は、 'git rebase master'を実行してすぐに' git merge master'をすぐに実行したことです。どうしてこれをやったの? –

+0

私の意図は、マスターとの変更をマージして私のブランチを元に戻し、次にブランチをマスターに配置するためにrebaseを実行することでした。あなたはそれがこれらの問題すべてを引き起こしていると思いますか? – printfmyname

答えて

4

redactor_changesブランチをmasterにリベースするたびに、後半のブランチから最新のブランチに最新の変更が反映されます。図によって説明するために:

master:   A -- B -- D 
redactor_changes: A -- B -- C 

この簡単な図は、あなたがコミットBmasterを分岐していることを前提としています。それ以来、redactor_changesC)にコミットし、他の誰かがmasterブランチ(D)にコミットしました。あなたは、以下のコマンド

git checkout redactor_changes 
git rebase master 

を実行する場合今、あなたは

master:   A -- B -- D 
redactor_changes: A -- B -- D -- C' 

リベースがmasterから新しいコミットを持ち込むことに成功し、次の図になってしまいますが、それはの歴史を書き換えることにより、そのようにしましたあなたのredactor_changesブランチこれは、レビューアがただちに早送りmasterブランチを変更(マージコミットなし)できることを意味するので、これは(潜在的に)良いことです。しかし、それは1つの副作用を持っています。 redactor_changesをリモートにプッシュすることはできません。あなたは、もはやredactor_changesのGitの歴史を書き直したリモートブランチ上のコミットを再生する方法を知っているので、次のコマンド

git push origin redactor_changes 

をしようとすると、あなたが

! [rejected] redactor_changes -> redactor_changes (non-fast-forward) error: failed to push some refs to ' https://git ..com/web/oblog.git'
hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart...

を見てきたエラーメッセージを与えないだろう。

ソリューション:

あなたが最も可能性の高いたい解決策があるリモートへのごredactor_changesブランチに:

git checkout redactor_changes 
git rebase master 
git push --force redactor_changes 

は、これを行うとエラーメッセージが離れて行く必要があります。これは、redactor_changesが個人的な支店であり、誰とも共有していないことを前提としています。

あなたのワークフローには他にもいくつかの問題がありました。すでにリベースした後にmasterredactor_changesにマージします。しかし、力のプッシュを行うことは少なくともあなたの状況を進める必要があります。

+0

私が提出した変更は、プロダクションに入る必要があるため、マスターとマージすることを意図しています。上記のコマンドを実行するとgitは私のブランチを個人的なものとして扱いますが、リモートgitのowerがマスターとマージしようとするとエラーがスローされますか? 私のブランチ上のすべてを削除することは可能ですか(または遅すぎますか)。つまり、ブランチがリモートリポジトリと正確に一致するようにすべての変更を元に戻すことができますか?変更セットはそれほど大きくないので、手動ですべてのファイルを保存して後で変更を転送できます。 – printfmyname

+0

あなたのコメントが私にとって意味をなさないので、Gitのワークフローを理解していないと思います。 –

+0

強制プッシュを行う権限がない場合は、おそらくリベースワークフローを使用すべきではありません。 –

関連する問題