2014-04-08 1 views
1

Я выхожу из репо с фиксациями, которые существенно изменяют XML-файл, так как я начал работать над ним на этом устройстве. Когда я запускаю git pull, я получаю конфликты слияния в файле, но больше не хочу локальных изменений, поэтому я просто делаю перезагрузку git перед тем, как потянуть, чтобы я не столкнулся с конфликтами. После того, как мы снова потянемся, у меня все еще возникают конфликты слияния. Если локальных изменений нет, не следует ли просто выполнять быструю перемотку и обновлять файл? Если нет, то почему я мог без проблем продвигать эти изменения?Git слить конфликт в файле у меня нет?

Чтобы исправить это, я просто удалю локальную копию файла так, чтобы git pull создавал его, но я снова вижу конфликты слияния в файле, который больше не существует. Как я могу иметь конфликты, когда у меня нет файла? Разве это не должно создаваться без проблем?

+0

Выполнение 'git reset --hard' после вытаскивания без разрешения конфликтов слияния фактически не завершит слияние, но сбрасывается на фиксацию * перед * слиянием, поэтому вы на самом деле ничего не сделали. – poke

+0

Выполняете ли вы 'git reset --hard '? Если вы это сделаете, то вы _бабите_ слияние – user3159253

+0

@poke, я запускаю сброс перед тем, как потянуть, потому что я не хочу иметь дело с конфликтами слияния и знаю, что меня не волнуют незафиксированные изменения. Я знаю, что сброс после вытаскивания и конфликта не будет делать ничего. user3159253, я считаю, что это верно и для вашего объяснения. Посмотрите, не могу ли я обновить вопрос, чтобы это отразить. – user2806590

ответ

1

Выполнение git reset --hard (без использования другого аргумента) сбрасывает текущую HEAD обратно в HEAD - так для себя, а также удаляет все незафиксированные изменения в рабочем каталоге. Таким образом, вы получаете чистое состояние для всех файлов, которые Git отслеживает. Это чистое состояние рабочего каталога фактически является требованием выполнить слияние (за исключением некоторых особых случаев). Однако это не мешает вам получить конфликты слияния.

Конфликт слияния происходит, когда объединенные две ветви имеют противоречивый файл Изменения (не состояния), которые Гит не может решить самостоятельно.

В вашем случае ветка, в которую вы сливаетесь, имеет, как вы говорите, существенные изменения в файле. Поскольку вы получаете конфликт слиянием, это означает, что вы также совершили некоторые изменения в том же файле, которые несовместимы. Таким образом, у вас есть локальные изменения в файле.

Вы попытались исправить это, удалив локальный файл. Однако удаление файла : изменение файла: оно удаляет его содержимое. Таким образом, при слиянии возможно, что вы отделили файл, который нужно удалить, что еще раз не выясняет, какова должна быть окончательная версия (если файл будет удален сейчас, если используется версия с объединением, или оба должны быть объединены в каким-то образом?). Таким образом, вы все еще сталкиваетесь с конфликтом слияния, который вам нужно решить.

Если вы не заботитесь о том, что вы сделали в файл локально, можно легко разрешить конфликт слияния, хотя, просто принимая удаленную версию и сохранить его, как это:

  1. Во-первых, начало слияние с использованием git pull. Вы должны получить конфликт слияния в этом файле.
  2. Как вы не заботитесь о своей местной версии, только проверьте удаленную версию на номер с помощью git checkout origin/master -- path/to/that/file.xml (отрегулируйте удаленной ветви и путь к файлу тоже).
  3. Теперь файл находится в том же состоянии, как в удаленном филиале вы сливаясь в
  4. Добавить изменения:. git add path/to/that/file.xml
  5. При необходимости: решить другие слияния конфликты
  6. Commit слияния для завершения Это.

И тогда вы окажетесь в состоянии, когда вы успешно объединили ветвь и разрешили конфликт слияния, взяв удаленное состояние этого файла.

+0

Удивительный ответ; Теперь я это прекрасно понимаю. Спасибо! – user2806590