如何执行git checkout以移除分支中新增的文件?
如何让
git checkout同步分支状态时删除新增文件? 我知道可以执行
git checkout my-branch .
来替换当前分支中所有已修改的文件,该命令对修改文件有效,但会保留当前分支中新增的、目标分支(my-branch)没有的文件。
请问是否有办法执行git checkout或其他Git命令,使其不保留这些新增文件,让工作区完全匹配目标分支的状态?
重现问题的工作流步骤
git init test cd test touch a touch b touch c git add . git commit -a -m "Initial" echo "My name is A" > a git commit -a -m "Changed name" git checkout -b my-branch echo "My name is B" > b git commit -a -m "Changed name in branch" git checkout master echo "My name is B" > b touch d git add . git commit -a -m "changed name in master and added file"
此时我希望将当前master分支的工作区切换为my-branch的状态(my-branch中没有文件d),通常执行git checkout my-branch .后,文件d依然保留,我需要能删除文件d、让工作区完全与my-branch一致的方法。
解决方案
方法1:同步文件后清理差异文件
先同步目标分支的所有文件到当前工作区,再删除当前分支有但目标分支不存在的文件:
# 同步my-branch的文件到当前工作区 git checkout my-branch -- . # 找出并删除当前分支存在但my-branch没有的文件 git diff --name-only --diff-filter=D my-branch | xargs rm -f
git diff --diff-filter=D my-branch:筛选出当前分支中存在、但my-branch中已删除的文件xargs rm -f:批量删除这些文件
方法2:直接重置到目标分支(会改变HEAD指向)
如果不需要保留当前分支的HEAD指向,git reset --hard可以一步让HEAD、工作区、暂存区完全匹配目标分支:
git reset --hard my-branch
注意:这个操作会丢弃当前分支所有未提交的修改,且无法恢复,执行前请确认工作区没有需要保留的内容。
方法3:切换分支再切回(保留HEAD指向当前分支)
如果想保持HEAD在当前分支(如master),但工作区完全匹配my-branch,可以通过两次切换分支实现:
# 切换到my-branch,此时工作区同步为my-branch的状态 git checkout my-branch # 切回master分支,但保留当前工作区的内容 git checkout master --no-guess
这样操作后,HEAD回到master,但工作区依然保持my-branch的状态,文件d会被自动移除。
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

