Git Merge - неполные, отсутствующие файлы и папки - PullRequest
34 голосов
/ 13 августа 2010

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

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

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


Ответ

Спасибо, Уолтер. Да, именно это и произошло.

Проведя некоторое расследование, я обнаружил, что случилось немного сложнее. Оказалось, что.

  1. dev разветвлен от master, в нем были все файлы.
  2. Третья ветвь, назовем ее "очищенной", ветвь от dev.
  3. очищены ветки, удалены все файлы.
  4. очищенная ветка слилась (или что-то?) С мастером. В этот момент файлы были удалены с мастера. И «очищенная» ветка исчезла.
  5. в dev, файлы все еще там, и я продолжал добавлять в эту ветку, редактируя файлы довольно долго.
  6. dev объединен с master, и все файлы, которые были удалены ранее очищенными, исчезли.

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

Спасибо!

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

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

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

1 Ответ

19 голосов
/ 13 августа 2010

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

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

...