Как объединить изменения в один файл, а не слияния?

У меня есть две ветки (A и B), и я хочу объединить один файл из ветки A с соответствующим одним файлом из ветки B.

Ответ 1

Я столкнулся с той же проблемой. Если быть точным, у меня есть две ветки 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. В противном случае вы получите "Без изменений". сообщение.

Ответ 2

Вот что я делаю в этих ситуациях. Это kludge, но он отлично подходит для меня.

  • Создайте еще одну ветку, исходящую из вашей рабочей ветки.
  • git pull/ git объединить ревизию (SHA1), которая содержит файл, который вы хотите скопировать. Таким образом, это объединит все ваши изменения, но мы используем эту ветвь, чтобы захватить один файл.
  • Исправьте любые конфликты и т.д. исследуйте файл.
  • проверить свою рабочую ветвь
  • Оформить заказ файла, полученного из вашего слияния.
  • Зафиксируйте его.

Я пробовал исправление, и моя ситуация была слишком уродливой. Короче говоря, это будет выглядеть так:

Рабочая ветвь: A Экспериментальная ветвь: B (содержит файл .txt, который имеет изменения, которые я хочу сбросить.)

git checkout A

Создайте новую ветку на основе A:

git checkout -b tempAB

Объединить B в tempAB

git merge B

Скопируйте хэш файл sha1 слияния:

git log

commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <[email protected]>
Date:   Wed Oct 3 15:13:24 2012 -0700

Merge branch 'B' into tempAB

Проверьте свою рабочую ветку:

git checkout A

Оформить свой фиксированный файл:

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt

И там вы должны это иметь. Зафиксируйте свой результат.

Ответ 4

В этом случае используется git внутренний diffftool. Возможно, нужно немного поработать, но просто вперед.

#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.

Ответ 5

Следующая команда (1) сравнить файл с правильной ветвью, (2) интерактивно спросите, какие изменения применяются.

git checkout --patch master

Ответ 6

Предполагая, что B является текущей ветвью:

$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R

Обратите внимание, что это касается только изменений в локальном файле. После этого вам нужно будет зафиксировать.

Ответ 7

Мое редактирование получило отклонение, поэтому я связываюсь с тем, как обрабатывать слияние изменений с удаленной веткой.

Если вам нужно сделать это после неправильного слияния, вы можете сделать что-то вроде этого:

# 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.

Ответ 8

Я сделаю это как

git format-patch patch_old..branch_new file

это произведет патч для файла.

Применить патч на целевой branch_old

Git Am Blahblah.patch

Ответ 9

Вы можете извлечь старую версию файла для слияния, сохранив ее под другим именем, а затем запустить любой инструмент слияния для двух файлов.

например.

git show B:src/common/store.ts >/tmp/store.ts (где B - имя ветки /commit/tag)

meld src/common/store.ts/tmp/store.ts

Ответ 11

Самый простой способ:

git checkout d3807641672bb7642ed45fa3ac1db907f1d43704 (хеш)

Вам не нужно указывать ветвь, так как хеши не зависят друг от друга на каждой ветке. Таким образом, Git может понять все файлы.

Ключевым моментом здесь является: зафиксировать только нужный файл - просто добавить разрыв строки или что-то еще, а затем совершить. Затем используйте этот трюк, и все хорошо.