我正在尝试将一个分支上整个文件夹的内容移到另一个分支。所有已修改或添加的文件都正确反映在新分支中,但是删除的文件仍然显示,好像没有与之相关的更新。
当我修改其中一个文件时,在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
请问您是否有办法强制所有更改都包括在内?
非常感谢您的帮助;)
答案 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
。
请注意,此选项默认情况下使用无覆盖模式,并且当前不支持覆盖模式。
答案 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
以外的所有目录。