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 --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 指令查看,复制粘贴到远程仓库
添加密钥代理
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
|
查看远程仓库连接
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
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
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: 指定删除所有提交中的某个文件或者全局修改邮箱地址等操作
|