Я пытался объединить ветвь 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
:)