
如何让 Git 停止跟踪已加入 .gitignore 的文件
文件被跟踪后加入 .gitignore 不生效,需先移出索引:git rm --cached <文件>(目录加 -r),提交后 gitignore 规则才接管。本地文件不受影响,只是 Git 不再跟踪其变化。
聚焦概念、架构、排障、价格与选型,一篇解决一个明确问题。

文件被跟踪后加入 .gitignore 不生效,需先移出索引:git rm --cached <文件>(目录加 -r),提交后 gitignore 规则才接管。本地文件不受影响,只是 Git 不再跟踪其变化。

把多个提交压成一个合入目标分支:切到目标分支执行 git merge --squash <源分支>,再 git commit 写一条总括信息即可。GitHub 的 Squash and merge 按钮同理。源分支后续应删除避免重复冲突。

合并单个提交用 cherry-pick:git cherry-pick <提交哈希>,把该提交的改动以新提交应用到当前分支。多个连续提交用 A^..B 范围,加 -n 只应用不提交。

合并两个仓库并保留历史:把源仓库加为远程,git fetch 后用 git merge --allow-unrelated-histories 合并其分支。想把源仓库放进子目录,用 git subtree add 或先 filter-repo 重写路径再合并。

修改历史提交用交互式 rebase:git rebase -i <目标提交>^,把该行改为 edit;暂停后修改文件并 git commit --amend,然后 git rebase --continue。该提交之后的所有提交哈希都会变。

把误提交到 main 的最近提交移到新分支:git branch 新分支名(在当前提交建分支),git reset --hard HEAD~N(原分支退回 N 步),git checkout 新分支名。提交零损失完成转移。

强推的正确姿势是 git push --force-with-lease:推送前校验远程分支没有别人新推的提交,比 --force 安全。强推用于 rebase/amend 后更新个人分支;共享分支禁用。步骤:fetch 确认 → --force-with-lease → 通知协作者。

清理失效的远程跟踪引用:git fetch --prune(或 git remote prune origin)删除远程已不存在的 origin/ 引用;本地残留的对应分支用 git branch -vv 找 ": gone]" 标记后批量删除。

同步主分支最新代码到功能分支:git fetch origin 后 git rebase origin/main(在功能分支上执行),冲突逐个解决后 git rebase --continue。已推送过的分支 rebase 后需 --force-with-lease 强推。

删除被跟踪的目录:git rm -r <目录> 并提交;保留本地文件只停止跟踪用 git rm -r --cached <目录>。从历史中彻底抹除(大文件瘦身)用 git filter-repo --path <目录> --invert-paths。

清除已提交的 .DS_Store:find . -name .DS_Store 配合 git rm --cached 移出索引并提交;然后加入 .gitignore,最好配置全局忽略 git config --global core.excludesFile 防止再次混入。

把文件移出最近一次提交:git restore --staged <文件> 撤出暂存后用 git commit --amend 重建提交;或 git reset --soft HEAD^ 后重新提交时排除该文件。已推送的提交需强推。