实用 Git 基础命令手册,快速上手 Git
这篇博客只记录部分比较常用的 Git 命令和简单的原理、概念解释。
更多内容推荐阅读:廖雪峰的 Git 教程。
注意:虽然教程中有一些内容已经过时,但该教程仍是我认为初学者最好理解的 Git 教程。
创建 Git 仓库
验证 Git 版本:
git --version
配置 Git 个人信息(全局):
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
创建 Git 仓库,进入目标项目目录下执行:
git init
创建好的 Git 仓库在项目目录下会新建一个 .git
目录,用于存储 Git 的元数据和历史记录。
变更管理
在项目文件发生变化之后,先将变化的文件添加到仓库:
git add -A
使用 git add .
会添加当前目录以及子目录的文件,而 git add -A
可以添加整个工作区中的所有变更(包括删除),推荐使用 git add -A
,也可以使用 git add [file name]
添加指定文件。
然后提交到仓库:
git commit -m "Initial commit"
-m
后跟提交信息,例如 Initial commit
,用于描述本次提交的内容,最好是简短明了且有意义的。通常可以多次 add
然后一次性 commit
。
在 Git 中,每一次 commit
都可以理解为一个快照,记录的是相对于前一个版本的变更内容,而不是完整的项目快照。每一个快照都有一个唯一的 SHA-1 哈希值(commit id
),用于标识该快照。
Git 中的分区概念:
- 工作区:项目目录(
.git
目录除外) - 版本库:
.git
目录- 暂存区:被称为 stage 或 index,
add
命令就是将工作区的变更添加到暂存区; - 分支:
commit
命令就是将暂存区的变更提交到分支; - HEAD:一个指针,指向当前分支,分支指向某个版本(
commit id
)。
- 暂存区:被称为 stage 或 index,
版本管理
检查状态
查看 Git 仓库当前状态:
git status
如果有变更,也可以查看具体的变更内容:
git diff
还可以指定具体的文件,查看该文件的变更内容(git diff [file name]
),不过一般使用编辑器集成的 Git 管理工具会更直观。如果使用 Claude Code 这类工具,执行 git diff
命令后 AI 则会帮助解读变更内容。
查看仓库的 commit
记录:
git log
git log
命令会显示仓库中所有的 commit
记录,包括提交信息、作者、提交时间等信息。可以通过 --oneline
参数简化输出:
git log --oneline
版本回退
在 Git 中,HEAD
表示当前版本,HEAD^
表示上一个版本。回退到上一个版本:
git reset --hard HEAD^
也可以通过 commit id
回退到指定版本:
git reset --hard [commit id]
这里的 commit id
不用写完整,只需要输入前几位即可。
git reset
中的 --hard
参数表示强制回退,会丢弃未提交的所有变更。其他参数:
--soft
:会保留工作区和暂存区的所有变更;--mixed
(默认):会保留工作区的变更,重置暂存区到指定的提交。
除了向后回退,也可以向前回退(移动/前进)到指定版本,前提是需要知道向前版本的 commit id
:
git reflog
git reflog
可以查看所有版本的 commit id
,包括回退后的版本。
远程仓库
首先在本地创建 SSH 密钥对:
ssh-keygen -t ed25519 -C "[email protected]"
执行该命令后在用户主目录的 .ssh
文件夹下会生成 id_ed25519
(私钥)和 id_ed25519.pub
(公钥)文件。然后复制公钥的内容添加到 GitHub SSH Keys 中即可。
关联仓库
最方便的做法可能是先创建远程仓库,然后克隆到本地,就默认关联上了:
git clone [email protected]:username/repository_name.git
不过我一般是先有本地 Git 仓库,需要同步到 GitHub 时再创建远程仓库,然后关联远程仓库:
git remote add origin [email protected]:username/repository_name.git
在 Git 中,origin
是默认的远程仓库名称。完成关联后可以使用 git push
命令将本地仓库推送到远程仓库。不过第一次 push
时,需要使用 -u
参数指定远程分支:
git push -u origin main
这会将本地的 main
分支推送到远程的 main
分支,并建立跟踪关系,之后在这个分支上推送就直接 git push
或者 git push origin main
即可。
对于新分支的第一次 push
,也需要使用 -u
参数指定远程分支:
git push -u origin [new_branch_name]
检查远程仓库信息:
git remote -v
如果发现关联的远程仓库不正确,可以使用 git remote set-url
命令修改远程仓库的 URL:
git remote set-url origin [email protected]:new_username/new_repository_name.git
或者删除关联后重新添加:
git remote rm origin
git remote add origin [email protected]:new_username/new_repository_name.git
分支管理
原理 & 策略
Git 中的 commit
时间线串联成了一条分支,默认的主分支名为 main
。
创建一个新的分支,比如 dev
分支,其实就是创建了 dev
指针指向当前分支(main
)的当前提交,然后修改 HEAD
指针指向 dev
分支。之后产生新的提交,就移动 dev
指针到最新的提交,同时 HEAD
指针也跟着移动。原来的 main
分支则不移动。
要合并 dev
分支和 main
分支,其实就是将 main
指针指向 dev
分支的最新提交,然后修改 HEAD
指针指向 main
分支。
合并完成后可以选择删除 dev
分支,其实就是将 dev
指针删除。
在实际开发中,建议保持 main
分支的干净、稳定,只用来发布新版本,避免在 main
分支上直接进行开发工作。通常的做法是创建一个新分支(如 dev
)进行开发,开发完成后合并到 main
分支。
分支操作
首先查看当前分支信息:
git branch
当前指向(所在)的分支会用 *
标记。创建新的分支(以 dev
为例)并切换到新分支:
git switch -c dev
切换到新的分支之后正常做开发工作,要合并 dev
分支和 main
分支时需要先切换回 main
分支:
git switch main
然后使用 git merge
命令合并 dev
分支到当前分支(main
):
git merge dev
合并完成后可以选择删除 dev
分支:
git branch -d dev
如果新建的分支产生了内容变动,但是希望抛弃(不合并直接删除)该分支,在删除时要使用 -D
参数:
git branch -D dev
要删除远程分支使用:
git push origin --delete dev
当要合并的两个分支一样新且都有修改的时候,Git 无法执行快速合并,会尝试把不同分支的修改合并在一起,然后需要我们手动修改文件解决冲突后,再提交合并结果。
当执行 git merge
出现冲突时,可以使用 git status
查看冲突内容。手动修改冲突文件后 add
、commit
即可完成分支合并。
直接使用 git merge
合并分支默认使用快速模式(fast-forward)进行合并,不会产生新的合并提交,在分支时间线上不方便查看合并历史。所以合并分支建议优先使用 --no-ff
参数,这样会生成一个新的合并提交,方便查看合并历史,还可以添加评论:
git merge --no-ff dev -m "Merge dev into main"
当远程仓库存在多个分支,将远程仓库 clone
到本地后,默认只会克隆 main
分支,这时本地要新建一个远程仓库有的 dev
分支,需要基于远程 dev
分支创建:
git switch -c dev origin/dev
这会基于 origin/dev
所指向的提交创建并切换到本地 dev
分支,并且自动把 dev
的上游设置为 origin/dev
(跟踪远端分支)。如果没有自动跟踪远端分支,可以手动关联:
git branch --set-upstream-to=origin/dev dev
Bug 分支
假设正在 dev
进行开发,且开发未完成就要紧急处理一个 Bug,需要创建一个新的 bug
分支,dev
分支又不方便直接提交,可以先将 dev
分支储藏起来:
git switch dev
git stash
回到 main
分支创建 bug
分支并切换到新分支:
git switch main
git switch -c bug
在 bug
分支上修复 Bug,完成后提交并合并到 main
分支:
git switch main
git merge --no-ff bug -m "Fix bug"
合并完成后可以选择删除 bug
分支:
git branch -d bug
最后回到 dev
分支,恢复之前储藏的 dev
分支:
git switch dev
git stash pop
用 git stash pop
命令在恢复 dev
分支的同时还会删除这个 stash
。要查看具体有哪些 stash
可以使用 git stash list
命令。
一开始的 dev
分支是基于 main
分支创建的,刚刚 bug
分支合并到 main
分支后,bug
分支做的改动并没有合并到 dev
分支上来,相当于刚刚修复的 Bug 在 dev
分支依然存在。
可以使用 cherry-pick
将刚刚 bug
分支合并到 main
分支时合并提交的内容(变更内容)复制到 dev
分支上:
git switch dev
git cherry-pick [commit id]
需要使用刚刚 Bug 修复的提交的 commit id
来指定要复制的变更内容。
标签管理
tag
是对 commit
打标签,它是指向某个 commit
的指针,但是不能移动。tag
还可以理解为更有意义的 commit id
。
查看所有 tag
:
git tag
查看指定 tag
的详细信息:
git show [tag name]
创建 tag
:
git tag [tag name]
创建 tag
默认是给最新的 commit
打标签,也可以指定要打标签的 commit
:
git tag [tag name] [commit id]
创建 tag
时也可以添加描述信息:
git tag -a [tag name] -m "description info" [commit id]
删除 tag
:
git tag -d [tag name]
所有创建的 tag
其实都存储在本地,要推送到远程仓库,可以使用 push
命令:
git push origin [tag name]
或者一次性推送所有 tag
:
git push origin --tags
而如果 tag
已经被推送到远程仓库,要删除这个 tag
需要先在本地删除,然后再在远程仓库删除:
git tag -d [tag name]
git push origin --delete [tag name]