Skip to content
Git
基础操作

基础操作

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 HEAD

diff 输出解读

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            # 激进模式