
平时天天用 Git,可真到要撤 commit、要压缩提交、或者想从别的分支“抠”点改动时,很多人还是得翻笔记。
下面的命令可以直接复制使用。对于那些“危险”操作,比如 --hard、--force,我会多提醒一句风险提示。
0. 先搞清三块地盘

后面所有的命令,你都可以对照着看看它动的是工作区、暂存区,还是版本库,这样就更容易理解了。
1. 分支操作
1.1 查看本地所有分支:git branch

带 * 号的是当前所在的分支。截图里,当前就在 develop 分支。
1.2 查看本地 + 远程分支:git branch -a

这个命令能同时看到 remotes/origin/... 这类远程跟踪分支。
1.3 切换分支:git checkout

这个命令用于切换到本地已存在的分支,比如切换到 test。
那怎么切换到远程分支呢?可以先执行 git fetch origin 拉取远程分支信息,然后再执行下面的命令来创建并切换到对应的本地分支:
git switch -c {本地分支名} origin/master
# 或者用旧一点的写法:git checkout -b 本地分支名 origin/master
2. 常用基本操作
2.1 查看各区域状态:git status

这个命令让你一目了然地看到哪些文件被修改了,哪些已经添加到了暂存区准备提交。
2.2 比较工作区 vs 暂存区:git diff

git diff 还可以结合 HEAD 指针、指定版本号或者文件名,进行更精细的比较。
2.3 临时存档:git stash / git stash pop
开发到一半,突然要切分支去修个紧急BUG,功能没做完又不想提交脏代码怎么办?这时可以先把当前的改动“藏”进 stash,安心切走,修完再回来恢复。
- 先用
git status 确认有未提交的变更。

- 执行
git stash 保存改动。之后再查看 git status,工作区就变干净了。

- 切回原分支后,执行
git stash pop 把存起来的改动“弹”回工作区(相当于恢复修改并删除这个 stash 记录)。

2.4 查看提交历史:git log
输入 git log 命令会进入一个分页显示的界面,可以上下翻页查看提交记录,按 q 键退出。

或者使用更简洁的 git log --oneline。

功能和上面一样,但信息显示更加紧凑、一目了然,我个人更喜欢这样用。
2.5 克隆仓库 git clone <repo-addr>
<repo-addr> 是仓库地址。你也可以在克隆时直接指定分支:
git clone -b <branch-name> <repo-addr>

3. 撤销操作
3.1 撤销 add:git reset <fileName>
这个命令把已经从工作区 add 进暂存区、但还没 commit 的文件撤出来。执行后,改动会退回到工作区。

从上图可以看到,执行 git reset 命令之后,已经 add 的文件又从暂存区回到了工作区。
你也可以一次性撤掉暂存区里所有已 add 的文件:
git reset .
3.2 撤销 commit
撤销最近一次的 commit 有三种不同的“力度”,对应不同的效果。
1)git reset --soft HEAD^
撤销最近一次 commit,但保留暂存区(也就是 add 操作的结果还在)。

执行完命令后,已提交的修改回到了暂存区。
2)git reset --mixed HEAD^
撤销 commit,同时撤销 add,改动会留在工作区。这是 git reset 的默认模式。

3)git reset --hard HEAD^
(危险操作) commit、暂存区、工作区一起回到上一个提交的状态。所有未提交的修改都会丢失,使用前务必想清楚!


4)回退多个 commit:git reset --hard HEAD~n
例如 n=2:最近两次 commit 整条抹掉。其中的 --soft / --mixed / --hard 可以按你的需求替换。

可以看到,执行完该命令后,我们提交的最新的2个 commit 完全消失了。
Windows 小提示:在 cmd 命令行里,^ 符号常被当作转义符,HEAD^ 可能导致异常,可以改用 HEAD~1。
3.3 撤销已经 push 到远程的 commit
3.3.1 执行 git log --oneline 确认要撤回到哪个 commit

例如,你想取消最新的 2 个 commit,让哈希值为 bd04cbb 的那条成为当前最新。
3.3.2 在本地执行回退
执行如下命令在本地回退:
git reset --soft bd04cbb
--soft 也可以根据你的需要换成 --hard 或 --mixed,区别见上一节。

然后我们再使用 git log 命令查看,可看到最新的 2 个 commit 已经没了。
3.3.3 将修改同步到远程
执行 git push 命令将改动强制同步到远程分支。

更稳妥的替代命令是 git push --force-with-lease origin <branchName>,它能在强制推送前检查远程分支是否有你未知的新提交,避免覆盖他人工作。
如果这个分支是多人共用的主干(如 master 或 main),更建议使用 git revert 命令来生成一个反向提交,这样不会改变历史记录,对协作更友好。当然,熟练掌握 git reset 和 git rebase 是高效进行版本控制的基础。
4. 合并多个 commit
有时候我们想把当前最新的多个琐碎的 commit 压缩成一条清晰的历史记录。
4.1 找到要保留区间的前一个 commit
执行 git log --oneline,若要合并前两条 commit,就取第三条的 commit id(下图中为 bd04cbb)。

4.2 交互式 rebase
执行 git rebase -i <commitId> 命令,这里的 <commitId> 就是上一步确定的 bd04cbb。

执行完该命令会进入一个 vim 编辑界面:

进入 vim 后,默认会列出几个提交。把第一行保留为 pick,下面几行开头的 pick 改成 s(或者 squash 也行),然后保存退出(:wq!)。
接着会进入第二个编辑界面,让你把多条提交信息合并成一条,可以编辑成更清晰的信息。下图是修改前的样子:

编辑好最终的提交信息后,保存退出。

4.3 执行 git log 核对 commit 合并情况
此时我们使用 git log 命令查看,可以看到原来的 2 个 commit 已经被合并为一个新的 commit。

如果在 rebase 过程中遇到冲突,解决冲突后执行 git add .,然后 git rebase --continue 继续。如果想放弃整个 rebase 操作,可以执行 git rebase --abort。
5. 把已有 commit 复制到别的分支:cherry-pick
一个开发分支上所做的修改,有时也适用于其他不同的分支,比如不同的发布版本或客户分支。这时用 cherry-pick 命令就极为方便了。
假设现在 test 分支上有一个 commit,我们想把它复制到 develop 分支上。
5.1 复制单个 commit
git cherry-pick <commitId>
我们切换到 develop 分支,然后对 test 分支上 commitId 为 e5ac3d4 的 commit 进行 cherry-pick。

从上图可以看到,其他分支上的修改被复制了过来,并且在 develop 分支上产生了一个拥有全新 commitId 的新提交。
5.2 复制多个 commit
git cherry-pick <commitId1> <commitId2> ...
假设我们在 develop 分支上,想把该分支上最新的 2 个 commit 复制到 test 分支上。

先切换到 test 分支,然后执行命令 git cherry-pick a313ca3 9b2284e。

此时,我们再来看下 test 分支的提交日志,可以看到多个 commit 已经被复制过来:

复制三个及以上 commit 也是同理,按顺序写下它们的 id 即可。操作过程中如果遇到冲突,按提示解决后继续。
6. Git 认证:多账号、多平台时 push 失败
当我们同时处理多个项目,且这些项目使用了不同的 Git 平台托管,或者对应多个不同的账号时,可能会遇到 push 代码失败的情况。这是因为 Git 客户端可能缓存了旧的认证凭证。
可以执行如下命令清除系统级的凭证缓存:
git config --system --unset credential.helper
这样每次 pull / push / fetch 时都会重新询问账号密码。
如果觉得每次都输入太麻烦,在重新输入正确的账号密码并成功一次之后,可以再执行:
git config --global credential.helper store
这个命令会让 Git 以明文形式将凭证保存在用户目录下的文件中。请注意,这种方式在安全性上不如系统钥匙串或 manager-core 等工具,但操作简单,适合个人开发机上的临时方案。当需要切换项目或账号时,可以再执行第一条 unset 命令,重新走一遍认证流程。
小结
为了方便查阅,这里将文中提到的主要命令整理成表格:
| 场景 |
命令 |
| 看分支 |
git branch / git branch -a |
| 看改了什么 |
git status / git diff |
| 改一半切分支 |
git stash → … → git stash pop |
| 撤 add |
git reset <file> 或 git reset . |
| 撤 commit |
git reset --soft\|mixed\|hard HEAD~1 |
| 已 push 要回滚 |
git reset 到目标 + git push --force-with-lease |
| 合并多个 commit |
git rebase -i <父提交> |
| 复制别人的提交 |
git cherry-pick <id> … |
| 凭证乱了 |
unset helper → 重登 → 再 git config credential.helper store |
希望这份涵盖分支、stash、撤销与 cherry-pick 的 Git 操作指南能成为你日常开发中的实用速查手册。如果在实践中遇到其他问题,欢迎到云栈社区与更多开发者交流探讨。