我有两个分支(A和B),我想将A分支中的一个文件与B分支中相应的一个文件合并。
我有两个分支(A和B),我想将A分支中的一个文件与B分支中相应的一个文件合并。
我遇到了同样的问题。具体来说,我有两个分支 A
和 B
,它们有相同的文件,但某些文件在编程接口上有所不同。现在文件 f
的方法在分支 B
中被修改了,该修改对于两个分支都很重要,但文件 f
与接口的差异无关。因此,我需要合并分支 B
中的文件 f
到分支 A
的文件 f
。
如果我假设所有更改都在分支 A
和 B
中提交了,那么一个简单的命令已经为我解决了这个问题:
git checkout A
git checkout --patch B f
第一个命令切换到分支A
,我想要合并B
的版本文件f
。第二个命令使用B
的f
文件中的f
与HEAD
补丁文件f
。您甚至可以接受/拒绝补丁的单个部分。在这里您可以指定任何提交,而不一定是HEAD
。B
上的f
文件还不存在于A
上,则省略--patch
选项。否则,您将收到“无更改”的消息。git checkout --patch B -- f
才能使其正常工作。 - user545424a
键,而不是每次按下 y
键。或者使用 git checkout B -- f
命令。 - Dmitry Gonchar这使用了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将检出文件/路径。 - SherylHohmangit diff
也可以用来验证差异。 - Pedro OSgit diff
时,也可以在文件暂存的情况下使用--cached
选项。顺便问一下,你能详细解释一下git checkout --patch
方法和这个方法之间的区别吗?这两种方法有什么劣势吗?我更习惯于使用这个方法,但我想了解一下。 - undefined以下是我在这种情况下的解决方案。虽然有点丑陋,但对我来说完全可行。
我曾试过打补丁,但我的情况太糟糕了。简而言之,看起来像这样:
工作分支:A
实验性分支:B(包含我想要折叠进去的更改文件)
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
分歧,以其他方式开始。复制将覆盖这些差异。 - blamb请阅读整篇文章以获得更多理解。事实证明,我们正在努力尝试。我们好朋友 git checkout 是完成此任务的正确工具。
git checkout 源分支 <路径>...
我们只需要给 git checkout 提供要添加到主分支的特定文件的功能分支 A 的名称和路径即可。
git merge-file
。 - blambgit checkout --patch master <fn>
git checkout --patch master <filespec>
。 - chmaynardexport other=<sha1 or branch name of the other commit>
export base=$(git merge-base @ $other)
git diff $base $other <file> [<file> ...] | git apply --cached --3way
--cached --3way
apply的模式。成功地进行三方补丁应用取决于能够访问基础提交和其他提交中所需文件的 blob,如果我们使用相同的本地仓库运行 diff 命令生成补丁,则可以保证这一点。checkout --patch
需要交互式解决冲突,merge-file
将冲突以diff3模式写入工作目录)不同,而且我认为更加优越。一些集成开发环境不支持内联工作树冲突标记,但大多数可以很好地处理记录在索引中的冲突。$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
。 - R.Chatsirigit show B:src/common/store.ts > /tmp/store.ts
(其中B是分支名/提交/标签)
meld src/common/store.ts /tmp/store.ts
我会这样做:
git format-patch branch_old..branch_new file
这将为该文件生成一个补丁。
在目标分支branch_old上应用补丁
git am blahblah.patch