git checkout branch - file vs git merge

时间:2016-12-14 05:36:30

标签: git git-merge git-checkout

我担心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 * &apos;unsafe-inline&apos;;
        script-src * &apos;unsafe-inline&apos; &apos;unsafe-eval&apos;">

我感到困惑的是,是不是这会覆盖我的分支上同名的文件?

如何从baz合并bar.js而不是检出文件并覆盖foo分支上的工作?或者我错了,合并确实发生了吗?

1 个答案:

答案 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

如果可能,您的文件现在已合并三方,或者如果没有,则保留冲突标记(在这种情况下,照常解决)。

如果您不需要完整的3向合并

如果您不需要完整的三向合并,git checkout -p other -- path/to/file会更简单。这有效地将您当前版本的path/to/fileother中的一个版本区分开来,然后让您应用这些更改中的每一个&#34; patch&#34; la git add -p。请注意,这与合并有很大不同。如果您对所有进行了这些更改,那么它只是git diff other HEAD -- path/to/file | git apply,它最终与git checkout other -- path/to/file做同样的事情,这就是您所说的不要想要,所以你必须小心地排除你 想要的那些变化。