У мене є дві гілки (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
Скопіюйте ша1 хеш злиття:
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
початку іншими способами. Копіювання замінить ці відмінності.
Для цього використовується внутрішній дифтол 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: 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) порівняє файл правильної гілки, щоб майстер (2) інтерактивно запитав вас, які модифікації застосувати.
git checkout - майстер патчу
Мою редакцію відхилено, тому я додаю, як тут впоратись із об'єднанням змін із віддаленої гілки.
Якщо вам доведеться це зробити після неправильного злиття, ви можете зробити щось подібне:
# 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.
Якщо В є поточною галуззю:
$ 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
це створить виправлення для файлу.
Застосувати виправлення на цільовому відділенні_old
git am blahblah.patch