Git学习笔记 -- 实战篇 | 来自缤纷多彩的灰

Git学习笔记 -- 实战篇 @ WHlcj | 2023-12-14T12:10:25+08:00 | 4 分钟阅读

2023.12.14更新:将该笔记分为理论和实战两篇,理论部分见Git学习笔记 – 理论篇

Git 基础

Git 本地配置

本地需要配置好git的用户名和邮箱,所有的配置文件保存在本地的.gitconfig文件下。

设置邮箱 :

1
git config --global user.email "xxx"  

设置用户名 :

1
git config --global user.name "xxxxxx"  

查看配置(包括默认分支,本地配置等) :

1
git config -l  

查看系统配置 :

1
git config --system --list 

查看当前用户配置 :

1
git config --global --list  

Mac下配置文件在User目录下,为隐藏文件,需要按下 command + shift + . 才能查看隐藏文件。

配置 SSH 密钥

SSH 可以通过公私钥的形式,将生成的公钥存放在服务器,从而实现免密访问。目前 Key 的类型有四种:dsa、rsa、ecdsa、ed25519 默认使用 rsa。由于一些安全问题,目前推荐 ed25519

1
2
ssh-keygen -t rsa
ssh-keygen -t ed25519 -C "your email"

生成的密钥默认存在 ~/.ssh/id_ed25519.pub,Mac 可以通过 cat id_ed25519.pub 指令查看,复制粘贴到远程仓库

添加密钥代理

1
ssh-add ~/.ssh/id_xxx

SSH 代理支持同时管理多组 SSH 密钥,并且在进行连接时会逐个尝试这些密钥,知道找到合适的密钥完成认证。当执行 ssh-add ~/.ssh/id_xxx 后系统会同时管理原先的密钥和新生成的密钥,而不是将其替换掉。如果只有一个密钥的话,无需添加密钥代理。

连接远程仓库

GitHub的代码参考

需要注意的是,2020年底开始,git、github、gitlab的默认分支都从master改为了main,所以新建git仓库的时候,一般情况无需通过 git branch -M main 来修改分支名

建立ssh连接

1
git remote add origin_ssh git@github.com:Yor_Repository/YourProject.git

建立http连接

1
git remote add origin_http https://github.com/Your_Repository/YourProject.git

引申:单独设置push源(eg: 从开源库 fetch, 然后 push 到个人库)

1
git remote set-url --add --push origin_ssh git@github.com:Yor_Repository/YourProject.git

查看远程仓库连接

1
git remote -v

Git 分支操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git branch:                     列出所有本地分支。  
git branch -r:                  列出所有远程分支。  
git branch xxx:                 新建一个分支,但依然停留在当前分支。  
git checkout xxx:               切换到xxx分支
git switch xxx:                 切换到xxx分支(新的方法,更节省系统资源)
git checkout -b xxx:            新建一个分支,并切换到该分支。  
git merge xxx:                  合并指定分支到当前分支。  
git branch -d xxx:              删除分支。  
git push origin --delete xxx:   删除远程分支。  
git branch -dr xxx:             删除远程分支。  

Git 指令进阶

git stash

git stash 命令允许你将当前工作目录中的更改(包括已跟踪和未跟踪的文件)暂时保存起来,使你能够回到一个干净的工作状态,并在需要时重新应用这些更改。这对于在切换分支、解决紧急 bug 修复或合并代码时非常有用。下面是 git stash 的主要用法:

暂存更改

1
2
git stash
git stash save "your message"  #暂存并添加说明 

查看暂存列表

1
git stash list

恢复暂存更改

1
2
git stash apply             #恢复修改,保留暂存
git stash pop               #恢复修改,移除暂存

应用特定暂存

1
2
git stash pop stash@{n}
git stash apply stash@{n}   #n是暂存的索引号

删除暂存

1
2
3
git stash drop              #删除最新的暂存
git stash drop stash@{n}    #删除指定暂存
git stash clear             #删除所有暂存

git merge

Fast-Forward 快进合并 简单地将当前分支指针移动到待合并分支的最新提交,不会产生新的提交节点

1
2
git merge xxx               #默认快进合并
git merge xxx --ff-only

三方合并 创建一个新的节点,将两个分支的修改内容合并在一起

1
git merge xxx --no-ff

其它重要指令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
git commit --amend:   修改最近的一次 commit 信息,修改之后 commit id 会变并且会多一个object
# 改名后,原来的object会变为悬空的,没有ref指向的object
git fsck --lost-found:查询悬空的object
git gc:               删除多余object,以及对object打包压缩
git reflog:           记录操作日志,查找丢失数据,手动将日志设置为过期
###
git reflog expire --expire=now --all #清理 Git 的引用日志(reflog)。引用日志记录了仓库中的引用(比如分支、HEAD 指针等)的变化历史,包括重置、提交、合并等操作。通过该命令,你可以立即清理所有过期的引用日志,从而减小仓库的大小并保持其整洁。
git gc --prune=now #执行 Git 的垃圾回收(garbage collection),并立即删除所有不可达对象。Git 中的垃圾回收是指清理那些已经不存在引用指向的对象,从而释放仓库所占用的磁盘空间。在使用 --prune=now 参数时,Git 会立即执行垃圾回收并删除所有不可达的对象,而不是等待到默认的触发条件满足后再执行。
###
git rebase:           合并、修改、删除 commit
git filter --branch:  指定删除所有提交中的某个文件或者全局修改邮箱地址等操作