Git игнорирует удаленный файл при слиянии

У меня есть два репозитория. Время от времени я хочу объединить содержимое 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."

Добавить other в main как удаленный.

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. Что я делаю неправильно?

Ответы

Ответ 1

Проблема здесь в том, что вы используете комки для сквоша.

Когда вы выполните merge --squash, вы оставите всю историю ветки. Вы на самом деле не "объединили ветку" - вы только что применили сжатое представление о своей истории. Поэтому, если вы выполните более поздний merge --squash, git будет повторно использовать все фиксации в истории ветвей (так как у двух ветвей нет общего предка).

Когда вы выполняете первый merge --squash, вы создаете фиксацию на main, которая содержит "Создать один, два и три". Таким образом, история main сначала "создает четыре", затем "создает один, два и три".

Когда вы выполняете второй merge --squash, вы добавляете коммит, который состоит из (в действительности) "Создать один, два и три" плюс "Удалить два". Сеть этих двух коммитов вместе (раздавлена!) - это "Создать один и три". Таким образом, git автоматически объединяет команду "Создать один и три" с текущим состоянием репо, оставляя вас с четырьмя существующими файлами. Слияние содержимого выполняется автоматически, потому что файлы "один" и "три" идентичны с обеих сторон.

Вы должны использовать "настоящие" слияния или вишневую подборку вместо раздавливания, если вы хотите сохранить репо на пульте дистанционного управления. A merge --squash - это не то же самое, что "играть через все новые коммиты в удаленном репозитории и интегрировать их здесь".