Git: хранить различные этапы файла в индексном / рабочем дереве после конфликта - PullRequest
5 голосов
/ 03 ноября 2010

Предположим, что один файл находится в конфликтном состоянии с git.

Это означает, что индекс содержит 3 версии файла: предыдущую, одну из одной ветви, одну из другой ветви.

Я бы хотел оформить версию 3 («свою») в рабочем каталоге и версию 2 («нашу») в индексе.

Есть ли безболезненный способ сделать это?

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

Вероятно, самый безболезненный способ - вот так.

# Checkout 'their' version from the index into the working tree
git checkout --theirs file

# reset the index to the HEAD version, i.e 'our' branch
git reset HEAD file

Неважно возиться с указателем с помощью update-index сантехники, если вы не потеряли HEAD (так сказать).

1 голос
/ 03 ноября 2010

Хитрость в том, чтобы «добавить одну версию в индекс»: это пометит файл как решенный (что означает, что «наши» или «их» больше не будут).
Так что это должен быть последний шаг.

Может быть что-то вроде:

git show :3:<filename> > <filename>.theirs # save the "theirs" version in a tmp file
git show :2:<filename> > <filename>        # display the "ours" version in the working dir 
git add <filename>                         # add it to the index
                                           #  (marking the conflicting file as resolved)
move  <filename>.theirs  <filename>        # erasing the file with the "theirs" version
                                           # in the working directory

Не совсем "безболезненно" ...


Чтобы избежать временного файла, Якуб Нарембский предлагает использоватьgit update index (сантехническая команда) для непосредственного управления индексом.

--replace --cacheinfo <mode> <object> <path> 

--cacheinfo используется для регистрации файла, который не являетсяв текущем рабочем каталоге.Это полезно для слияния минимального извлечения.

По умолчанию, когда в индексе существует путь к файлу, git update-index отказывается от попытки добавить path/file.Точно так же, если файл path/file существует, путь к файлу не может быть добавлен.С флагом --replace существующие записи, конфликтующие с добавляемой записью, автоматически удаляются с предупреждающими сообщениями.

...