Подтвердить что ты не робот

Git Слияние - неполные, отсутствующие файлы и папки

Я пытался объединить ветвь dev в master.

git checkout master    
git pull . dev

Все казалось хорошо, хотя были конфликты, которые я исправил и совершил. Но когда я проверил, что в новом объединенном рабочем дереве отсутствует большое количество папок и файлов из dev.

git status  // Shows conflicts & doesn't list some files/folders.    
git commit -a 

Created commit 55ffdd1: Merge branch 'dev' into master  

git diff dev --name-status

Выдает:

D       folders/lm.gif
D       folders/lmh.gif
...

Итак, файлы/папки, которые не отображались в статусе git. Он также не появлялся в конце, когда я исправлял объединенные конфликты.

Также, когда я пытаюсь снова объединиться, он говорит:

git merge dev    
Already up-to-date.

Тем не менее мастер-ветки явно не хватает файлов/папок из ветки dev. Почему это? Не следует ли добавить эту папку и все ее содержимое? "папки" отслеживаются на ветке dev, так что не следует ли его перетащить, когда я сделал слияние?

Когда ранее был конфликт слиянием, git остановил процесс слияния и пропустил кучу файлов/папок?

В ветке dev было много изменений, могу ли я что-то испортить с помощью git в прошлом, что теперь некоторые файлы/папки не слились бы?

(Когда я впервые создал ветвь dev, я не знал, что делаю, и делал сумасшедшие вещи, такие как reset, возвращался и т.д.)

Надеюсь, что один из вас гуру git здесь, когда переполнение стека знает ответ.:)

Спасибо, Куанг


Ответ

Спасибо Уолтеру, да, вот что произошло.

После нескольких исследований выяснилось, что это было немного сложнее, что произошло. Оказалось, что.

  • dev разветвлено с master, у него были все файлы.
  • Третья ветвь, позволяет называть ее "очищенной", разветвленной с dev.
  • очищенная ветвь удалила все файлы.
  • очищенная ветка сливается (или что-то?) с мастером. На этом этапе файлы были удалены с мастера. И "очищенная" ветвь исчезла.
  • на dev, файлы все еще есть, и я продолжал добавлять к этой ветке, редактируя файлы в течение довольно долгого времени.
  • dev, объединенный с мастером, и все файлы, которые были удалены ранее, были удалены.

Надеюсь, это помогло кому-то, кроме меня, многому научившись использовать git журнал, git show, git reflog, пытающийся отладить произошедшее.

Спасибо!

Как исправить

Итак, это то, что я сделал, чтобы объединить все содержимое в dev, которое ранее было удалено обратно на master.

  • Получил все файлы/папки, которые были удалены (на dev, но не на вновь объединенном master) git diff dev --name-status | grep D > deleted_files
  • Вывод списка всех файлов и папок git log --name-status > file_history Собираем это, чтобы выяснить последнюю обновленную версию удаленного файла.
  • Пройдите список файлов deleted_files один за другим, найдите самую последнюю версию в file_history и восстановите ее. Пример: git checkout 25b8a44 view.php 25b8a44... был фиксацией с последней обновленной версией view.php. Я пробовал cherry-pick и просто прямой git checkout dev view.php, но я нашел явно использование идентификатора commit, он объединил больше его истории. (Включая фиксацию, которая приводит к удалению файла в первую очередь.)
  • Как только все удаленные файлы вернутся к быстрой проверке, git diff dev --name-status | grep D показывает, что все файлы скопированы. Затем, как сказал Уолтер, ампер-команда совершает git commit --amend:)
4b9b3361

Ответ 1

Похоже, что git думает, что недостающие файлы были удалены на главном в какой-то момент между тем, где он веткится от dev и pre-merge head. Это единственная причина, по которой я могу думать о том, почему git молчал бы отбросить отслеживаемые файлы во время слияния.

К сожалению, я не знаю, как это исправить. Я бы, вероятно, просто повторно добавил все удаленные файлы из ветки dev вручную (или с небольшим количеством скриптов bash), а затем в git commit --amend, чтобы пересмотреть фиксацию слияния, чтобы включить их.