Вирішуйте конфлікти, використовуючи віддалені зміни, коли витягуєте з 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

Я особисто рекомендую спершу створити гілку резервного копіювання у вашій нинішній ГОЛОВІ, так що якщо ви зрозумієте, що це була погана ідея, ви не втратили її.

Якщо, з іншого боку, ви хочете зберегти ці зобов’язання і зробити їх схожими на те, що ви злилися з початком, і змусити злиття зберегти версії лише від джерела, ви можете використовувати 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 origin" після другої команди?
Девід Туйте

@David: Так, ви повинні взяти з походження в якийсь момент. Вибачте, я вважав це неявним.
Каскабель

2
Немає нічого, що можна сказати, коли це стосується мене і git ;-). Якщо серйозно, дякую мільйон. Ваша відповідь - саме те, що я шукав.
Девід Туїт

1
Чи спрацює це, якщо походження насправді попереду? як в, чи можу я також використовувати його, якщо я не маю жодних зобов'язань попереду, і насправді гілка може бути переадресована?
Джаред Форсайт

1
Дякую! Зробити це здавалося легко.
sholsinger

137

Ви можете скористатися відповіддю із дублюючого посилання, вказаного nvm.

Або ви можете вирішити конфлікти, скориставшись їх змінами (але деякі зміни можуть зберігатися, якщо вони не суперечать віддаленій версії):

git pull -s recursive -X theirs

3
Здається, це не працює для мене. Я отримую "помилку: невідомий перемикач` X "за допомогою git git версії 1.5.6.5. Чи потрібно мені перейти на нестабільну версію?
Девід Туйте

Також Антуан, якщо ви хочете взяти оригінальну версію всього, а не лише конфліктного вмісту, ви можете - подивіться мою відповідь.
Каскабель

2
@David Ви можете отримати останню версію git для debian від backports.debian.org
Arrowmaster

2
Це саме те, що я шукав!
micahblu

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