Git:如何合并无法检查的单个文件?

时间:2016-06-20 18:52:37

标签: git merge

我正在尝试从github中提取Unity项目,并且资产数据库中存在冲突。

我之前通过删除和克隆修复了这个...但我希望能够合并它。

当前状态是部分合并:我检查了冲突(全部都在二进制文件中),并且每次保留远程版本(自上次同步以来我没有改变任何内容。

但是,资产数据库(显然是数据库)在合并工具(p4mergetool)中是不可见的,因此我无法完成合并过程。

如何选择保留远程数据库?我试着运行我在网上找到的答案:

git checkout --theirs "path"

并没有发生任何事......

1 个答案:

答案 0 :(得分:0)

在Git中有两个简单的选项(不使用任何p4工具)。其中一个,可能是更好的一个,是(如PetSerAl answered in a comment):

git checkout --theirs "path"; git add "path"

第一部分git checkout --theirs,提取另一个分支版本(你正在呼叫的那个版本"远程"这里;这是各个工具用来试图告诉的几个名称之一哪个文件是哪个)进入工作树。第二部分git add将文件标记为"已解决"。

另一种方法(在某些方面不太好)方法是:

git checkout MERGE_HEAD "path"

这看起来也是!-simpler:它告诉Git提取给定路径的MERGE_HEAD版本(--theirs或"远程"版本),并作为副作用,标志文件已解决。

大多数案例中(包括你的案例),这两个案件完全相同。

它们何时不同?

当Git决定重命名文件时,会出现一种不同的情况。请考虑以下示例:

$ mkdir mergetest; cd mergetest; git init
Initialized empty Git repository in [...]/mergetest/.git/
$ echo repo for merge example > README
$ git add README; git commit -m initial
[master (root-commit) 74ad4af] initial
 1 file changed, 1 insertion(+)
 create mode 100644 README

我们现在有一个没有文件的存储库(自述文件除外)。让我们创建一个包含一些相当重要的内容的文件,即使我们修改并重命名它,Git也可以轻松检测到它:

$ cp /etc/termcap termcap; chmod 644 termcap
$ git add termcap; git commit -m 'add termcap'
[master de3d189] add termcap
 1 file changed, 4666 insertions(+)
 create mode 100644 termcap

现在让我们设置两个分支,并在每个分支中更改termcap副本,以便我们可以获得合并冲突。

$ git branch A; git checkout -b B
Switched to a new branch 'B'

在我们的B分支中,让我们稍微改变最后几行:

$ tail -3 termcap
#
# END OF TERMCAP
# ------------------------
$ ed termcap
208311
$-1s/TERMCAP/LINE/p
# END OF LINE
w
208308
q
$ git add termcap; git commit -m 'Tron MCP says END OF LINE!'
[B 9f40f2d] Tron MCP says END OF LINE!
 1 file changed, 1 insertion(+), 1 deletion(-)

现在我们将在分支A:

中以不兼容的方式更改文件
$ git checkout A
Switched to branch 'A'
$ ed termcap
208311
$-1s/TERMCAP/FILE/p
# END OF FILE
w
208308
q
$ git add termcap; git commit -m 'incompatible change'
[A 9aae164] incompatible change
 1 file changed, 1 insertion(+), 1 deletion(-)

我们几乎已经准备好合并了,但这有点无聊,所以让我们现在再做一次改变:我们将重命名termcap

$ git mv termcap stocking-cap
$ git commit -m rename
[A 713eddd] rename
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename termcap => stocking-cap (100%)

现在我们可以尝试从B合并:

$ git merge B
Auto-merging stocking-cap
CONFLICT (content): Merge conflict in stocking-cap
Automatic merge failed; fix conflicts and then commit the result.
$ git status
On branch A
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   stocking-cap

no changes added to commit (use "git add" and/or "git commit -a")

请注意,Git现在引用该文件,而不是termcap,而是stocking-cap。冲突发生在我们应用于名为termcap的文件的Tron-ish END OF LINE短语和我们应用于END OF FILE的{​​{1}}短语之间,但之后我们重命名到termcap

如果我们尝试从stocking-cap查看termcap,我们会收到错误:

MERGE_HEAD

该文件在分支$ git checkout MERGE_HEAD stocking-cap error: pathspec 'stocking-cap' did not match any file(s) known to git. (又名B)的提示中为MERGE_HEAD,而不是termcap。但是,如果我们stocking-cap它有效:

git checkout --theirs

我们去了:文件仍然被重命名,但我们得到了#34;他们的&#34;版本,在MERGE_HEAD中称为$ git checkout --theirs stocking-cap $ tail -3 stocking-cap # # END OF LINE # ------------------------ 。该文件仍然处于未合并状态,因为termcap将显示(尝试),或者如git status中所示:

git ls-files --stage

我们必须$ git ls-files --stage 100644 666e31eff490e17863f3261a0c16df0cdf8ca69f 0 README 100644 30e251d0e75b4905449a052b5f04e316b15ffd46 1 stocking-cap 100644 941c1fa9c08e7dc0c5b8fd8e033708e6a66e4166 2 stocking-cap 100644 f6282a43f57b2acf2561ccbc58b817e21ae13b07 3 stocking-cap 来解决它:

git add stocking-cap

现在我们可以提交:

$ git add stocking-cap
$ git status -s
M  stocking-cap

并查看差异:

$ git commit -m 'completed the merge'
[A c0a3dad] completed the merge

和日志:

 $ git diff A B
diff --git a/stocking-cap b/termcap
similarity index 100%
rename from stocking-cap
rename to termcap

等等。

小结

您可以使用$ git log --decorate --oneline --graph --all * c0a3dad (HEAD -> A) completed the merge |\ | * 9f40f2d (B) Tron MCP says END OF LINE! * | 713eddd rename * | 9aae164 incompatible change |/ * de3d189 (master) add termcap * 74ad4af initial 从其他提交中提取文件(此示例中为git checkout MERGE_HEAD)并允许您跳过B步骤,但要求文件名为不变。或者,您可以使用git add从其他提交中提取文件,处理重命名,会强制您git checkout --theirs结果。