我需要合并几个存储库(每个存储库都从TFS转换为一个)。要做到这一点,我使用git cherry-pick命令,它适用于某些提交,但不适用于其他提交:
$ git status
# On branch master
nothing to commit, working directory clean
$ git diff-tree --no-commit-id --name-only -r e2d8405
Libraries/IFileTransformer/ITransformer.cs
Libraries/IFileTransformer/IFileTransformer.csproj
Libraries/IFileTransformer/IFileTransformer.csproj.vspscc
Libraries/IFileTransformer/Properties/AssemblyInfo.cs
$ git cherry-pick e2d8405
error: could not apply e2d8405... TFS changeset 2836
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
$ git status
# On branch master
# You are currently cherry-picking.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# deleted by them: Libraries/IFileTransformer/ITransformer.cs
# deleted by them: Libraries/IFileTransformer/IFileTransformer.csproj
# deleted by them: Libraries/IFileTransformer/IFileTransformer.csproj.vspscc
# deleted by them: Libraries/IFileTransformer/Properties/AssemblyInfo.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
$
我怎么知道这里有什么问题?谁是“他们”?在我看来,e2d8405提交删除了四个文件。如果文件存在(并且它们存在)那么应用提交的问题在哪里?
$ git checkout e2d8405^
Note: checking out 'e2d8405^'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at 48b5b2f... TFS changeset 2835 renamed namespace installutils to
utils
$ md5sum IFileTransformer.csproj
9f9851dc9db3bddd1e6920631fa14e8b *IFileTransformer.csproj
$ git checkout master
Previous HEAD position was 48b5b2f... TFS changeset 2835 renamed namespace ins
tallutils to utils
Switched to branch 'master'
$ md5sum IFileTransformer.csproj
9f9851dc9db3bddd1e6920631fa14e8b *IFileTransformer.csproj
答案 0 :(得分:3)
虽然该提交会删除这些文件,但您可以在已删除的版本中进行修改。由于此处存在冲突,在修改文件的分支和删除它们的分支之间,您需要通过指示您乐于放弃更改并应用删除(git rm ...
)来解决它。完成后,git commit
创建樱桃选择的提交。
答案 1 :(得分:1)
运行git mergetool
它会告诉你为什么它看到了已删除文件的冲突,文件可能在本地被更改并在樱桃挑选的“他们”提交中被删除。它希望您决定是保留修改后的版本还是删除文件。
然后,您可以选择要对这些文件执行的操作。
答案 2 :(得分:-1)
git合并的方式是这样的:
对于要合并的每个文件,找到包含和要存在于两个要合并的分支中的最新提交。然后搜索要合并的每个分支,并查找任何后续更改,然后更改将出现在其中一个分支中。
您所拥有的是最后一个案例,其中文件在一个分支中被删除,但在最后一次合并两个分支之后,在另一个分支中已被更改。
A 1* B
/ \
2 3
| |
| 4*
5* |
| |
这里,数字是提交,*表示提交更改我们感兴趣的文件包含在提交中。因此,在提交1处,我们还没有扩展,这意味着此提交是基本提交,即两个分支中存在的最新提交。分支后,将向每个分支添加提交,但不包括相关文件。在此时合并时,文件只保留在提交1中。然后在提交4处,对分支B中的文件进行更改。如果我们此时将分支B合并到分支A中,则进行更改在提交4中的文件将合并到分支A,因为它是最新的提交,并且在基本提交(1)之后对分支A中的文件没有任何更改。但是在提交5时,文件也在分支A中被更改。现在,如果我们尝试合并(两种方式都会产生相同的结果),我们将得到一个冲突,因为文件已在两个分支中更改(在基本提交之后),并且git无法选择其中一个为'正确',因此由你决定。
检查分支中不包含删除的文件的文件历史记录,然后您可能会发现此分支中的提交,而不是删除它们的分支。