9

トピックブランチで作業を開始します

    •-•-• < topic
   /
•-•       < master

トピックブランチをプッシュします

$ git push origin topic

他の誰かが変更を master にプッシュする

    •-•-• < origin/topic
   /
•-•-•—•   < origin/master

ローカル マスターを更新してトピックをリベースするにはどうすればよいですか?

履歴は次のようになります

        •-•-• < topic
       /
•-•-•—•       < master

私がしようとしていること

; update master
$ git checkout master
$ git fetch origin
$ git merge --ff-only origin/master

; rebase topic
$ git checkout topic
$ git rebase master

問題

私のコミットはすべて、コミットさtopicれていないと見なされます。だから私がしようとするとgit push origin topic、私は得る

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

ソリューション?

ブランチを とマージしたくないことに注意してください。不必要にブランチをマージすることなく、ローカル リポジトリを更新したいだけです。topicmaster

4

3 に答える 3

13

わかりやすくするために、例を作り直します。

    C-D-E < topic, origin/topic
   /
A-B < master, origin/master

その後、誰かが働きます。

    C-D-E < topic, origin/topic
   /
A-B-F-G < origin/master
  ^
master

F&Gをオリジンからフェッチしてから、トピックをマスターにリベースしました。これで、リポジトリは次のようになります。

    C-D-E < origin/topic
   /
A-B-F-G < master, origin/master
       \
        C'-D'-E' < topic

そしてこれが問題です。Eの起点/トピックをE'のトピックに早送りすることはできません。リベースは、実際には、オリジンにプッシュされていないコミットのみを対象としています。C、D、およびEをすでにオリジン/トピックにプッシュしているため、リモートリポジトリの履歴を書き換える必要があります。したがって、エラー。したがって、実際には3つのオプションがあります。

  1. 局所枝を押すのをやめなさい。トピックに取り組んでいるのがあなただけの場合は、それをプッシュする必要はありません。トピックをマスターの上にリベースし続け、完了したら、マスターをトピックに早送りしてマスターをプッシュします。ローカルトピックブランチを削除します。出来上がり!

  2. トピックとマスターをマージします。トピックブランチでコラボレーションする必要がある場合は、おそらくそれを吸い上げてマージする必要があります。

  3. リモートリベースを強制します。

    git push origin topic -f

    これにより、原点/トピックがE'に強制されます。リモートリポジトリで履歴を書き直すことを除いて、火と縁石、人身御供、犬と猫が一緒に住んでいる、集団ヒステリー...そしてあなたの仲間の開発者はあなたをあまり好きではありません。まったくお勧めしません。

于 2012-12-18T02:16:51.420 に答える
4
; update master
git checkout master
git pull --rebase origin master  

; rebase topic
git rebase master topic

; push topic (force)
git push -f origin topic
于 2012-12-17T17:57:19.370 に答える
0

あなたの質問にはいくつかの問題があります。

  1. プッシュしても、マージの競合は発生しません。これは、マージ、リベース、cherry-pick、または stash pop/apply を実行した場合にのみ発生します。
  2. 他の誰かがあなたと同じコンテンツを同時に変更している場合、競合を回避することはできません(リポジトリの別のコピーで作業している場合でも)。
  3. 「トピックに関する私のコミットはすべて、コミットされていないと見なされます」は意味がありません。おそらく、リベースしようとしたときに競合が発生したため、「トピック ブランチのコミットによって導入されたすべての変更」がまだコミットされていないことを意味しています。

リベースが競合で停止したことを無視していることと、単に無視していることを除いて、手順は正しいです。競合を解決してから、次のことを行う必要があります。

git add confilctedfile1.txt conflictedfile2.txt
git rebase --continue

トピック ブランチのすべてのコミットに対してこれを行う必要がある場合があります。リベースが完了したときにのみプッシュする必要があります。

別の注意: このため、リベースは日常の作業に適したワークフローではありません。Merge は、コード ベースで何が起こっているかという点で、はるかに簡単で正確です。リベースよりもマージを優先する理由はたくさんあります。

于 2012-12-17T19:17:29.143 に答える