
git使用场景常见问题解决
git stash pop 到错误的分支
使用场景:你有两个分支main
和dev
,你在dev
的修改临时使用了git stash
暂存,之后切换到了main
分支,然后使用了git stash pop
,之后提示要merge
。
解决方案:首先使用git reset --hard HEAD
取消git stash pop
对暂存区的修改。这里需要注意的是,如果git stash pop
对暂存区造成了conflict
需要merge
的时候,stash
的记录是不会真正弹出来的。因此,之后直接git checkout dev
之后,使用git stash pop
即可安全恢复。
git commit 之后发现不小心加入了不该加入的文件
如果没有提交到远程仓库:
1 | git reset --soft HEAD~1 # 回退到上一个版本,保留工作区和暂存区的代码 |
之后,记得修改
.gitignore
文件。
这里详细解释一下git reset
和git rm --cached
的区别:前者只是把修改从暂存区移除,但是git仍然在跟踪对应文件;后者表示把修改从暂存区移除,并且git不再跟踪指定文件的修改。之后,在.gitignore
里面加入指定文件,之后加入git add .
的时候,也不会误加入。
如何表明 git 在跟踪?使用
git commit -m "message"
,可以看到 git 会提示哪些文件做了修改。你用git add targetfile.txt
之后,就会把对应文件从工作区加入暂存区。但是你如果使用了git rm --cached targetfile.txt
之后,即使对应文件有修改,commit
的时候也不会提示这个文件做了修改。
如果提交到了远程仓库:
1 | git revert HEAD # 撤销 |
这里介绍一下git revert <ver>
:
- 如果工作区是干净的,那么撤销操作会根据你在HEAD产生的操作,生成一个逆向操作,同时作用于工作区和暂存区,之后会要求你写一个提交信息,之后会自动提交撤销操作。
- 如果工作区有新的修改,会要求你提交你在工作区新增的修改。之后使用
revert
的时候,会根据你在<ver>
的修改,生成一个反向操作。但如果你在后续的提交过程中,和生成的反向操作产生冲突,则需要你手动解决冲突,之后使用git add confilct_file
,然后执行git revert --continue
。如果想撤销revert
操作,则可以使用git revert --abort
. - 如果需要撤销范围内操作,需要执行:
git revert --no-commit a1b2c3d^..HEAD
,最后再commit一下。提交之前,可以利用git status
查看一下状态。
git 仓库下面有其他的 git 仓库,并且其他的 git 仓库是从其他平台(如github)上 clone 下来的
TODO
希望从 git 的所有历史记录中抹除密钥的存在
因为需要重写整个历史记录,因此这是个十分麻烦且危险的操作。在执行之前,需要通知所有协作者。需要使用git-filter-repo
。在执行之前,需要备份整个仓库。
下面这些指令用于抹除敏感字符串。
1 | # 推荐使用 Python3 |
下面这些指令用于抹除某个文件:
1 | # 为你的项目创建一个裸克隆(只包含 Git 数据,没有工作区) |
或者使用filter-branch
命令:
1 | # 这个命令会遍历所有分支和标签,从索引中移除指定文件 |
- Title: git使用场景常见问题解决
- Author: spiritTrance
- Created at : 2025-08-06 11:51:09
- Updated at : 2025-08-06 15:29:24
- Link: https://spirittrance.github.io/2025/08/06/git_scene/
- License: This work is licensed under CC BY-NC-SA 4.0.