2

私の同僚と私は最近 git を実装し、リベースを実装しようとしました。したがって、masterローカルに複製されたリモート ブランチがあり、ローカル (およびリモート) ブランチはchanges. ローカルで にいくつかの作業を行ったchangesので、次のようになります。

master: A
        \
changes: B-C-D

したがって、他の場所からの無関係なマージにより、masterアップグレードされたため、次のようになりました。

master: A-E
        \
changes: B-C-D

だから、私はリベースをしました:

git checkout changes
git rebase E (via a tag)

したがって、私のローカルリポジトリには次のものがありました。

master: A-E
           \
changes:    B-C-D

それで、プッシュしようとしましたが、次のようになりました:

remote: error: denying non-fast-forward refs/heads/changes (you should pull first)

どうやら、従来の知恵は、私の仕事を元にchanges戻すために強制プッシュを行うことでしたorigin/changes:

git push -f origin changes

次のように応答しました。

remote: error: denying non-fast-forward refs/heads/changes (you should pull first)
To /opt/git/online.git
 ! [remote rejected] changes -> changes (non-fast-forward)
error: failed to push some refs to '/opt/git/online.git'

だから、私は今少し混乱しています。changesワークフローは、ローカルにリベースを行った後、整列できるようになると想定していorigin/changesました。私はこれを誤解していますか?

4

2 に答える 2

1

問題は、B、C、および D はすべて新しいコミットであるため、最後のグラフが実際には正確ではないことです。したがって、B'、C'、および D' に似ています。

        マスター:AE
                |\
       変更: \ B'-C'-D'
起源/変更: BCD

この新しい正しいグラフからわかるように、changes(D') はorigin/changes(D) の子ではありません。git merge-base origin/changes changesが A であり、git merge-base --is-ancestor origin/changes changes1 (false) を返すことで、これを確認できます。

于 2013-09-27T04:35:33.170 に答える