我担心git checkout other_branch - file会覆盖我当前分支中的文件而根本不进行合并。
说我在一个名为foo的分支上。我想合并一个名为bar.js的foo文件,在一个名为baz的分支上使用相同的文件路径;
所以* foo adbe2d4 pdev:set
baz ae598f5 [ahead 5] sync-msg
看起来像:
git checkout baz -- bar.js
我知道怎么做的方法是:
<meta http-equiv="Content-Security-Policy" content="
default-src *;
img-src * data: blob:;
object-src 'self' blob:;
style-src * 'unsafe-inline';
script-src * 'unsafe-inline' 'unsafe-eval'">
我感到困惑的是,是不是这会覆盖我的分支上同名的文件?
如何从baz合并bar.js而不是检出文件并覆盖foo分支上的工作?或者我错了,合并确实发生了吗?
答案 0 :(得分:1)
你是对的,这种结帐形式:
git checkout <tree-ish> -- <path> [ <path> ... ]
只是覆盖每个路径的工作树(和索引!)版本。
通常情况下,您不希望只合并一个文件,而是合并其他一些分支的提交与您当前的提交< / em>(如果成功,将导致新的合并提交。)
要仅对一个文件进行完全三向合并,您必须在当前提交和要从中合并的提交之间选择合并基础文件。这有点棘手,而且通常也是不必要的(参见下面简单的checkout -p
方法)。
但是,如果您想这样做,可以通过git diff --full-index
自动执行此操作,并将其发送至git apply -3
。合并基础是您的选择:您可能需要当前分支的合并基础和另一个分支的提示,或者您可能只是希望您实际提交的父级,然后挑选。根据您获得的更改,这些最终可能会选择相同的合并基础文件:
git diff --full-index ...other -- path/to/file
(请注意这里的三个点!这与HEAD...other
具有相同的含义,对git diff
)具有特殊含义或:
git diff --full-index other~1 other -- path/to/file
这两个都会产生一个指定文件的差异。差异中的index
行将提供合并基础,因此现在您可以添加git apply -3
步骤:
git diff --full-index ...other -- path/to/file | git apply -3
如果可能,您的文件现在已合并三方,或者如果没有,则保留冲突标记(在这种情况下,照常解决)。
如果您不需要完整的三向合并,git checkout -p other -- path/to/file
会更简单。这有效地将您当前版本的path/to/file
与other
中的一个版本区分开来,然后让您应用这些更改中的每一个&#34; patch&#34; la git add -p
。请注意,这与合并有很大不同。如果您对所有进行了这些更改,那么它只是git diff other HEAD -- path/to/file | git apply
,它最终与git checkout other -- path/to/file
做同样的事情,这就是您所说的不要想要,所以你必须小心地排除你 想要的那些变化。