我正在尝试从github中提取Unity项目,并且资产数据库中存在冲突。
我之前通过删除和克隆修复了这个...但我希望能够合并它。
当前状态是部分合并:我检查了冲突(全部都在二进制文件中),并且每次保留远程版本(自上次同步以来我没有改变任何内容。
但是,资产数据库(显然是数据库)在合并工具(p4mergetool)中是不可见的,因此我无法完成合并过程。
如何选择保留远程数据库?我试着运行我在网上找到的答案:
git checkout --theirs "path"
并没有发生任何事......
答案 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
结果。