8

私のGitリポジトリには、同じ内容の2つのファイルalphaとがあります。beta

マスターブランチで削除alphaし、機能ブランチで編集すると、マスターを機能にマージすると、競合について警告が表示されます。を削除してこれを解決するとしalphaます。

次に、を使用して機能ブランチをマスターにリベースするgit rebase masterと、alphaが削除されますが、機能ブランチで行った変更は!alphaに適用されます。beta競合の警告が表示されますが、確認のためにコミットがブロックされることなく、自動マージで問題なく解決されます。

興味深いことに、を実行しgit rebase -iてデフォルトを受け入れると、beta編集されず、マージ時に解決したのと同じ競合を解決できます。

次に、3つの関連する質問:

  1. 他のファイルがコミットによって編集されていないのに、Gitが1つのファイルに適用した変更を別のファイルに適用する必要があると考えるのはなぜですか?
  2. このような状況を回避するにはどうすればよいですか?
  3. デフォルトのオプションを選択した場合でも、インタラクティブリベースの動作が異なるのはなぜですか?

Win7のCygwinでGit1.7.9を実行しています。誰かが自分で詳細を確認したい場合は、空のディレクトリにこれを示すトランスクリプトをpastebinに配置しました(長さのため、ここには投稿しません)。git init

4

1 に答える 1

10

ドキュメントからgit-rebase

-m
--merge
マージ戦略を使用してリベースします。再帰的(デフォルト)マージ戦略が使用される場合、これにより、リベースはアップストリーム側の名前変更を認識できます。

ファイルが削除されると、Gitは名前変更の候補と見なし、リベースされたパッチを対応する名前変更されたファイルに適用しようとします。あなたの場合、それは悪い推測をしたかもしれないように聞こえます。

このオプションを使用して-m、別のマージ戦略を選択できます。たとえば、resolveマージストラテジーは、名前の変更を自動検出することでこの問題を回避できます(git-mergeマージストラテジーの詳細についてはを参照してください)。

于 2012-08-16T10:40:05.317 に答える