2016-09-19 6 views
14

リポジトリAは、Gerritを介して管理されるgithubリポジトリを検討してください。 私はリポジトリAを複製し、リポジトリAのマスターブランチから新しいブランチを作成しました。私はこの新しいブランチを新しいgitlabリポジトリBにプッシュしました。私はリポジトリBの管理者で、他の開発者と共有しました。開発者はこのブランチをプッシュできませんが、私はそれらのプルリクエストをマージすることができます。 リポジトリBのマスターブランチでいくつかのプルリクエストをマージしました。したがって、リポジトリBはリポジトリAの初期コミットとプルリクエストの新しいコミットを持ちます:Bはコミット(b a)の上にコミットします。gitを使用して共有フォークされたリポジトリを更新する

次に、リポジトリBを新しいリポジトリAのコミットで更新したいと考えています。これらのコミットを+と呼びます。

私は2つのオプションを参照してください。

  1. 私はBにAをマージした場合、結果は次のとおりです。B +を。
  2. A +でBをリベースすると、結果はb a + aです。

オプション1:開発コミットが外部コミットと混在しています。デバッグが難しく、違いを強調するのが難しい。

オプション2:リモートBの変更を強制する必要があります。間違っていないと、結果は次のようになります。 1.開発者がBをプルし、Bのローカルマスターにコミットした場合、彼らのローカルな変更を失うでしょう。 2.ブランチBを強制的に更新した後、ローカルブランチをリベースする際に、開発者が大きな問題に直面することがあります。

問題を回避するためにどのように進める必要がありますか?

答えて

7

私はそれを正しく理解していれば、あなたは多少このようになりますシングル(ローカル)リポジトリがあります。

      A/master 
           ↓ 
* -- * -- * -- a -- * -- * -- a+ 
       \ 
       * -- * -- b 
          ↑ 
         B/mybranch 

:それは次のようになりますので、今

  A/master 
       ↓ 
* -- * -- * -- a 
       \ 
       * -- * -- b 
          ↑ 
         B/mybranch 

を、Aが、更新され、ここでは、直線ではない2つの分岐分岐があることに注意してください。つまり、ABにマージすると、a+ b aが得られるということは正しくありません。あなたはマージを得るか、それがあるとして、それは歴史を保持します:

      A/master 
           ↓ 
* -- * -- * -- a -- * -- * -- a+ 
       \    \ 
       * -- * -- b --- M 
           ↑ 
          B/mybranch 

あなたが見ることができるように、あなたはまだコミットがどこから来た情報を持っている:aa+間のものは1つのブランチから来て、他のものはabの間にあります。そしてMはそれらのtroブランチを結合します。通常、このはこれを解決するための正確な方法です。

これ以上のリベースの利点は、自分自身に気付いたように、コミットがそのままであることです。いずれかのリポジトリとやりとりしたすべてのユーザーは、問題なく変更を取り込むことができます。これらのコミットのいずれかをリベースした場合、手動で修正する必要があります(実際には実現しない可能性もあるため、コミットを重複させることでさらに複雑な履歴を作成します)。

ここでは、マージを行う方がよいでしょう。はい、履歴は直線と同じくらい完全には見えませんが、何が起こったのかを適切に伝えます。独立した開発ラインがあり、上流のリポジトリAからの変更で更新されました。この情報は便利であり、そのような情報を保持することは理にかなっています。特に、両方のリモートと対話するユーザーがいる場合は、両方のリモートとリポジトリの互換性を保つことをお勧めします。

あなたは歴史は次のようになりたくない、とAとの互換性を気にしない場合、あなたはあなたのBAからのすべての変更も潰すことができます:[A]

ここ
      A/master 
           ↓ 
* -- * -- * -- a -- * -- * -- a+ 
       \ 
       * -- * -- b -- [A] 
           ↑ 
          B/mybranch 

を1回のコミットでaa+の間のすべての変更を含む縮小されたコミットです。 ABにリベースすることで、この結果を得ることができますが、すべてのコミットを抑制することができます。この場合、コミットメッセージのどこから変更が来たのかを明確に述べるべきです。

関連する問題