我有两个分支(A和B),我想将来自分支A的单个文件与来自分支B的相应单个文件合并。
我有两个分支(A和B),我想将来自分支A的单个文件与来自分支B的相应单个文件合并。
Answers:
我遇到了同样的问题。确切地说,我有两个分支,A
并且B
具有相同的文件,但在某些文件中具有不同的编程接口。现在f
,独立于两个分支的接口差异的file方法已在分支中更改B
,但更改对于两个分支都很重要。因此,我只需要将f
branch的B
文件合并到branch的文件f
中A
。
如果我假设所有更改都在两个分支A
和中提交,那么一个简单的命令已经为我解决了问题B
:
git checkout A
git checkout --patch B f
第一个命令切换到分支A
,进入我要合并B
文件版本的位置f
。第二个命令f
使用f
的HEAD
of 修补文件B
。您甚至可以接受/丢弃补丁的单个部分。不必在B
此处指定任何提交,而不必指定HEAD
。
社区编辑:如果文件f
on B
尚不存在A
,则忽略该--patch
选项。否则,您将获得“无更改”。信息。
git checkout --patch B -- f
它来工作。
a
在交互阶段按,而不是y
每次都按。或使用git checkout B -- f
命令代替。
这是我在这些情况下的工作。这很麻烦,但对我来说很好。
我尝试打补丁,但情况太丑陋了。简而言之,它看起来像这样:
工作分支: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 <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的内部difftool。可能需要做一些工作,但要直截了当。
#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
我的编辑被拒绝了,所以我在这里附加了如何处理来自远程分支的合并更改。
如果必须在错误合并之后执行此操作,则可以执行以下操作:
# 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