Разрешение конфликтов с помощью удаленных изменений при извлечении из 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.