У меня есть две ветви (A и B), и я хочу объединить один файл из ветви A с соответствующим одним файлом из ветви B.
git diff branch_name > patch
git apply patch
, stackoverflow.com/a/9473543/1091853
У меня есть две ветви (A и B), и я хочу объединить один файл из ветви A с соответствующим одним файлом из ветви B.
git diff branch_name > patch
git apply patch
, stackoverflow.com/a/9473543/1091853
Ответы:
Я столкнулся с той же проблемой. Если быть точным, у меня есть две ветви A
и B
с одними и теми же файлами, но с другим интерфейсом программирования в некоторых файлах. Теперь методы файла f
, который не зависит от различий интерфейса в двух ветвях, были изменены в ветке B
, но это изменение важно для обеих ветвей. Таким образом, мне нужно просто объединить файл f
филиала B
в файл f
филиала A
.
Простая команда уже решила проблему для меня, если я предполагаю, что все изменения зафиксированы в обеих ветках A
и B
:
git checkout A
git checkout --patch B f
Первая команда переключается в ветку A
, в которую я хочу объединить B
версию файла f
. Вторая команда исправляет файл f
с f
из HEAD
из B
. Вы можете даже принять / отменить отдельные части патча. Вместо того, B
чтобы указать здесь любой коммит, это не обязательно должно быть HEAD
.
Сообщество редактирование : Если файл f
на B
не существует на A
еще, то опустит --patch
вариант. В противном случае вы получите «Без изменений». сообщение.
git checkout --patch B -- f
чтобы заставить это работать.
a
во время интерактивной фазы, вместо того, чтобы нажимать y
каждый раз. Или используйте git checkout B -- f
команду вместо.
Вот что я делаю в этих ситуациях. Это клудж, но он прекрасно работает для меня.
Я попытался исправить, и моя ситуация была слишком уродлива для этого. Короче, это будет выглядеть так:
Рабочая ветвь: Экспериментальная ветвь: B (содержит файл file.txt, в котором есть изменения, которые я хочу добавить.)
git checkout A
Создать новую ветку на основе A:
git checkout -b tempAB
Слить B в tempAB
git merge B
Скопируйте sha1-хеш слияния:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Оформите свою рабочую ветку:
git checkout A
Оформите ваш исправленный файл:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
И там у вас должно быть это. Зафиксируйте свой результат.
A
отклонился от B
начала другими способами. Копирование переопределит эти различия.
Это использует внутренний diff-инструмент git. Может быть, немного работы, но прямо вперед.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(пустая метка аргумента), в git checkout docs: ARGUMENT DISAMBIGUATION говорят: «используйте, git checkout -- <pathspec>
если вы хотите извлекать эти пути из индекса». Это потому, что вы можете иметь как ветку, так и файл / путь с одним и тем же именем. В таких случаях вместо того, чтобы просить вас устранить неоднозначность, следует ли извлекать ветку или путь, если оба существуют, git по умолчанию выберет извлечение ветки. Однако, если --
предшествует, git извлечет файл / путь вместо этого.
Я нашел этот подход простым и полезным: как «объединить» определенные файлы из другой ветки
Оказывается, мы слишком стараемся. Наш хороший друг Git Checkout является правильным инструментом для работы.
git checkout source_branch <paths>...
Мы можем просто дать git checkout имя ветви функции A и пути к конкретным файлам, которые мы хотим добавить в нашу основную ветку.
Пожалуйста, прочитайте всю статью для большего понимания
-p
опции в этой команде. Который затем перезаписывает любые части в вашем файле рабочего дерева, которые ранее были отклонены от ветви, из которой вы извлекаете, к сожалению, до изменения патча.
Вы можете использовать:
git merge-file
Совет: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html.
git merge-file
Следующая команда (1) сравнит файл правильной ветки, чтобы master (2) в интерактивном режиме запросил, какие изменения применить.
git checkout --patch master
Мое редактирование было отклонено, поэтому я прилагаю, как обрабатывать слияния изменений из удаленной ветви здесь.
Если вам нужно сделать это после неправильного слияния, вы можете сделать что-то вроде этого:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
Предполагая, что B является текущей ветвью:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Обратите внимание, что это относится только к изменениям в локальном файле. Вам нужно будет совершить потом.
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Я сделаю это как
git format-patch branch_old..branch_new file
это произведет патч для файла.
Примените патч к цели branch_old
git am blahblah.patch