从其他分支检出文件夹未同步删除文件,如何自动同步所有变更?
解决Git分支间文件夹全量同步(含删除文件)的问题
我完全懂你遇到的麻烦——用git checkout DEV -- TSTGIT确实只会同步新增和修改的文件,压根不会管目标分支里存在但源分支已经删掉的文件。要实现无需交互的全量同步,这几种方法绝对靠谱:
方法一:先清除目标文件夹,再检出源分支内容
这是最直接的思路,先把UAT分支上的TSTGIT文件夹删掉,再从DEV分支拉取完整的文件夹内容:
# 确保当前在UAT分支上执行 rm -rf TSTGIT/ git checkout DEV -- TSTGIT
这样就能1:1复刻DEV分支上TSTGIT的当前状态,包括那些在DEV里已经被删除的文件,也会同步从UAT分支移除。要是担心误删,可以先备份一下:
mv TSTGIT TSTGIT_backup
方法二:用git restore替代git checkout(Git 2.23+适用)
Git 2.23版本之后引入了git restore命令,比checkout的路径操作逻辑更清晰。加上--source指定源分支,再用--staged和--worktree参数,可以同时更新暂存区和工作区,自动处理删除操作:
git restore --source=DEV --staged --worktree TSTGIT/
这条命令会强制把TSTGIT文件夹的状态完全对齐到DEV分支,不管是新增、修改还是删除的变更,都会自动同步。
为啥git checkout DEV -- TSTGIT不处理删除?
其实是Git的设计逻辑问题——针对路径的git checkout操作,只会把源分支存在的文件同步到目标分支,它的定位是“补全/更新”而非“完全覆盖”,所以不会主动删除目标分支里有但源分支没有的文件,这就是你看不到删除操作被同步的原因。
额外小技巧:给频繁操作加Git别名
要是你经常需要跨分支同步文件夹,可以把命令做成Git全局别名,用起来更方便:
git config --global alias.sync-folder '!f() { rm -rf "$2" && git checkout "$1" -- "$2"; }; f'
之后只要输入一行命令就能完成同步:
git sync-folder DEV TSTGIT
内容的提问来源于stack exchange,提问作者janick
相关产品推荐
相关产品推荐

