Rokcso's Blog (柯枝蕤叶)

实用 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 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 参数表示强制回退,会丢弃未提交的所有变更。其他参数:

除了向后回退,也可以向前回退(移动/前进)到指定版本,前提是需要知道向前版本的 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 查看冲突内容。手动修改冲突文件后 addcommit 即可完成分支合并。

直接使用 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]

#skill