После файла git rm; commit - как получить файл обратно из удаленной ветки? - PullRequest
8 голосов
/ 06 января 2011

Я потянул в свой каталог .emacs и столкнулся со следующим конфликтом:

CONFLICT (add/add): Merge conflict in elisp/dired-details+.el

Состояние Git показало следующее:

 Unmerged paths:
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #  both added:         elisp/dired-details+.el

Хорошо, поэтому Git предложил использовать git rm.Я хочу полностью заменить локальный файл файлом, который я извлекаю, так что это вроде как разумно ... Так что я делаю git rm elisp/dired-details+.el и git merge.Я получаю:

git merge: fatal: Вы не завершили свое слияние (MERGE_HEAD существует).Пожалуйста, передайте изменения до того, как вы сможете объединиться.

Хорошо, хорошо: git commit -a -m "ugh merge conflicts";git pull origin master.

Теперь все отлично сливается, за исключением того, что мне не хватает dired-details+.el, я немного растерялся и хотел бы знать ответы на следующие вопросы:

  1. Как мне отменить git-rm и получить этот файл из удаленной ветви? ..
  2. Почему вообще возник конфликт? .. Что здесь происходит с add/add? ..
  3. Что я должен был сделать вместо git-rm 'файла, который я хотел заменить? ..

1 Ответ

9 голосов
/ 06 января 2011

Сначала отмените коммит слияния, используя git reset --hard HEAD^. Обратите внимание, что это уничтожит последний коммит и вернет вашу рабочую копию в состояние предыдущего коммита, поэтому будьте осторожны, чтобы понять, что это будет делать, прежде чем делать это. gitk может помочь с визуализацией.

Во-вторых, git rm не делает то, что вы ожидали здесь. Когда у вас возникает конфликт слияния, вы смотрите на файл в полуслитом состоянии с файлом, содержащим маркеры конфликта, чтобы вы могли разрешить конфликт. На этом этапе вас просят исправить рабочую копию до состояния, в котором вы хотите, чтобы выглядел финальный коммит слияния. Удалив файл, вы сказали git, что больше не хотите, чтобы файл присутствовал, а это не то, что вы хотели.

На этом этапе вам нужно обновить конфликтующий файл в вашей рабочей копии до версии, которую вы хотите сохранить. Обычно это делается путем изучения маркеров конфликта и соответствующей настройки файла. В вашем случае, если вы точно знаете, что хотите получить копию из ветви, из которой вы объединяете, вы можете использовать git show :3:elisp/dired-details+.el > elisp/dired-details+.el для этого. Затем git add elisp/dired-details+.el, чтобы сообщить git, что вы разрешили конфликт в этом файле, а затем git commit для завершения.

Здесь git show :3:... запрашивает версию файла у MERGE_HEAD. Если вам нужна другая версия, вы также можете использовать 1 для общего предка или 2 для "вашей" стороны слияния.

...