Вопрос по git-branch, merge, git – Как объединить изменения в один файл, а не объединить коммиты?

298

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

Большинство ответов на этот пост о том, как выборочно объединитьcommitsнеfiles, Это делает выбранный ответ неверным. Вопрос остается без ответа. user153275
Уже обсуждалось здесьstackoverflow.com/questions/449541/… positron
Возможный дубликатHow do you merge selective files with git-merge? phuclv

Ваш Ответ

9   ответов
497

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

Community edit: Если файлf наB не существует наA а затем опустить--patch вариант. В противном случае вы получите «Без изменений». сообщение.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededmultiple changes (hunks)Error: User Rate Limit Exceededto stage all of themError: User Rate Limit ExceededaError: User Rate Limit ExceededyError: User Rate Limit Exceededgit checkout B -- fError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
8

Вы можете использовать:

    git merge-file

Совет:https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html

0

My edit got rejected, so I'm attaching how to handle merging changes from a remote branch here.

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

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

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

git checkout --patch master

13

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

  1. Create another branch based off of your working branch.
  2. git pull/git merge the revision (SHA1) which contains the file you want to copy. So this will merge all of your changes, but we are only using this branch to grab the one file.
  3. Fix up any Conflicts etc. investigate your file.
  4. checkout your working branch
  5. Checkout the file commited from your merge.
  6. Commit it.

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

Рабочая ветвь: A Экспериментальная ветка: 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 <[email protected]>
Date:   Wed Oct 3 15:13:24 2012 -0700

Merge branch 'B' into tempAB

Оформите свою рабочую ветку:

git checkout A

Оформите ваш исправленный файл:

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt

И там у вас должно быть это. Передайте свой результат.

Error: User Rate Limit Exceeded
1

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

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

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

Error: User Rate Limit Exceedederror: <file-path>: already exists in working directory
8

Это использует внутренний 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.
Error: User Rate Limit Exceeded--Error: User Rate Limit ExceededARGUMENT DISAMBIGUATIONError: User Rate Limit Exceededgit checkout -- <pathspec>Error: User Rate Limit Exceeded--Error: User Rate Limit Exceeded
0

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

например.

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

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

0

I will do it as

git format-patch patch_old..branch_new file

this will produce a patch for the file.

Apply patch at target branch_old

Git Am Blahblah.patch

Похожие вопросы