Git Merge - неполные, отсутствующие файлы и папки
Я пытался объединить ветку разработчика в мастер.
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 status». Это также не появилось в конце, когда я исправил объединенные конфликты.
Также, когда я пытаюсь слить снова, он говорит:
git merge dev
Already up-to-date.
Тем не менее, в основной ветке явно отсутствуют файлы / папки из ветки dev. Это почему? Не следует ли добавить эту папку и все ее содержимое? «Папки» отслеживаются в ветке dev, так что, если бы я сделал это слияние, разве он не должен был быть остановлен?
Когда ранее был конфликт слияния, git остановил процесс слияния и пропустил кучу файлов / папок?
В ветке dev было довольно много изменений, мог ли я когда-нибудь напутать с git, что теперь некоторые файлы / папки не слились бы?
(Когда я впервые создал ветку dev, я не знал, что делаю, и делал сумасшедшие вещи, такие как сброс, возврат и т. Д.)
Надеюсь, что один из вас, гит-гуру из переполнения стека, знает ответ. :)
Спасибо Куанг
ОтветСпасибо Уолтер, Да, это то, что случилось.
Проведя некоторое расследование, я обнаружил, что случилось немного сложнее. Оказалось, что.
dev разветвлен от master, у него были все файлы.Третья ветка, назовем ее «очищенной», ветвь от dev.Почистил ветку, удалил все файлы.очищенная ветка слилась (или что-то?) с мастером. В этот момент файлы были удалены с мастера. И «очищенная» ветка исчезла.на dev файлы все еще есть, и я продолжал добавлять в эту ветку, редактируя файлы довольно долго.dev слился с master, и все файлы, которые были ранее удалены, были удалены.Надеюсь, что это помогло кому-то, кроме меня, кто довольно много узнал о том, как использовать git log, git show, git reflog, пытаясь отладить то, что произошло.
Спасибо!
Как исправитьЭто то, что я сделал, чтобы объединить все содержимое в dev, которое было ранее удалено, обратно в master.
Получил все файлы / папки, которые были удалены (в dev, но не во вновь объединенном master)git diff dev --name-status | grep D > deleted_files
Вывод списка всех файлов и папокgit log --name-status > file_history
Используйте это, чтобы выяснить последнюю обновленную версию удаленного файла.Просмотрите список удаленных файлов один за другим, найдите самую последнюю версию в file_history и восстановите ее. Пример:git checkout 25b8a44 view.php
25b8a44 ... был коммит с последней обновленной версией view.php. Я старалсяcherry-pick
и просто прямойgit checkout dev view.php
но я обнаружил, явно используя коммит идентификатор, он объединяет больше своей истории. (Включая коммит, который вызывает удаление файла в первую очередь.)После того, как все удаленные файлы вернутся к быстрой проверкеgit diff dev --name-status | grep D
показывает, что все файлы скопированы. Тогда, как Уолтер сказал, внести измененияgit commit --amend
:)