Як зберегти локальний або віддалений файл під час злиття за допомогою Git та командного рядка?


195

Я знаю, як об'єднати модифікацію за допомогою vimdiff, але, припускаючи, що я просто знаю, що весь файл добре зберігати або викидати, як це зробити?

Я не хочу відкривати vimdiff для кожного з них, я міняю команду хочу, щоб сказати "зберігати локальний" або "тримати віддалений".

EG: Я отримав об'єднання з файлами, позначеними як змінені, тому що хтось відкрив його під вікнами, змінивши EOL, а потім здійснив поступку. Під час злиття я хочу просто зберегти власну версію та відкинути його.

Мене також цікавить протилежне: я накрутив великий час і хочу прийняти віддалений файл, відкинувши свої зміни.

Відповіді:


310

Ви також можете:

git checkout --theirs /path/to/file

щоб зберегти віддалений файл, і:

git checkout --ours /path/to/file

щоб зберегти локальний файл.

Потім git addїх і все робиться.

Видання: Майте на увазі, що це для mergeсценарію. Під час rebase --theirsзвернення до галузі, де ви працювали.


4
Я це зробив .. але нічого не відбувається .. як я знаю, що він бере правильний файл? Я використовую, git version 1.8.4якщо це має значення.
Росді Касім

3
чому вживається зворотне слово? Я припускаю, що "їх" був би віддаленим файлом, а "нашим" був би мій файл
phuclv

1
Так воно і є, @ LưuVĩnhPhúc
Чекаю Дева ...

7
немає, їх значення зверненого stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 їх би мої файли і наші є файли в віддаленому філії
phuclv

6
"Легко", так. Інтуїтивно зрозумілий? №
Вілбур Уотлі

109

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

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

або

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Скопійовано безпосередньо з: Вирішіть конфлікти злиття Git на користь їх змін під час потягу


3
Любіть цього. Особливо, якщо є більше одного файлу.
Текст

Питання полягало у двох різних командах, але немає опису того, що вони роблять. Що робить кожен рядок?
Олексій

Я пройшов щонайменше п’ять відповідей stackoverflow, перш ніж знайти це, чого я хотів. Дякую.
Болтон Бейлі

14

git checkout {branch-name} -- {file-name}

Для цього буде використаний файл із обраної гілки.

Мені це подобається, тому що posh-gitавтозаповнення чудово справляється з цим. Це також усуває неоднозначність щодо того, яка галузь віддалена, а яка локальна. І --theirsне працював для мене все одно.


Немає двозначностей, працює як для {mine}, так і для {їхніх}, підтримує додавання цілих каталогів. Це має бути прийнятою відповіддю.
dotancohen

9

Що стосується реального рядка, зверніться до man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Обов’язково додайте autocrlf = falseта / або safecrlf = falseклон Windows (.git / config)

Використання git mergetool

Якщо ви налаштуєте такий mergetool:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Тоді простий

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Зробіть роботу

Використання простих команд git

В інших випадках я припускаю

git checkout HEAD -- path/to/myfile.txt

повинен зробити трюк

Редагуйте, щоб зробити зворотний (тому що ви накрутили):

git checkout remote/branch_to_merge -- path/to/myfile.txt

+1 для порад, але не прийнято, але тому, що я не просив цього. Я хочу, щоб щось працювало у всіх випадках, а не лише у прикладних випадках. Крім того, "git checkout remote / branch_to_merge - path / to / myfile.txt" не працюватиме, якщо ви вже розпочали злиття: це скаже, що ви знаходитесь в середині об'єднання, і заважатиме вам це робити.
e-satis

1
@ e-satis: це дивно. Я вважаю, що це помилка, оскільки оформлення замовлення з контуром не є звичайним замовленням (і це не впливає на HEAD). Я хочу спробувати це зараз , тому що я не можу повірити , що це
sehe

1
@ e-satis: Soooo ... я мав рацію; git checkout remote/branch_to_merge -- path/to/myfile.txtпрацює як принадність при вирішенні конфлікту злиття. (git 1.7.1)
sehe

1
Додано рішення на основі git mergetool зараз
1111
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.