如何从其他分支仅获取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
    
    进一步假设commit
    B
    添加
    文件\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
    ,它就不存在了;但它存在于共同的起点,commit
    A

    当你想知道“两个文件都被修改了”时:显然
    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