基础操作
Git 日常操作:仓库初始化、文件追踪、提交、查看历史和差异。
仓库初始化
# 创建新仓库
git init
git init -b main # 指定默认分支名
# 克隆远程仓库
git clone <url>
git clone <url> <directory> # 指定目录名
git clone -b <branch> <url> # 克隆指定分支(单分支)
git clone --depth 1 <url> # 浅克隆(仅最新提交,节省时间/空间)工作区 → 暂存区 → 仓库
# ====== 添加到暂存区 ======
git add <file> # 添加指定文件
git add <dir>/ # 添加指定目录
git add . # 添加当前目录所有变更
git add -A # 添加所有变更(包括删除)
git add -u # 只添加已跟踪文件的变更(不含新文件)
git add -p # 交互式选择,逐块添加(hunk 级别)
# ====== 提交到仓库 ======
git commit -m "message" # 提交并写信息
git commit -a -m "message" # 跳过 add,直接提交所有已跟踪文件的修改
git commit --amend # 修改最近一次提交(追加到上一次 commit)
# ====== 从暂存区移除 ======
git rm <file> # 删除文件并暂存
git rm --cached <file> # 仅从暂存区移除,保留工作目录文件
git mv <old> <new> # 重命名并暂存
# 查看状态
git status
git status -s # 简短格式
git status -sb # 简短 + 分支信息查看历史(log)
# 基本日志
git log
git log --oneline # 一行一提交
git log --oneline -10 # 最近 10 条
# 图形化
git log --oneline --graph --decorate --all
git log --graph --pretty=format:'%C(auto)%h %C(blue)%ad %C(green)%an %C(auto)%s' --date=short
# 过滤
git log --author="name" # 按作者
git log --grep="keyword" # 按提交信息关键词
git log -- <file> # 查看某文件的历史
git log -S "code_string" # 搜索引入/删除特定代码的提交(pickaxe)
git log main..feature # feature 有而 main 没有的提交
git log --since="2024-01-01" --until="2024-01-31"
git log --after="1 week ago"
# 查看文件详情
git log -p # 显示每次提交的 patch(diff)
git log --stat # 显示每次提交修改的文件统计常用 log 别名
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.lg10 "log --oneline --graph --decorate --all -10"
git config --global alias.hist "log --pretty=format:'%h %ad %an %s' --date=short"查看差异(diff)
# 工作区 vs 暂存区(未暂存的修改)
git diff
# 暂存区 vs 仓库(已暂存但未提交的修改)
git diff --staged
git diff --cached
# 工作区 vs 仓库(所有未提交的修改)
git diff HEAD
# 两次提交之间
git diff main feature
git diff HEAD~3 HEAD
git diff <hash1> <hash2>
# 特定文件
git diff -- <file>
# 统计
git diff --stat
git diff --stat HEAD~5 HEAD
# 忽略空白
git diff -w
# 查看某次提交引入了什么变更
git show <commit_hash>
git show --stat <commit_hash>
git show HEADdiff 输出解读
diff --git a/main.go b/main.go
index abc123..def456 100644
--- a/main.go
+++ b/main.go
@@ -10,6 +10,8 @@ ← -10,6 = 从第10行开始,显示6行(旧文件)
func main() { +10,8 = 从第10行开始,显示8行(新文件)
fmt.Println("hello")
+ name := "world" ← + 表示新增行
+ fmt.Println(name)
os.Exit(0)
查看信息
# 查看提交详情
git show <hash>
git show HEAD
# 查看某行代码是谁写的(blame)
git blame <file>
git blame -L 10,20 <file> # 查看第 10-20 行
git blame -L '/func main/,/^}/' <file> # 按函数范围
# 搜索代码(在仓库历史中)
git grep "pattern"
git grep -n "pattern" # 显示行号
git grep -l "pattern" # 只显示文件名
git grep "pattern" <hash> # 在特定版本中搜索
# 统计
git shortlog -sn # 按作者统计提交数
git shortlog -sn --no-merges # 排除合并提交文件恢复
# 撤销工作区的修改(用暂存区覆盖)
git restore <file>
git checkout -- <file> # 旧语法
# 撤销暂存区(回到工作区,取消 add)
git restore --staged <file>
git reset HEAD <file> # 旧语法
# 撤销所有未暂存的修改
git restore .
# 恢复到某个提交时的状态
git restore --source=<hash> <file>
git checkout <hash> -- <file> # 旧语法.gitignore
# 注释
*.log # 所有 .log 文件
node_modules/ # 目录
dist/
.env # 特定文件
!.env.example # 排除 .env 但保留 .env.example
*.exe # 通配符
# 嵌套目录
**/temp/ # 任意层级的 temp 目录
logs/*.txt # logs/ 下的 txt 文件(不含子目录)💡 最佳实践:项目初期就建立
.gitignore。常用模板参见 github/gitignore。
忽略已跟踪的文件
# 如果文件已被跟踪,先取消跟踪
git rm --cached <file>
# 然后添加到 .gitignore
echo "<file>" >> .gitignore
git add .gitignore
git commit -m "Stop tracking <file>"全局忽略
# 创建全局 .gitignore(适用于所有仓库)
git config --global core.excludesfile ~/.gitignore_global
echo ".DS_Store" >> ~/.gitignore_global
echo "*.swp" >> ~/.gitignore_global清理
# 删除未跟踪的文件(dry-run 先预览)
git clean -n # 预览
git clean -f # 强制删除
git clean -fd # 包括未跟踪的目录
git clean -fdx # 包括 .gitignore 中忽略的文件
# 垃圾回收
git gc # 清理无用对象,压缩仓库
git gc --aggressive # 激进模式