Git 备忘录

Git是一种去中心化的版本管理软件。使用此备忘单,您可以快速访问最常见的git命令.

初始化与基本配置

设置全局用户名、邮箱和新仓库的默认分支名。

git config --global user.name "[你的名字]"
git config --global user.email "[你的邮箱]"
git config --global init.defaultBranch main

查看配置及其来源,或只读取某一项配置。

git config --list --show-origin
git config --get user.name
git config --get user.email

为常用命令设置简短别名。

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.lg "log --oneline --decorate --graph --all"

查看 Git 版本、命令帮助和当前仓库目录。

git --version
git help [命令]
git [命令] -h
git rev-parse --show-toplevel

创建与克隆仓库

在当前目录创建新仓库,或从远程地址克隆仓库。

git init
git clone [仓库地址]
git clone [仓库地址] [目录名]

克隆指定分支、仅获取最近一次提交,或连同子模块一起克隆。

git clone --branch [分支名] [仓库地址]
git clone --depth 1 [仓库地址]
git clone --recurse-submodules [仓库地址]

查看状态与差异

查看工作区和暂存区状态;简短格式适合快速检查。

git status
git status --short

查看尚未暂存、已经暂存或两个版本之间的差异。

git diff
git diff --staged
git diff [提交A] [提交B]
git diff [分支A]...[分支B]
git diff [提交A] [提交B] -- [文件路径]

仅列出发生变化的文件,或显示每个文件的增删行数。

git diff --name-status
git diff --stat

暂存与提交

暂存指定文件、当前目录的变化、仓库内全部变化,或逐块选择要暂存的内容。

git add [文件路径]
git add .
git add -A
git add -p

取消暂存,但保留工作区中的修改。

git restore --staged [文件路径]
git restore --staged .

创建提交;-a 只会自动暂存已经被 Git 跟踪的文件。

git commit -m "[提交说明]"
git commit -am "[提交说明]"

修改最近一次提交的说明,或把新暂存的内容补进最近一次提交。

git commit --amend
git commit --amend --no-edit

查看提交历史

以精简、图形化方式查看全部分支的提交历史。

git log --oneline
git log --oneline --decorate --graph --all
git log -n 10

查看指定提交、文件历史或文件逐行作者信息。

git show [提交]
git log -p -- [文件路径]
git log --follow -- [文件路径]
git blame [文件路径]

在仓库内容或提交历史中搜索文本。

git grep "[关键词]"
git log -S"[关键词]" --oneline
git log -G"[正则表达式]" --oneline

分支操作

查看本地分支、远程分支和全部分支。

git branch
git branch -r
git branch -a

切换分支、创建并切换到新分支,或回到上一个分支。

git switch [分支名]
git switch -c [新分支名]
git switch -

重命名当前分支,或删除已经合并和未合并的本地分支。

git branch -m [新分支名]
git branch -d [分支名]
git branch -D [分支名]

查看已经合并或尚未合并到当前分支的分支。

git branch --merged
git branch --no-merged

合并与拣选提交

把指定分支合并到当前分支;需要时保留一个明确的合并提交。

git merge [分支名]
git merge --no-ff [分支名]
git merge --abort

解决冲突后继续合并。

git status
git add [已解决的文件]
git commit

把其他分支中的一个提交或一段连续提交应用到当前分支。

git cherry-pick [提交]
git cherry-pick [起始提交]^..[结束提交]
git cherry-pick --continue
git cherry-pick --abort

远程仓库与同步

查看、添加、重命名或修改远程仓库。

git remote -v
git remote add origin [仓库地址]
git remote rename [旧名称] [新名称]
git remote set-url origin [新仓库地址]

获取远程更新,并清理远程已经删除的分支引用。

git fetch origin
git fetch --all --prune
git remote prune origin

拉取远程变化;使用变基可以避免额外的合并提交。

git pull
git pull --rebase
git pull --ff-only

推送当前分支、首次设置上游分支,或删除远程分支。

git push
git push -u origin [分支名]
git push origin --delete [分支名]

为已有本地分支设置远程上游分支。

git branch --set-upstream-to=origin/[分支名]

临时保存工作进度

保存当前修改;加入 -u 可以同时保存未跟踪文件。

git stash push -m "[说明]"
git stash push -u -m "[说明]"

查看临时保存列表及其详细差异。

git stash list
git stash show -p stash@{0}

恢复、应用或基于某次临时保存创建新分支。

git stash pop
git stash apply stash@{0}
git stash branch [新分支名] stash@{0}

删除指定或全部临时保存。清空操作无法直接撤销,请先确认内容。

git stash drop stash@{0}
git stash clear

撤销工作区修改

放弃指定文件或全部文件尚未暂存的修改。

git restore [文件路径]
git restore .

把某个文件恢复到指定提交中的版本。

git restore --source=[提交] -- [文件路径]

先预览将被删除的未跟踪文件,再执行清理。git clean -fd 删除的文件通常无法恢复。

git clean -nd
git clean -fd

撤销或恢复提交

撤销最近一次提交,同时保留修改。--soft 保留暂存状态,默认模式取消暂存。

git reset --soft HEAD~1
git reset HEAD~1
git reset HEAD~[数量]

新建一个反向提交来撤销指定提交,适合已经推送或多人共享的分支。

git revert [提交]
git revert [起始提交]^..[结束提交]

危险操作:以下命令会丢弃未提交修改,并改写当前分支指向。执行前请确认已经备份。

git reset --hard HEAD~1
git fetch origin
git reset --hard origin/[分支名]

通过引用日志查找之前的分支位置,并在确认后恢复。

git reflog
git reset --hard [引用日志中的提交]

变基与整理历史

把当前分支的提交移动到目标分支最新提交之后。

git rebase [目标分支]
git rebase --continue
git rebase --skip
git rebase --abort

交互式整理最近若干次提交,可调整顺序、合并、修改或删除提交。

git rebase -i HEAD~[数量]

把一个分支从旧基准迁移到新基准。

git rebase --onto [新基准] [旧基准] [分支名]

注意:变基会重写提交历史。不要随意对其他人正在使用的公共分支执行变基和强制推送。

标签管理

查看标签,创建轻量标签或带说明的标签。

git tag
git tag [标签名]
git tag -a [标签名] -m "[标签说明]"
git tag -a [标签名] [提交] -m "[标签说明]"

查看、推送或删除标签。

git show [标签名]
git push origin [标签名]
git push origin --tags
git tag -d [标签名]
git push origin --delete [标签名]

文件跟踪与忽略规则

移动、重命名或删除已经被 Git 跟踪的文件。

git mv [旧路径] [新路径]
git rm [文件路径]
git rm -r [目录路径]

停止跟踪文件但保留本地文件,常用于把文件加入 .gitignore 之后。

git rm --cached [文件路径]
git rm -r --cached [目录路径]

重新应用整个仓库的忽略规则。

git rm -r --cached .
git add .
git commit -m "更新忽略规则"

多工作区

使用工作树同时检出多个分支,无需反复切换当前目录中的分支。

git worktree list
git worktree add ../[目录名] [分支名]
git worktree add -b [新分支名] ../[目录名] [起点分支]
git worktree remove ../[目录名]
git worktree prune

子模块

添加子模块,或初始化并更新仓库内的全部子模块。

git submodule add [仓库地址] [目录路径]
git submodule update --init --recursive

获取子模块远程分支的更新,或查看每个子模块的状态。

git submodule update --remote --merge
git submodule status --recursive
git submodule foreach 'git status --short'

定位问题提交

使用二分查找逐步定位引入问题的提交。

git bisect start
git bisect bad
git bisect good [已知正常的提交]
git bisect good
git bisect bad
git bisect reset

常用协作流程

从主分支创建功能分支,提交后首次推送到远程。

git switch main
git pull --ff-only
git switch -c feature/[功能名称]
git add -A
git commit -m "完成[功能名称]"
git push -u origin feature/[功能名称]

在推送前同步主分支的最新变化。

git fetch origin
git rebase origin/main
git push