来自另一个分支的Checkout文件夹不会删除文件

时间:2019-08-19 12:05:29

标签: git

我正在尝试将一个分支上整个文件夹的内容移到另一个分支。所有已修改或添加的文件都正确反映在新分支中,但是删除的文件仍然显示,好像没有与之相关的更新。

当我修改其中一个文件时,在DEV分支的TSTGIT文件夹中添加一个新文件并删除其中一个现有文件,然后提交更改,从DEV分支中检出UAT分支并检出TSTGIT文件夹,我希望查看所有3处更改,但已删除的文件将被完全忽略。

git checkout UAT
git checkout DEV -- TSTGIT
git status

要提交的更改:

    new file:   TSTGIT/addedFile.txt
    modified:   TSTGIT/modifiedFile.txt

我发现的唯一方法是使用'patch'参数,在该参数中我还可以选择删除文件,但是我想自动执行此操作而无需提供其他信息

git checkout -p DEV -- TSTGIT

请问您是否有办法强制所有更改都包括在内?

非常感谢您的帮助;)

2 个答案:

答案 0 :(得分:2)

默认情况下,git checkout仅在工作目录中添加或修改文件,而不会删除它们。这称为overlay mode

  

重叠
  仅更新文件并将其添加到工作目录中,而不删除它们,类似于cp -R会更新目标目录中的内容。从索引或树状目录中检出文件时,这是检出时的默认模式。

<tree-ish>是指向tree对象(通常是提交)的引用。

As of Git 2.22,您可以将--no-overlay选项传递给git checkout,以从工作目录中删除引用树中缺少的所有文件:

  

指定--no-overlay时,将删除出现在索引和工作树中但未出现在中的文件,以使其与完全匹配。

您的命令应为:

git checkout --no-overlay DEV -- TSTGIT 

在一个有趣的旁注中,使用--patch选项能够删除文件的原因是因为它暗示了--no-overlay

来自documentation

  

请注意,此选项默认情况下使用无覆盖模式,并且当前不支持覆盖模式。

答案 1 :(得分:1)

git checkout DEV -- TSTGIT的问题在于该命令复制文件,而不应用更改。并且复制的文件当然不包括已删除的文件。

如果您要同步目录-即使其成为另一个分支的目录的精确副本,则可以在从另一个分支检出目录之前将其删除:

git checkout UAT
rm -rf TSTGIT
git checkout DEV -- TSTGIT

该方法的问题在于,它会删除分支DEV中已存在但UAT中从未存在(未删除)的文件。

如果要应用更改而不删除目录,则唯一类似于git checkout -p的方法。可能是git cherry-pick --no-commit;但是之后,您必须还原除TSTGIT以外的所有目录。