我有2个git分支branch1和branch2,我想将branch2中的file.py合并到branch1中的file.py中,并且只将该文件合并。
本质上我只想处理branch1中的file.py但想要利用merge命令。这样做的最佳方式是什么?
答案 0 :(得分:167)
已接受的答案已提到使用git checkout
。现在,来自file.py
的{{1}}中的内容可能不再适用于branch2
。这种情况需要挑选一些变化并留下其他变化。因此,要完全控制使用branch1
开关执行交互式合并:
--patch
$ git checkout --patch branch2 file.py
手册页中的交互模式部分说明了要使用的密钥:
git-add(1)
split命令特别有用。
答案 1 :(得分:96)
正如评论中所指出的,这在技术上并不是“合并”,这就是下面的链接使用引号的原因。但是,我很少需要像其他海报所描述的那样复杂的东西,所以我认为对于OP的问题,如果不是一个合适的解决方案是有用的。
查看此页面:Git Tip: How to "Merge" Specific Files from Another Branch它提供了最简单的方法,恕我直言。
基本上,将它应用于您的情况:
$ git checkout branch1 # i.e. make sure you're in branch1
$ git checkout branch2 file.py
简单易用,file.py现在在branch1。
答案 2 :(得分:14)
file.py
中branch2
的所有修改是否都在自己的提交中,与其他文件的修改分开?如果是这样,您只需cherry-pick
进行更改:
git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>
否则,merge
不会对各个路径进行操作...您也可以从git diff
和{{1}创建file.py
次branch2
次更改补丁他们到git apply
:
branch1
答案 3 :(得分:10)
其他目前的答案都不会真正&#34;合并&#34;这些文件,就好像您使用的是merge命令一样。 (最好它们会要求你手动选择差异。)如果你真的想利用来自共同祖先的信息进行合并,你可以遵循一个基于"Advanced Merging" section的git merge-file的程序。 git参考手册。
对于此协议,我假设您想要合并文件&#39; path / to / file.txt&#39;从origin / master到HEAD - 根据需要进行修改。 (您不必位于存储库的顶级目录中,但它会有所帮助。)
# Find the merge base SHA1 (the common ancestor) for the two commits:
git merge-base HEAD origin/master
# Get the contents of the files at each stage
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show HEAD:path/to/file.txt > ./file.ours.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt
# You can pre-edit any of the files (e.g. run a formatter on it), if you want.
# Merge the files
git merge-file -p ./file.ours.txt ./file.common.txt ./file.theirs.txt > ./file.merged.txt
# Resolve merge conflicts in ./file.merged.txt
# Copy the merged version to the destination
# Clean up the intermediate files
http://localhost/projectname/应该使用所有默认合并设置进行格式化等。
另请注意,如果您的&#34;我们的&#34;是工作副本版本,你不要过于谨慎,你可以直接在文件上操作:
git merge-base HEAD origin/master
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt
git merge-file path/to/file.txt ./file.common.txt ./file.theirs.txt
答案 4 :(得分:5)
您可以class TestCase {
transient private int x;
private int y;
public TestCase(int x, int y) {
this.x = x;
this.y = y;
}
public boolean equals(Object o) {
if (o instanceof TestCase && (((TestCase) o).getXValue() == getYValue()))
return true;
else
return false;
}
public int hashCode() {
return x + y;
}
public int getXValue() {
return x;
}
public int getYValue() {
return y;
}
}
class TestSet {
public static void main(String[] args) {
TestCase tc1 = new TestCase(4, 8);
TestCase tc2 = new TestCase(4, 8);
Set<TestCase> set = new HashSet<TestCase>();
set.add(tc1);//succeeds
set.add(tc2);//succeeds
System.out.println(set.add(tc2));//fails and gives us false.
tc2 = new TestCase(4, 8);
System.out.println(set.add(tc2));//succeeds and gives us true?
System.out.println(set.size());
System.out.println(set.contains(tc1));
System.out.println(set.contains(tc2));
}
}
和stash
文件:
stash pop
答案 5 :(得分:2)
要仅合并来自branch2的file.py
的更改,请使其他更改消失。
git checkout -B wip branch2
git read-tree branch1
git checkout branch2 file.py
git commit -m'merging only file.py history from branch2 into branch1'
git checkout branch1
git merge wip
合并永远不会查看任何其他文件。如果树木足够不同,您可能需要'-f'结帐。
请注意,这将使branch1看起来好像branch2的历史记录中的所有内容都已合并,这可能不是您想要的。上面第一个结账的更好版本可能是
git checkout -B wip `git merge-base branch1 branch2`
在这种情况下,提交消息可能也应该是
git commit -m"merging only $(git rev-parse branch2):file.py into branch1"
答案 6 :(得分:2)
我发现让我头疼最少的解决方案:
git checkout <b1>
git checkout -b dummy
git merge <b2>
git checkout <b1>
git checkout dummy <path to file>
完成此操作后,path to file
中b2
中的文件将与b1
完全合并。
答案 7 :(得分:0)
我处于相同的情况,我想合并一个分支上的文件,该分支在2个分支上有很多提交。我尝试了上述多种方法,并且在互联网上发现了其他方法,但都失败了(因为提交历史很复杂),所以我决定按照自己的方式做(疯狂的方式)。
git merge <other-branch>
cp file-to-merge file-to-merge.example
git reset --hard HEAD (or HEAD^1 if no conflicts happen)
cp file-to-merge.example file-to-merge
答案 8 :(得分:0)
如果您只关心解决冲突而不是保留提交历史记录,则以下方法应该有效。假设您要将a.py b.py
中的BRANCHA
合并到BRANCHB
中。首先,请确保BRANCHB
中的所有更改都已提交或隐藏,并且没有未跟踪的文件。然后:
git checkout BRANCHB
git merge BRANCHA
# 'Accept' all changes
git add .
# Clear staging area
git reset HEAD -- .
# Stash only the files you want to keep
git stash push a.py b.py
# Remove all other changes
git add .
git reset --hard
# Now, pull the changes
git stash pop
git
无法识别a.py b.py
中存在冲突,但是如果实际上存在冲突,则存在合并冲突标记。使用第三方合并工具(例如VSCode),可以更加轻松地解决冲突。
答案 9 :(得分:0)
最简单的解决方案是:
git签出源分支的名称以及要添加到当前分支的特定文件的路径
git checkout sourceBranchName pathToFile
答案 10 :(得分:0)
Matthew Turner 的解决方案是最简单的,但如果 branch1 和 file 具有相同的名称,则会出现错误。在这种情况下,将第二行替换为
git checkout branch2 -- file.py