Git命令记录

把某些目录或文件加入忽略规则发现并未生效,原因是.gitignore只能忽略那些原来没有被追踪的文件,如果某

些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未

被追踪状态),然后再提交:

bash

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

git reset 命令用于回退版本,可以指定退回某一次提交的版本。

reset 命令的原理是根据 commitId 来恢复版本。

因为每次提交都会生成一个 commitId,所以说 reset 可以帮你恢复到历史的任何一个版本。

这里的版本和提交是一个意思,一个 commitId 就是一个版本

命令格式如下:

bash

git reset [--soft | --mixed | --hard] [HEAD]
  • git reset --mixed:此为默认方式,将撤回的代码,存放到工作区。同时会保留本地未提交的内容。
  • git reset --soft:回退到某个版本 。将撤回的代码,存放到暂存区。同时会保留本地未提交的内容。
  • git reset --hard:彻底回退到某个版本,丢弃将撤回的代码,本地没有commit的修改会被全部擦掉。(慎用)

常用命令

bash

# 回退所有内容到上一个版本
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

使用场景:一不小心把 node_modules 目录加入git仓库了,导致仓库很大

核弹级操作,注意备份

bash

git filter-repo --invert-paths --path node_modules

bash

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"

将不需要的文件从历史记录的所有 tree 中移除

bash

git filter-repo --invert-paths --path app/build

重新关联远程仓库

bash

git remote add origin 项目地址

强制推送您的更改以覆盖远程 Git 上的所有分支

bash

git push origin --force 'refs/heads/*'

要从标签版本中删除大文件,请强制将您的更改推送到远程 Git 上的所有标签

bash

git push origin --force 'refs/tags/*' 

通知开发人员,删除本地git仓库,重新从远程仓库clone。

在很多情况,我们由于疏忽会将一些敏感信息误传到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命令来实现。

此命令会将当前存在的文件也删除,注意备份。

cmd

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

cmd

git filter-repo --invert-paths --path PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA

上传覆盖 GitHub 的commit history

cmd

git push origin --force --all # (--all 作用于所有分支)

PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA 是你需要删除的敏感信息文件名

例如:

cmd

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

先 cd 到根目录,执行git config --global credential.helper store命令

bash

# git config --global credential.helper store

执行之后会在 .gitconfig 文件中多加红色字体项

text

[user]
	email = 1624717079@qq.com
	name = bwcx
[credential]
	helper = store

之后 cd 到项目目录,执行git pull命令,会提示输入账号密码。输完这一次以后就不再需要,并且会在根目录生成一个.git-credentials文件

bash

# git pull
# cat .git-credentials

之后pull/push代码都不再需要输入账号密码了~

如果这个时候,还是提示需要输入账号,那就要进项目的根目录,.git 目录的 config 里 找到

text

[remote "origin"]
	url = http://192.168.1.10/test/test.git

修改这里的 url

相关内容