如何从其他分支仅获取git中的新文件
我有如何从其他分支仅获取git中的新文件,git,version-control,Git,Version Control,我有TEST分支,然后我有master分支 我有一个名为DATA的文件夹,其中包含子文件夹和文件 现在在我的主人身上 未在测试中的新文件 在测试和主控中修改的文件 主控中的文件,但在测试中已删除 现在我只想用来自主分支的新文件更新测试分支,这样,除了新文件之外,测试分支的所有其他未托管文件都应该存在 我可以用rsync轻松做到这一点,但我只是想,如果这可以在git中实现,您应该对此有点谨慎,因为类似但不完全相同的问题有不同的答案。例如,假设提交历史如下所示: A - B - C <--
TEST
分支,然后我有master
分支
我有一个名为DATA
的文件夹,其中包含子文件夹和文件
现在在我的主人身上
我可以用
rsync
轻松做到这一点,但我只是想,如果这可以在git
中实现,您应该对此有点谨慎,因为类似但不完全相同的问题有不同的答案。例如,假设提交历史如下所示:
A - B - C <-- master
\
D - E <-- TEST
进一步假设commitB
添加文件\u B1
,但删除文件\u A2
。然后,提交C
添加文件C1
并稍微修改文件A1
这意味着如果您git checkout master
,您将获得三个文件(A1、B1和C1),其中包含修改后的file_A1
内容
现在假设提交D
修改file\u A1
并添加file\u B1
和file\u D1
。然后提交E
删除文件\u B1
,不添加任何其他内容
这意味着,如果您git checkout TEST
,您将得到三个文件(A1、A2和D1),其中包含修改后的文件A1
内容(这些文件的修改可能与提交C
中的版本不同,也可能与提交C
中的内容相同)
当您询问“测试中的文件不在主文件中的时,文件A2
是否算数?如果您git checkout TEST
,它就在那里;如果您git checkout master
,它就不存在了;但它存在于共同的起点,commitA
当你想知道“两个文件都被修改了”时:显然file_A1
两个文件都被修改了。但是,如果这两个分支中的更改都相同,那么无论签出哪个分支,file_A1
都具有相同的内容,该怎么办呢。这是“两者都修改”还是不修改
<> P>你需要做些什么来回答这样的问题是选择是否比较两个具体的修订,或者考虑更像是三路合并(如果你试图合并代码< >测试< /代码>和<代码>主< /代码>,使用它们的合并基础,修订<代码> A<代码>,作为起始点。
这会产生两个独立的差异,一个是合并基础(提交A
)与master
之间的差异,另一个是合并基础与测试之间的差异
第一个差异将显示在分支master
上,从A
到C
的更改是修改文件A1
,删除文件A2
,添加文件B1
,以及添加文件C1
git使用这种操作来确定如何进行分支合并。事实上,在两个分支的合并基础上运行git diff
,在这两个分支的顶端运行git diff有一种特殊的语法:
git diff <options> TEST...master # three dots
至于
,如果您对文件的不同内容不感兴趣,那么最明显的选择是从--名称状态
开始,它打印文件的名称和状态,以及--不重命名
,关闭重命名检测(除非您想要重命名检测,在这种情况下,请添加-M
)
文件将显示为添加、删除或修改状态(A
、D
、和M
状态)如果您签出diff选择的提交,您将得到两个树之间的变化。尽管如此,这里有更多的可能性:T
发生在用符号链接替换常规文件的情况下,反之亦然(以及子模块的更特殊情况)<如果添加--查找副本更难的和/或-C
选项,则会出现code>C
(加上数字相似性值);重命名检测时会出现R
(加上一个与C
类似的数值)。C
和R
案例不仅打印状态和文件名,还打印“原始文件名”
您可以添加--diff filter
以仅选择特定事件:--diff filter=A
,例如,将仅选择状态为A
(已添加)的文件
git diff <options> master TEST
mergebase=$(git merge-base master TEST)
git diff <options> $mergebase master
git diff <options> $mergebase TEST
git diff <options> TEST...master # three dots
git diff <options> master...TEST # again, three dots