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, я не знал, что я делал, и сделал сумасшедшие вещи, такие как сброс, возвращаются и т. Д.)
Надеясь, один из вас Git Git Guuru здесь на стеке Переполнение знает ответ. :)
Спасибо, quang.
Отвечать
Спасибо Уолтер, да, это то, что случилось.
После того, как некоторые расследовали, я узнал, что это было немного сложно, что случилось. Оказалось, что.
- Разветвленные от мастера, у него были все файлы.
- Третий ветвь, давайте назовем это «очищенным», разветвленным с Dev.
- Очищенная ветвь удалила все файлы.
- Очищенная ветвь слилась (или что-то?) с мастером. На данный момент файлы были удалены от Master. И «очищенная» филиал исчезла.
- На разработке файлы все еще есть, и я продолжал добавлять в эту ветку, редактируя файлы на несколько раз.
- Dev объединился с Master и всеми файлами, которые были удалены ранее очищенными, исчезли.
Надеюсь, что это помогло кому-то, кроме меня, кто узнал довольно много о том, как использовать GIT Log, Git Show, Git Refrold Perruit, пытаясь отлаживать то, что произошло.
Спасибо!
Как исправить
Так что это то, что я сделал, чтобы объединить все содержимое в разработке, который ранее был удален на мастер.
- Получил все файлы / папки, которые были удалены (на dev, но не на недавно объединенном мастере)
git diff dev --name-status | grep D > deleted_files
- Выходной список всех файлов и папок
git log --name-status > file_history
Собираюсь использовать это, чтобы выяснить последнюю обновленную версию удаленного файла. - Пройдите список deleded_files один за другим, найдите самую обновленную версию в 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
:)
Решение
Похоже, что Git считает, что отсутствующие файлы были удалены на мастере в какой-то момент между там, где он ветви от DEV и головки предварительной слияния. Это единственная причина, по которой я могу подумать о том, почему Git молча закачивает отслеживание файлов во время слияния.
К сожалению, я не знаю хороший способ исправить это. Я, наверное, просто повторно добавляю все удаленные файлы из ветви DEV вручную (или с небольшим количеством сценариев Bash), а затем к git commit --amend
пересмотреть коммит слияния, чтобы включить их.