git

upd

官方文档
牛逼教程
教程

git reflog的指针转commiter id

git rev-parse 1b3e2f8d3

vscode远端分支刷新

git remote update origin --prune

git diff 中文路径乱码

人生苦短,直接用VScode自带的终端

git diff
diff --git "a/gitbook/\346\226\260\345\221\230\345\267\245\346\212\245\345\221\212\345\275\222\346\241\243/\344\271\260\345\277\227\346\226\214/SIP\345\215\217\350\256\256\347\232\204\345\237\272\346\234\254\346\246\202\345\277\265/README.md" "b/gitbook/\346\226\260\345\221\230\345\267\245\346\212\245\345\221\212\345\275\222\346\241\243/\344\271\260\345\277\227\346\226\214/SIP\345\215\217\350\256\256\347\232\204\345\237\272\346\234\254\346\246\202\345\277\265/README.md"
index 3e34879..1ff51d6 100644
...

git config --global core.quotepath false
这里会导致git status的路径出现问题(因为windows的路径采用的不是utf8编码),我按博客设置了还是不行

git clone遇到lfs错误

https://github.com/git-lfs/git-lfs/issues/911

Use git lfs logs last to view the log.
error: external filter 'git-lfs filter-process' failed
fatal: data/processed/career_builder/embedding.npy: smudge filter lfs failed
warning: Clone succeeded, but checkout failed.

解决方案

// Skip smudge - We'll download binary files later in a faster batch
git lfs install --skip-smudge

// Do git clone here
git clone ...

// Fetch all the binary files in the new clone
git lfs pull

// Reinstate smudge
git lfs install --force

特殊的符号

HEAD当前版本
HEAD^ HEAD~ ad921970^ 父节点
d921970^2 第二父节点(对于merge操作)
HEAD~2 爷爷节点

git钩子

.git.hooks下面自带一些例子
本质上就是出发动作的时候会调用该脚本

1,钩子类型
	提交工作流钩子,
	电子邮件工作流钩子,
	其他钩子

2,提交工作流钩子
	pre-commit钩子:
	1,在键入提交信息前运行,检查即将提交的快照。
	2,如果该钩子以非零值退出,git将放弃此次提交。不过可以用git commit --no-verify来提交.
	3,这个钩子可以检查代码风格是否一致,尾随空白字符是否存在,或新方法的文档是否适当。
	

	prepare-commit-msg钩子:
	1,在启动提交信息编辑器之前,默认信息被创建之后运行。
	2,允许编辑提交者所看到的编辑信息、
	3,该钩子接收的写选项:存有当前提交信息的文件的路径,提交类型和修补提交的提交的SHA-1校验
	4,适用于那些自动产生默认信息的提交,如提交信息模板,合并提交,压缩提交和修订提交等。
	5,用来动态插入提交信息。

	
	commit-msg钩子:
	1,接收一个参数:存有当前提交信息的临时文件的路径。
	2,如果该钩子脚本以非零值退出,Git将放弃提交。
	3,用来在提交通过前验证项目状态或提交信息。

	
	post-commit钩子:
	1,在提交完成后运行,不接受任何参数。
	2,该钩子一般用来通知之类的事情。

3,电子邮件工作流钩子
4,其他客户端钩子
	pre-rebase钩子:
	1,用于变基之前,以非零值退出可以终止变基的过程。
	2,用于禁止对已经推送的提交变基。
	
	post-rewrite钩子:
	1,用于被那些会替换提交记录的命令调用。 --git commit --amend, git rebase
	2,参数:触发重写的命令名。从标准输入中接受一系列重写的提交记录。
	
	post-checkout钩子:
	1,在git checkout成功运行后被调用。
	2,用于调整工作目录,如放入大的二进制文件,自动生成文档或进行其他类似操作。

	post-merge钩子:
	1,在git merge成功运行后被调用。
	2,用于恢复Git无法跟踪的工作区数据,比如权限数据。
	3,用于验证某些在Git控制之外的文件是否存在。
	
	pre-push钩子:
	1,在git push运行期间,更新了远程引用但是尚未传送对象时被调用。
	2,参数:远程分支的名字和位置。从标准输入中读取一系列更新的引用。
	3,用于在推送开始之前,用它验证对引用的更新操作,(一个非零的退出码将终止推送过程)
	
	pre-auto-gc钩子:
	1,在垃圾回收之前被调用,用来提醒你现在要回收垃圾了,或者依情形判断是否要中断回收。


git钩子,给commit信息前加个前缀
很明显我们需要采用commit-msg钩子,它的参数${1}代表临时存放信息的文件
vim .git/hooks/commit-msg

msg=$(cat ${1})
echo mzb = ${msg} > "$1"

也可以统计有多少文件被修改啥的

考虑你工作了一半,需要切换到另外一个分支修改bug

git status 此时工作目录是脏的
git stash save/push
git stash show 可以看到被暂存
git status 此时工作目录是干净的
切到别的分支工作
切回来
git stash list
git stash apply stash@{1}

关于连接到github gitee等

首先需要本地生成邮箱的ssh密钥
教程
其中,ssh-keygen工具是包含在open-ssh工具包中的,需要apt-get
在~/.ssh/下放好公钥和密钥就行

在gitee中添加ssh公钥后
ssh -T git@gitee.com 测试一下,出现下面说明ok

Hi ZhibinMai! You've successfully authenticated, but GITEE.COM does not provide shell access.

然后
git remote 查看远端仓库
git remote rm 移除远端仓库
git remote add origin[远端名] git@gitee.com:qq3157347078/mzb_private_repositories.git
git push -u origin master 推送远端

推送远端时,如果出现:

[session-0b49e0af] Auth error: Access deined: authorize failure.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

...注意你的ssh地址是不是添加错了
git remote add origin[远端名] git@gitee.com:qq3157347078/mzb_private_repositories.git

...新手错误...

也可能会遇到系统不信任github的证书的问题:

mzb@mzb-virtual-machine:~/Project/CMakeTemplate$ git pull origin master
fatal: unable to access 'https://gitee.com/qq3157347078/mzb_private_repositories.git/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
mzb@mzb-virtual-machine:~/Project/CMakeTemplate$ git config --global http.sslverify false

安装

找教程,一路设置一路next就行了

git特殊符号

HEAD^ 前一个版本
HEAD^^ 前两个版本
HEAD~100 前一百个版本

git的雷

git log 的哈希可能会撞,概率很小
git push 在windows上新分支名称大小写不敏感,一个git的久远bug(windows本身对文件名大小写不敏感...)

如何添加忽略文件

教程
工程目录下添加
.gitignore
并编写即可

.gitignore  自身
/build      文件夹
!/build/input.txt

git登陆并和github关联

教程

首先添加你的个人信息

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

然后生成ssh key

ssh-keygen -t rsa -C "your_email@youremail.com"  

会默认在~/.ssh/id_rsa.pub中生成ssh公钥
把该公钥添加到gitee的公钥中,并测试是否能连接到gitee

ssh -T git@gitee.com

首先在托管仓库中获取地址如:git@gitee.com:qq3157347078/memory-leak.git

git commit -m "v1.0"   至少有一次commit,否则会出一些诡异的错 

git remote -v
git remote rm  origin
git remote add origin git@gitee.com:qq3157347078/memory-leak.git
git push -u origin master

git 命令

先理解git文件的三种状态

git init first_project
会生成一个 first_project文件夹,里面有一个隐藏.git版本库文件,dir /a:h可以查看


查信息的各种操作
git log --oneline 简单的查看版本信息
git reflog 查看历史命令,同时git show HEAD@{2}可以查看某次提交
git status 查看工作区状态
git diff 查看工作区和暂存区差异
git diff --cached 查看暂存区和仓库差异,
git diff HEAD 查看工作区和仓库的差异,
git ls-tree -r master --name-only 列出master下所有已经跟踪的文件


文件、仓库操作
git add 的反操作 git rm --cached test.cpp 将test.cpp撤销跟踪
git add的反向命令git checkout,撤销工作区修改,即把暂存区最新版本转移到工作区,
git reset --hard 44f994dd8fc1e10c9ed557824cae50d1586d0cb3 回退commit会丢掉文件
git reset --soft 回退commit不会丢掉文件


分支操作
git branch 新建分支,不切换分支
git checkout -b 新建分支,切换到新分支
git checkout 切换分支
git branch -d -d 删除远端分支
git branch -d/-D -D强制删除
git pull 从云端下载分支,并合并到当前分支
git fetch 下载分支但不合并
git rebase / git merge 都可以合并,合并机制不一样,有各自的风险,二者的合并效果一样,区别在于对合并的中间状态是删除还是不删除
git rev-parse master 查看master的分支hash
git checkout 052c0233bcaef35bbf6e6ebd43bfd6a648e3d93b /path/to/file 回滚某一个文件

git远端操作的一些雷

git clone只会clone master分支
git branch -a 查看所有分支
git checkout -b asan remotes/origin/personal/z00697375/asan   拉去远端分支
git diff asan remotes/origin/personal/z00697375/asan --stat   对比分支的差异

git push origin asan:personal/z00697375/asan  git push
posted @ 2021-12-30 08:18  XDU18清欢  阅读(106)  评论(0)    收藏  举报