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