git签出——我们的不会从未合并文件列表中删除文件
嗨,我需要像这样合并两个分支 这只是正在发生的一个例子,我处理了数百个需要解析的文件git签出——我们的不会从未合并文件列表中删除文件,git,repository,git-branch,git-merge,git-checkout,Git,Repository,Git Branch,Git Merge,Git Checkout,嗨,我需要像这样合并两个分支 这只是正在发生的一个例子,我处理了数百个需要解析的文件 git merge branch1 ...conflicts... git status .... # Unmerged paths: # (use "git add/rm <file>..." as appropriate to mark resolution) # # both added: file1 # both added: file2 # both added:
git merge branch1
...conflicts...
git status
....
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both added: file1
# both added: file2
# both added: file3
# both added: file4
git checkout --ours file1
git chechout --theirs file2
git checkout --ours file3
git chechout --theirs file4
git commit -a -m "this should work"
U file1
fatal: 'commit' is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>' as
appropriate to mark resolution and make a commit, or use 'git commit -a'.
git合并分支1
…冲突。。。
git状态
....
#未合并路径:
#(酌情使用“git add/rm…”标记分辨率)
#
#都添加了:file1
#都添加了:file2
#都添加了:file3
#都添加了:file4
git签出——我们的文件1
git chechout--他们的文件2
git签出——我们的文件3
git chechout--他们的文件4
git commit-a-m“这应该行得通”
U文件1
致命:“提交”不可能,因为您有未合并的文件。
请在工作树中修复它们,然后使用'git add/rm'作为
适用于标记解析并进行提交,或使用“git commit-a”。
当我使用git merge tool时,只有“ours”分支中的内容是正确的,当我保存它时,文件从未合并列表中消失。但由于我有数百个这样的文件,这不是一个选项
我认为这种方法将使我达到我想要的目的——很容易说出我想要保留哪个分支的哪个文件
但我想我误解了git签出的概念——合并后我们/他们的命令
你能提供我一些信息,如何处理这种情况吗?我使用的是
git1.7.1
这主要是关于git checkout
如何在内部工作的一个怪癖。Git人员倾向于让实现来决定接口
最终结果是,在使用--ours
或--theres
进行git签出后,如果要解决冲突,还必须git添加相同的路径:
git checkout --ours -- path/to/file
git add path/to/file
但其他形式的git签出则并非如此:
git checkout HEAD -- path/to/file
或:
(它们在许多方面都有细微的不同)。在某些情况下,这意味着最快的方法是使用中间命令。(顺便说一句,这里的--
是为了确保Git能够区分路径名和选项或分支名。例如,如果您有一个名为--theres
的文件,它看起来像一个选项,但--
会告诉Git不,它实际上是一个路径名。)
要了解这一切在内部是如何工作的,以及为什么您需要单独的git add
,除非您不需要,请继续阅读。:-)首先,让我们快速回顾一下合并过程
合并,第1部分:合并如何开始
运行时:
$git合并提交或分支
Git要做的第一件事是在命名提交和当前(HEAD
)提交之间找到合并基。(请注意,如果您在此处提供分支名称,如在git merge otherbranch
中所述,git会将其转换为提交ID,即分支的尖端。它会为最终的合并日志消息保存分支名称参数,但需要提交ID来查找合并基。)
找到合适的合并基后,1git然后生成两个Git diff
列表:一个从合并基到HEAD
,另一个从合并基到您标识的提交。这将得到“你改变了什么”和“他们改变了什么”,Git现在必须将这两者结合起来
对于您进行了更改但未进行更改的文件,Git可以直接获取您的版本
对于他们进行了更改而您没有进行更改的文件,Git可以直接获取其版本
对于您都进行了更改的文件,Git必须进行一些真正的合并工作。它逐行比较这些变化,看看是否可以将它们结合起来。如果它能将它们结合起来,它就会这样做。如果合并看起来是基于对冲突的逐行比较,那么Git会为该文件声明一个“合并冲突”(并继续尝试合并,但保留冲突标记)
一旦Git合并了它能合并的所有内容,它要么因为没有冲突而完成合并,要么因为合并冲突而停止
1如果绘制提交图,则合并基础很明显。不画图表,就有点神秘了。这就是为什么我总是告诉人们绘制图表,或者至少,根据需要绘制尽可能多的图表
技术定义是,合并基是提交图中的“最低共同祖先”(LCA)节点。用不太专业的术语来说,这是最近的一次提交,当前分支与正在合并的分支合并。也就是说,通过记录每个合并的父提交ID,Git能够找到上一次两个分支在一起的时间,从而了解您做了什么,以及它们做了什么。不过,为了让这一切正常工作,Git必须记录每次合并。具体来说,它必须将两个(或全部,对于所谓的“八达通”合并)父ID写入新的合并提交
在某些情况下,有多个合适的合并基。然后,该过程取决于您的合并策略。默认的递归策略将合并多个合并基以生成“虚拟合并基”。这是非常罕见的,你现在可以忽略它
合并,第2部分:冲突停止和Git的“索引”
当Git以这种方式停止时,它需要给您一个解决冲突的机会。但这也意味着它需要记录冲突,这就是Git的“索引”——也称为“暂存区”,有时还称为“缓存”——真正存在的地方
对于工作树中的每个暂存文件,索引最多有四个条目,而不是只有一个条目。其中最多有三个实际使用,但有四个插槽,编号为0
到3
插槽0用于已解析的文件。当您使用Git而不进行合并时,只使用插槽0。当您在工作树中编辑一个文件时,它有“未老化的更改”,然后您git add
该文件并将更改写入存储库,更新slot zero;您的更改现在已“暂存”
插槽1-3用于un
git checkout MERGE_HEAD -- path/to/file
$ git log
... peruse log output ...
$ git checkout f17c393 # let's see what's in this commit