9

私は2つのリポジトリを持っています。時々、 のコンテンツを にマージしたいと思いotherますmain。ただし、マージは削除されたファイルを無視します。例を通して説明しましょう:

mkdir -p test/main test/other

cd test/other/
git init
touch one two three
git add .
git commit -m "Add one, two and three."

cd ../main/
git init
touch four
git add .
git commit -m "Add four."

リモートとして追加othermainます。

git remote add other ../other/
git fetch other

その内容をマージします。

git merge --squash other/master
git commit -m "Merge other."

ファイルを正しく追加します。ここで、 のファイルを削除しますother

cd ../other/
git rm two
git commit -m "Remove two."

変更を にマージしますmain

cd ../main/
git fetch other
git merge --squash other/master

マージ後git status

# On branch master
nothing to commit (working directory clean)

twoで削除されたので、マージによってが削除されることを期待しotherます。私は何を間違っていますか?

4

1 に答える 1

8

ここでの問題は、スカッシュ コミットの使用です。

を実行するmerge --squashと、ブランチのすべての履歴が破棄されます。実際には「ブランチをマージ」していません。その履歴の要約表現を適用しただけです。したがって、後で を実行するとmerge --squash、git はブランチの履歴にあるすべてのコミットを再適用します (2 つのブランチには共通の祖先がないため)。

最初 のを実行すると、「Create one, two, and three」を含むmerge --squashコミットが作成されます。mainの歴史mainはまず「四つ造る」、次に「一、二、三を造る」。

2 番目merge --squashの を実行すると、(実質的に)「1 つ、2 つ、3 つ作成」と「2 つ削除」で構成されるコミットが追加されます。これら 2 つのコミットをまとめたもの(押しつぶされた!) は、「Create one and three」です。そのため、git は「Create one and three」コミットを現在のリポジトリの状態に自動マージし、4 つのファイルを残します。ファイル「one」と「three」は両側で同一であるため、コンテンツのマージは自動的に成功します。

リモートでレポを最新の状態に保ちたい場合は、スカッシュの代わりに「実際の」マージまたはチェリーピッキングを使用する必要があります。Amerge --squashは、「リモート リポジトリですべての新しいコミットを試して、ここに統合する」ことと同じではありません。

于 2013-01-15T17:54:14.473 に答える