Я пытался объединить ветку разработчика в 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 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, но не во вновь объединенном мастере)
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
:)