1

マスターをブランチにリベースするときに、ブランチでいくつかの競合が発生しています。

シナリオは次のとおりです。

マスターから分岐し、いくつかの変更を加え、その変更をコミットします。マスターをチェックアウトし、いくつかの変更を加え、その変更をコミットし、ブランチ1をチェックアウトします。マスターをリベースしてみてください-競合します。

現在、他の開発者も同様の方法で作業しています。

マスターはウェブサーバーを含むすべてのリポジトリで同期されています。マスターの履歴が変更されることは望ましくありません。

過去のポイントと競合しているリベースの競合を解決する場合、マスターをチェックアウトしてブランチとマージすると(マスターの履歴は変更されますか)、またはそれらの競合の解決は、マージするすべての作業に適用されますか?

4

2 に答える 2

7

あなたが現在の状況にあると想像してください:

- A - B - C - D
   \          ^
    - X - Y   master
          ^
          branch1

実行git checkout branch1; git rebase masterすると、コミットがbranch1から移動され、マスターブランチの上に適用されます。

              master
              v
- A - B - C - D
               \      
                - X - Y 
                      ^
                      branch1

これはmasterを変更しませんが、2つの方法でbranch1を変更します。

  1. commitの親をXからAに変更すると、commitのIDが変更されDます。X実際、Gitに関する限り、これはまったく新しいコミットになります(X新しいIDをY持っているので、新しい親を持っているのでY、新しいIDも取得します)。 、など、ブランチにさらにコミットがある場合)。
  2. 実行する必要のある競合解決は、コミットの内容を変更します。

すでにbranch1をリモートリポジトリにプッシュしている場合は、それをリベースすることは非常に悪い考えです。すでに共有されている履歴を変更すると、問題が発生するだけです。

branch1をプッシュしていないと仮定すると、それをmasterにマージして(を使用してgit checkout master; git merge branch1)、masterを早送りしてcommitすることができYます。これにより、マスターを変更することなく、きちんとした線形履歴が得られます。

- A - B - C - D - X - Y
                      ^
                      branch1 AND master

すでにbranch1をプッシュしている場合は、リベースを避け、代わりに(を使用してgit checkout master; git merge branch1)マージを使用する必要があります。これにより、どちらの履歴も変更されませんがM、マスターブランチに新しいコミット(この図でマーク)が作成されます。

- A - B - C - D - M
   \            / ^
    - X - Y - -   master
          ^
          branch1
于 2012-05-26T10:52:15.920 に答える
1

リベースする場合、リベースするブランチに関係なく、リポジトリの履歴が変更されます。アイデアは、あなたがプッシュした後に他の開発者がマスターを(たとえばオリジンから)プルすると、彼らのリポジトリも最新になるということです。

明確にするために:リベース中に競合をマージしても、マスターの履歴は変更されません。マージメソッドとしてリベースします。

マスターの履歴を変更したくない場合は、マージメソッドとしてリベースすることはできません。デフォルトのgitマージ動作は、競合するかどうかに関係なく、問題なく機能するはずです。

git checkout master
git merge branch-1
于 2012-05-25T15:31:38.010 に答える