Как сохранить локальный файл или удаленный файл во время слияния, используя Git и командную строку?

195

Я знаю, как объединить изменения, используя vimdiff, но, если я просто знаю, что весь файл можно сохранить или выбросить, как мне это сделать?

Я не хочу открывать vimdiff для каждого из них, я хочу изменить команду на «локальный» или «удаленный».

Е.Г .: Я получил слияние с файлами, помеченными как измененные, потому что кто-то открыл его под окнами, изменил 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
"Легко", да. Интуитивно? Нет.
Уилбур Уэйтли,
110

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

# 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 слияния в пользу их изменений во время вытягивания

keflavich
источник
3
Нравится вот этот. Особенно, если есть более одного файла.
Tek
Вопрос был для двух разных команд, но нет описания того, что эти две команды делают. Что делает каждая строка?
Алекс
Я нашел, по крайней мере, пять ответов 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
sehe
источник
+1 за советы, но не принято, потому что это не то, что я просил. Я хочу что-то, что работает во всех случаях, а не только в примерах. Плюс «git checkout remote / branch_to_merge - path / to / myfile.txt» не будет работать, если вы уже начали слияние: оно скажет, что вы находитесь в середине слияния и помешает вам сделать это.
E-Удовлетворительно
1
@ E-удовлетворительно: это удивительно. Я бы посчитал это ошибкой, поскольку проверка с путем не является обычной проверкой (и это не влияет на HEAD). Я собираюсь попробовать это сейчас, потому что я не могу в это поверить
сехе
1
@ E-удовлетворительно: Тааак ... я был прав; git checkout remote/branch_to_merge -- path/to/myfile.txtработает как шарм при разрешении конфликта слияния. (git 1.7.1)
сехе
1
Добавлено решение , основанное на мерзавца mergetool Сейчас
sehe