Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git签出——我们的不会从未合并文件列表中删除文件_Git_Repository_Git Branch_Git Merge_Git Checkout - Fatal编程技术网

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