Git 里最容易用错的六个操作

举报
yd_284037603 发表于 2026/11/05 23:04:00 2026/11/05
【摘要】 把 Git 里最容易混淆的六组操作讲清楚:restore 与 reset 的区别、pull --rebase 的适用边界、stash 漏掉未跟踪文件、amend 改写已推送历史、gitignore 对已跟踪文件无效、误删分支如何用 reflog 找回,附可直接复制的命令。

先说在前面

Git 的难处不在命令多,而在于不少命令名字相近、行为差别很大,一旦用错就会丢掉还没提交的代码。下面六个是我见过最高频的混淆点,按「用错的后果」从轻到重排。

1. git restore 和 git reset 不是一回事

只想把工作区某个文件恢复到上一次提交的样子,用 restore;reset 动的是 HEAD 和暂存区。

git restore app.py                 # 丢弃工作区改动
git restore --staged app.py        # 只从暂存区撤出,工作区不动
git reset --soft HEAD~1            # 撤销提交,改动留在暂存区
git reset --hard HEAD~1            # 撤销提交并丢弃所有改动(不可恢复)

最容易出事的是 --hard。真手滑了也别慌,先用 git reflog 找到之前的 commit hash,再 git reset --hard <hash> 通常还能救回来——前提是别顺手清理 reflog。

2. git pull 之前先看清楚

默认的 git pull 等于 fetch + merge,会在多人同时提交时生成一堆「Merge branch ...」的噪音提交。团队里更常见的约定是:

git pull --rebase
# 或者把它设成默认
git config --global pull.rebase true

注意:已经 push 出去、别人可能基于它工作的提交,不要再用 rebase 改写历史。

3. stash 不是保险箱

git stash 默认只存已跟踪文件的改动,新建的未跟踪文件不会被收进去。想连新文件一起存,要加 -u:

git stash push -u -m "wip: 登录页改到一半"
git stash list
git stash pop        # 应用并删除;想保留用 apply

还有一点:pop 遇到冲突时 stash 不会被删除,很多人以为「已经恢复了」就不再管,结果改动一直躺在栈里。恢复后记得 git stash list 看一眼。

4. commit --amend 只改最后一次

补文件或改提交信息时用 git commit --amend 很方便,但它会生成一个新的 commit 对象。如果这个提交已经 push 过,就要 git push --force-with-lease(比 --force 安全,会检查远程有没有被别人更新过)。再往前的历史要用 git rebase -i HEAD~3。

5. 别在 .gitignore 里救已经跟踪的文件

把 .env 加进 .gitignore 之后发现它还是被提交着——因为它早就被 Git 跟踪了,忽略规则只作用于未跟踪文件。正确做法是先从索引里移除:

git rm --cached .env
git commit -m "stop tracking .env"

--cached 只删索引不改本地文件,别忘了这一步;直接 git rm .env 会把文件一起删掉。已经进过历史的密钥,光停止跟踪不够,还得考虑轮换。

6. 分支名删错了怎么找回来

git branch -D 删掉了还没合并的分支,提交对象其实还在,只是没有引用指向它。git reflog 里找到那个提交的 hash,再 git checkout -b recovered <hash> 就能重建。Git 的「删除」大多数情况下只是「解除引用」,真正清理要等 gc。

小结

把这六条记住,基本能覆盖日常八成的 Git 事故。真正的兜底其实是 git reflog——它记录了 HEAD 的每一次移动,很多看似不可逆的操作,都能从这里找回来。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。