2013-01-15 3 views
8

У меня есть два репозитория. Время от времени я хочу объединить содержимое other в main. Однако слияние игнорирует удаленные файлы. Позвольте мне объяснить это на примере:Git игнорирует удаленный файл при слиянии

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 

Слияние его содержания.

Он правильно добавляет файлы. Теперь удалите файл в 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. Что я делаю не так?

ответ

6

Проблема здесь в использовании вами сквош-коммитов.

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

При выполнении первогоmerge --squash, вы создаете коммите на main, который содержит «Создать один, два, и три». Итак, история main - это сначала «создать четыре», затем «создать один, два и три».

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

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

+0

Правда, это объяснение имеет смысл. Я хотел сделать сквош-слияние, чтобы не загрязнять историю основ другими. Но похоже, что другого выхода нет. Спасибо за вашу помощь! –

+1

@GergoErdosi Если вы хотите * просмотреть * незагрязненную историю, посмотрите опцию 'first-parent' на' git log'. – Borealid

+0

Спасибо за подсказку! –

Смежные вопросы