Git命令记录
1 .gitignore 规则不生效的解决办法
把某些目录或文件加入忽略规则发现并未生效,原因是.gitignore
只能忽略那些原来没有被追踪的文件,如果某
些文件已经被纳入了版本管理中,则修改.gitignore
是无效的。那么解决方法就是先把本地缓存删除(改变成未
被追踪状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
2 回退到之前的的版本
git reset 命令用于回退版本
,可以指定退回某一次提交的版本。
reset 命令的原理是根据 commitId 来恢复版本。
因为每次提交都会生成一个 commitId,所以说 reset 可以帮你恢复到历史的任何一个版本。
这里的版本和提交是一个意思,一个 commitId 就是一个版本
命令格式如下:
git reset [--soft | --mixed | --hard] [HEAD]
git reset --mixed
:此为默认方式,将撤回的代码,存放到工作区。同时会保留本地未提交的内容。git reset --soft
:回退到某个版本 。将撤回的代码,存放到暂存区。同时会保留本地未提交的内容。git reset --hard
:彻底回退到某个版本,丢弃将撤回的代码,本地没有commit的修改会被全部擦掉。(慎用
)
常用命令
# 回退所有内容到上一个版本
git reset HEAD^
# 回退test.txt这个文件的版本到上一个版本
git reset HEAD^ test.txt
# 向前回退到第3个版本
git reset HEAD~3
# 回退到某个版本e73d944c
git reset e73d944c
注意:对于已经 push 的 commit,也可以使用reset命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送
git push -f
来覆盖被 reset 的 commit。
这里非常需要注意,因为 git push -f
是一个非常危险的命令。
如果在git push -f
之前有其他同事 push 新代码。那么同事提交代码会丢失。
所以这里一定要注意 git push -f 之前要先 git pull 拉下是否有新提交代码。
git push --force
等同于git push -f
3 修改提交历史,清理误提交文件
使用场景:一不小心把 node_modules 目录加入git仓库了,导致仓库很大
核弹级操作,注意备份
3.1 已知大文件
git filter-repo --invert-paths --path node_modules
3.2 未知大文件
3.2.1 识别出最大的文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
3.2.2 清理
将不需要的文件从历史记录的所有 tree 中移除
git filter-repo --invert-paths --path app/build
重新关联远程仓库
git remote add origin 项目地址
3.3 推送
强制推送您的更改以覆盖远程 Git 上的所有分支
git push origin --force 'refs/heads/*'
要从标签版本中删除大文件,请强制将您的更改推送到远程 Git 上的所有标签
git push origin --force 'refs/tags/*'
3.4 重新拉取远程仓库
通知开发人员,删除本地git仓库,重新从远程仓库clone。
4 清除敏感信息
在很多情况,我们由于疏忽会将一些敏感信息误传到Github上面去。 尽管我们可以使用git rm
将包含敏感信息文件删除掉,然后重新提交上传,文件就不会在 GitHub 中的文件列表显示。 但是这并不能完全将敏感信息文件从 GitHub 中完全删除,commit history
仍然会有敏感信息的文件的残留,我们仍然可以从 GitHub 中的commit history
中访问到文件。
如果想要将敏感信息文件完全删除。不仅需要将文件从 GitHub 中的文件列表中删除,同时还需要将文件从 GitHub 的commit history
中的 文件相关信息删除。
删除commit history
文件相关信息,主要有两种方法:
- filter-branch
- BFG
本文只探讨filter-branch的使用
使用 git 自带的git filter-branch
命令来实现。
此命令会将当前存在的文件也删除,注意备份。
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' --prune-empty --tag-name-filter cat -- --all
git filter-branch 已不再推荐使用,推荐使用 git filter-repo
git filter-repo --invert-paths --path PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
上传覆盖 GitHub 的commit history
git push origin --force --all # (--all 作用于所有分支)
PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA 是你需要删除的敏感信息文件名
例如:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch test/zhangsan.txt' --prune-empty --tag-name-filter cat -- --all
--
git filter-repo --invert-paths --path test/zhangsan.txt
以上命令就会删除test/zhangsan.txt
5 每次git pull/push时都提示输入账号密码
先 cd 到根目录,执行git config --global credential.helper store
命令
# git config --global credential.helper store
执行之后会在 .gitconfig 文件中多加红色字体项
[user]
email = 1624717079@qq.com
name = bwcx
[credential]
helper = store
之后 cd 到项目目录,执行git pull
命令,会提示输入账号密码。输完这一次以后就不再需要,并且会在根目录生成一个.git-credentials
文件
# git pull
# cat .git-credentials
之后pull/push
代码都不再需要输入账号密码了~
如果这个时候,还是提示需要输入账号,那就要进项目的根目录,.git 目录的 config 里 找到
[remote "origin"]
url = http://192.168.1.10/test/test.git
修改这里的 url