Разрешение конфликтов с помощью удаленных изменений при извлечении из Git remote


297

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

Так есть ли способ заставить Git перезаписать любую версию в GitHub, а не беспокоить меня конфликтами?



4
@nvm: Нет. Это касается реальных конфликтов слияния, а не неотслеживаемых файлов, которые будут перезаписаны.
— Каскабель

Ответы:


491

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

# fetch from the default remote, origin
git fetch
# reset your current branch (master) to origin's master
git reset --hard origin/master

Я лично рекомендую сначала создать резервную ветку на вашем текущем HEAD, чтобы, если вы понимаете, что это плохая идея, вы не потеряете ее.

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

# fetch from the default remote, origin
git fetch
# create a branch at your current master
git branch old-master
# reset to origin's master
git reset --hard origin/master
# merge your old master, keeping "our" (origin/master's) content
git merge -s ours old-master

1
Во втором блоке команд git ... должен ли быть "источник git fetch" после второй команды?
— Дэвид Туит

@ Дэвид: Да, вы должны извлечь из источника в какой-то момент. Извините, я расценил это как скрытое.
— Каскабель

2
Там нет ничего, что может быть оставлено в стороне, когда дело доходит до меня и мерзавцев ;-). Если серьезно, спасибо миллион. Твой ответ - именно то, что я искал.
— Дэвид Туит

1
Будет ли это работать, если происхождение на самом деле впереди? например, могу ли я использовать его, если у меня нет никаких коммитов вперед, и на самом деле ветку можно быстро переадресовать?
— Джаред Форсайт

1
Спасибо! Сделано это кажется легким.
— Шолзингер

137

Вы можете использовать ответ из дубликата, указанного nvm.

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

git pull -s recursive -X theirs

3
Кажется, не работает для меня. Я получаю сообщение об ошибке: неизвестный ключ `X ', используя git git version 1.5.6.5. Нужно ли обновляться до нестабильной версии?
— Дэвид Туит

Кроме того, Антуан, если вы хотите взять оригинальную версию всего, а не только конфликтного контента, вы можете - посмотрите мой ответ.
— Каскабель

2
@David Вы можете получить последнюю версию git для debian с
— сайта

2
Это именно то, что я искал!
— micahblu

2
@CeesTimmerman Не правда, по крайней мере, в последнем мерзавце. XОпция передается в стратегию слияния, которая имеет место только recursiveпри слиянии двух головок, поэтому ваша команда будет жаловаться "Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree."- это позор, потому что Xможет быть установлен в конфигурации (например, git config pull.twohead theirsно sне может).
— OJFord
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.