Git 工作流
WD
工作目录
Working Directory
Working Directory
→
add
git add
→
SA
暂存区
Staging Area
Staging Area
→
commit
git commit
→
C
本地仓库
Local Repo
Local Repo
→
push
git push
→
R
远程仓库
Remote
Remote
↩
git pull / git fetch / git clone
←
远程 → 本地
分支 (Branch)
C1
→
C2
→
★
HEAD → main
○ git branch创建分支
|
⇄ git merge合并分支
|
⚡ git rebase变基
常用
git init
初始化一个新的 Git 仓库,在当前目录创建 .git 子目录
git init my-project
常用
git clone <url>
克隆远程仓库到本地,包含完整的提交历史和所有分支
git clone https://github.com/user/repo.git
常用
git add <file>
将文件修改添加到暂存区,准备提交
git add index.html
git add . # 添加所有修改
git add . # 添加所有修改
常用
git commit -m "message"
将暂存区的修改提交到本地仓库,附带提交信息
git commit -m "feat: 添加登录功能"
常用
git status
查看工作目录和暂存区的状态,显示哪些文件被修改、暂存或未跟踪
git status -s # 简短格式输出
git diff
查看工作目录中尚未暂存的改动差异
git diff
git diff HEAD # 所有改动
git diff --staged # 已暂存的改动
git diff HEAD # 所有改动
git diff --staged # 已暂存的改动
git rm <file>
从版本控制中删除文件,并从工作目录中移除
git rm old-file.txt
git rm --cached file.txt # 仅从版本库移除,保留本地文件
git rm --cached file.txt # 仅从版本库移除,保留本地文件
git mv <old> <new>
移动或重命名文件,相当于 mv + git rm + git add 的组合
git mv old-name.js new-name.js
git clean -fd
删除工作目录中所有未跟踪的文件和目录
git clean -fd
git clean -n # 预览将要删除的文件
git clean -n # 预览将要删除的文件
常用
git branch
列出所有本地分支,当前分支前有 * 标记
git branch -a # 列出所有分支(含远程)
git branch -r # 仅列出远程分支
git branch -r # 仅列出远程分支
常用
git checkout -b <branch>
创建新分支并立即切换到该分支
git checkout -b feature/login
常用
git switch <branch>
切换到指定分支(Git 2.23+ 推荐使用 switch 代替 checkout 切换分支)
git switch main
git switch -c new-feature # 创建并切换
git switch -c new-feature # 创建并切换
常用
git merge <branch>
将指定分支合并到当前分支
git merge feature/login
git merge --no-ff feature/login # 禁用快进合并
git merge --no-ff feature/login # 禁用快进合并
git branch -d <branch>
删除本地分支(仅当分支已合并时才允许删除)
git branch -d feature/old
git branch -D feature/old # 强制删除
git branch -D feature/old # 强制删除
git branch -m <old> <new>
重命名分支
git branch -m old-name new-name
git merge --abort
放弃当前的合并操作,恢复到合并前的状态
git merge --abort
git rebase <branch>
变基:将当前分支的提交重新应用到目标分支上,使历史更加线性
git rebase main
git rebase --abort # 放弃变基
git rebase --abort # 放弃变基
常用
git reset HEAD <file>
将文件从暂存区移回工作目录,取消暂存
git reset HEAD app.js
git restore --staged app.js # 新语法
git restore --staged app.js # 新语法
常用
git checkout -- <file>
丢弃工作目录中文件的修改,恢复到上次提交的状态
git checkout -- config.ini
git restore config.ini # 新语法
git restore config.ini # 新语法
git reset --soft HEAD~1
撤销上次提交,保留修改在暂存区
git reset --soft HEAD~1
git reset --mixed HEAD~1
撤销上次提交,保留修改在工作目录(默认行为)
git reset HEAD~1
git reset --mixed HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
彻底撤销上次提交,丢弃所有修改(不可逆,谨慎使用)
git reset --hard HEAD~1
git revert <commit>
创建一个新提交来撤销指定提交的修改,安全可追溯
git revert abc1234
git revert HEAD # 撤销最近一次提交
git revert HEAD # 撤销最近一次提交
git restore --staged <file>
将暂存区的文件移回工作目录(Git 2.23+ 推荐)
git restore --staged package.json
git restore <file>
丢弃工作目录中文件的修改(Git 2.23+ 推荐)
git restore src/main.js
常用
git push origin <branch>
将本地分支推送到远程仓库
git push origin main
git push -u origin main # 设置上游并推送
git push -u origin main # 设置上游并推送
常用
git pull origin <branch>
从远程仓库拉取并合并(fetch + merge)
git pull origin main
git pull --rebase origin main # 拉取并变基
git pull --rebase origin main # 拉取并变基
git remote -v
查看所有远程仓库的 URL(包括 fetch 和 push 地址)
git remote -v
git remote add <name> <url>
添加新的远程仓库,通常命名为 origin
git remote add origin https://github.com/user/repo.git
git fetch origin
从远程仓库获取最新的提交和数据,但不合并到本地分支
git fetch origin
git fetch --all # 获取所有远程仓库
git fetch --all # 获取所有远程仓库
git push origin --delete <branch>
删除远程分支
git push origin --delete feature/old
git remote remove <name>
移除指定的远程仓库
git remote remove upstream
git tag
列出所有标签
git tag
git tag -l "v2.*" # 按模式过滤
git tag -l "v2.*" # 按模式过滤
git tag <tagname>
给当前 HEAD 创建一个轻量标签
git tag v1.0.0
git tag -a <tagname> -m "msg"
创建附注标签,包含标签信息、日期和作者
git tag -a v2.0.0 -m "版本 2.0 正式发布"
git push origin <tagname>
将指定标签推送到远程仓库
git push origin v1.0.0
git push origin --tags # 推送所有标签
git push origin --tags # 推送所有标签
git tag -d <tagname>
删除本地标签
git tag -d v1.0.0
git push origin --delete <tagname>
删除远程标签
git push origin --delete v1.0.0
git checkout <tagname>
切换到标签对应的提交(分离 HEAD 状态)
git checkout v2.0.0
git checkout -b release-v2 v2.0.0 # 基于标签创建分支
git checkout -b release-v2 v2.0.0 # 基于标签创建分支
常用
git stash
临时保存当前工作目录和暂存区的修改,恢复干净的工作区
git stash
git stash save "未完成的功能"
git stash save "未完成的功能"
常用
git stash pop
恢复最近一次 stash 的修改并从 stash 列表中删除
git stash pop
git stash pop stash@{1} # 恢复指定的 stash
git stash pop stash@{1} # 恢复指定的 stash
git stash list
查看所有 stash 列表
git stash list
git stash apply
恢复最近一次 stash 的修改,但保留 stash 记录
git stash apply
git stash apply stash@{2}
git stash apply stash@{2}
git stash drop
删除指定的 stash 记录
git stash drop stash@{0}
git stash clear # 清空所有 stash
git stash clear # 清空所有 stash
git stash show -p
查看 stash 中保存的具体修改内容
git stash show -p stash@{0}
常用
git log
查看完整的提交历史,按时间倒序排列
git log
git log -5 # 最近 5 条
git log -5 # 最近 5 条
常用
git log --oneline
每条提交只显示一行,简洁查看历史
git log --oneline
git log --oneline --graph # 含分支图
git log --oneline --graph # 含分支图
git log --graph --all --decorate
以 ASCII 图形显示所有分支的提交历史
git log --graph --all --decorate --oneline
git log --author="name"
查看指定作者的提交记录
git log --author="张三"
git log --author="zhang@email.com"
git log --author="zhang@email.com"
git log --since="date"
查看指定日期之后的提交
git log --since="2024-01-01"
git log --after="1 week ago"
git log --after="1 week ago"
git log -p <file>
查看指定文件的历史修改详情
git log -p src/app.js
git blame <file>
逐行显示文件的修改历史和责任人
git blame src/utils.js
git blame -L 10,20 file.js # 指定行范围
git blame -L 10,20 file.js # 指定行范围
git reflog
显示 HEAD 的变动历史,包括被撤销的操作(救命命令)
git reflog
git reflog show main
git reflog show main
git show <commit>
显示某次提交的详细信息和修改内容
git show HEAD
git show abc1234:src/app.js # 查看某次提交的某个文件
git show abc1234:src/app.js # 查看某次提交的某个文件
git cherry-pick <commit>
将指定提交的修改应用到当前分支
git cherry-pick abc1234
git cherry-pick abc1234..def5678 # 应用一系列提交
git cherry-pick abc1234..def5678 # 应用一系列提交
git rebase -i HEAD~N
交互式变基:压缩、重排、编辑最近的 N 次提交
git rebase -i HEAD~3
# pick = 保留, squash = 合并, reword = 重命名
# pick = 保留, squash = 合并, reword = 重命名
git bisect start
开始二分查找,定位引入 bug 的提交
git bisect start
git bisect bad HEAD
git bisect good v1.0.0
git bisect reset # 结束二分查找
git bisect bad HEAD
git bisect good v1.0.0
git bisect reset # 结束二分查找
git submodule add <url>
添加子模块,在一个仓库中包含另一个仓库
git submodule add https://github.com/lib/theme.git
git worktree add <path> <branch>
在另一个目录中检出分支,可同时在不同分支上工作
git worktree add ../hotfix hotfix/bug
git worktree list # 列出所有工作树
git worktree list # 列出所有工作树
git filter-branch
重写大量提交历史(如删除敏感文件、修改作者信息等,建议用 git-filter-repo 替代)
git filter-branch --tree-filter 'rm -f secret.key' HEAD
git commit --amend
修改最近一次提交的信息或内容(不要修改已推送的提交)
git commit --amend -m "修正后的提交信息"
git commit --amend --no-edit # 只追加修改不改变信息
git commit --amend --no-edit # 只追加修改不改变信息
git config --global alias.<name> <cmd>
创建 Git 命令别名,简化常用操作
git config --global alias.co checkout
git config --global alias.lg "log --oneline --graph"
git config --global alias.lg "log --oneline --graph"
git rebase --onto <newbase> <oldbase> <branch>
将分支从 oldbase 之后的提交移植到 newbase 上
git rebase --onto main feature/old feature/new
git format-patch <base>
生成补丁文件,可用于邮件发送或离线传输
git format-patch origin/main
git am *.patch # 应用补丁
git am *.patch # 应用补丁
键盘快捷键
/聚焦搜索框
Esc清空搜索
V切换详细/简单视图
1-8分类切换 (1=全部,2=基础...)
↑↓浏览命令卡片
Enter复制当前高亮命令
Ctrl/Cmd+K清空搜索并聚焦
?显示/隐藏快捷键帮助