找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5097

积分

0

好友

676

主题
发表于 1 小时前 | 查看: 3| 回复: 0

六只卡通猫咪倒挂在树枝上,场景幽默有趣

平时天天用 Git,可真到要撤 commit、要压缩提交、或者想从别的分支“抠”点改动时,很多人还是得翻笔记。

下面的命令可以直接复制使用。对于那些“危险”操作,比如 --hard--force,我会多提醒一句风险提示。

0. 先搞清三块地盘

Git工作区、暂存区、版本库工作流程图

后面所有的命令,你都可以对照着看看它动的是工作区、暂存区,还是版本库,这样就更容易理解了。

1. 分支操作

1.1 查看本地所有分支:git branch

终端执行 git branch 命令,显示本地分支列表

* 号的是当前所在的分支。截图里,当前就在 develop 分支。

1.2 查看本地 + 远程分支:git branch -a

终端执行 git branch -a 命令,显示本地和远程所有分支

这个命令能同时看到 remotes/origin/... 这类远程跟踪分支。

1.3 切换分支:git checkout

终端执行 git checkout test 命令,切换分支

这个命令用于切换到本地已存在的分支,比如切换到 test

那怎么切换到远程分支呢?可以先执行 git fetch origin 拉取远程分支信息,然后再执行下面的命令来创建并切换到对应的本地分支:

git switch -c {本地分支名} origin/master
# 或者用旧一点的写法:git checkout -b 本地分支名 origin/master

2. 常用基本操作

2.1 查看各区域状态:git status

终端执行 git status 命令,查看工作区和暂存区状态

这个命令让你一目了然地看到哪些文件被修改了,哪些已经添加到了暂存区准备提交。

2.2 比较工作区 vs 暂存区:git diff

终端执行 git diff 命令,显示文件具体变更内容

git diff 还可以结合 HEAD 指针、指定版本号或者文件名,进行更精细的比较。

2.3 临时存档:git stash / git stash pop

开发到一半,突然要切分支去修个紧急BUG,功能没做完又不想提交脏代码怎么办?这时可以先把当前的改动“藏”进 stash,安心切走,修完再回来恢复。

  1. 先用 git status 确认有未提交的变更。

执行 git status 查看当前修改

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

执行 git stash 保存修改,工作区变干净

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

执行 git stash pop 恢复之前保存的修改

2.4 查看提交历史:git log

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

终端执行 git log 命令,显示详细的提交历史

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

终端执行 git log --oneline 命令,显示简洁的提交历史

功能和上面一样,但信息显示更加紧凑、一目了然,我个人更喜欢这样用。

2.5 克隆仓库 git clone <repo-addr>

<repo-addr> 是仓库地址。你也可以在克隆时直接指定分支:

git clone -b <branch-name> <repo-addr>

终端执行 git clone 命令克隆远程仓库

3. 撤销操作

3.1 撤销 add:git reset <fileName>

这个命令把已经从工作区 add 进暂存区、但还没 commit 的文件撤出来。执行后,改动会退回到工作区。

执行 git reset 撤销特定文件的 add 操作

从上图可以看到,执行 git reset 命令之后,已经 add 的文件又从暂存区回到了工作区。

你也可以一次性撤掉暂存区里所有已 add 的文件:

git reset .

3.2 撤销 commit

撤销最近一次的 commit 有三种不同的“力度”,对应不同的效果。

1)git reset --soft HEAD^

撤销最近一次 commit,但保留暂存区(也就是 add 操作的结果还在)。

执行 git reset --soft HEAD^ 撤销 commit,修改回到暂存区

执行完命令后,已提交的修改回到了暂存区。

2)git reset --mixed HEAD^

撤销 commit,同时撤销 add,改动会留在工作区。这是 git reset 的默认模式。

执行 git reset --mixed HEAD^ 撤销 commit 和 add

3)git reset --hard HEAD^

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

执行 git reset --hard HEAD^ 彻底回退到上一个提交

执行后查看 git log,最新提交已消失

4)回退多个 commit:git reset --hard HEAD~n

例如 n=2:最近两次 commit 整条抹掉。其中的 --soft / --mixed / --hard 可以按你的需求替换。

执行 git reset --hard HEAD~2 回退两个提交

可以看到,执行完该命令后,我们提交的最新的2个 commit 完全消失了。

Windows 小提示:在 cmd 命令行里,^ 符号常被当作转义符,HEAD^ 可能导致异常,可以改用 HEAD~1

3.3 撤销已经 push 到远程的 commit

3.3.1 执行 git log --oneline 确认要撤回到哪个 commit

查看提交历史,确定目标 commit

例如,你想取消最新的 2 个 commit,让哈希值为 bd04cbb 的那条成为当前最新。

3.3.2 在本地执行回退

执行如下命令在本地回退:

git reset --soft bd04cbb

--soft 也可以根据你的需要换成 --hard--mixed,区别见上一节。

在本地执行 git reset --soft 回退到目标 commit

然后我们再使用 git log 命令查看,可看到最新的 2 个 commit 已经没了。

3.3.3 将修改同步到远程

执行 git push 命令将改动强制同步到远程分支。

执行 git push --force 强制更新远程分支

更稳妥的替代命令是 git push --force-with-lease origin <branchName>,它能在强制推送前检查远程分支是否有你未知的新提交,避免覆盖他人工作。

如果这个分支是多人共用的主干(如 mastermain),更建议使用 git revert 命令来生成一个反向提交,这样不会改变历史记录,对协作更友好。当然,熟练掌握 git resetgit rebase 是高效进行版本控制的基础。

4. 合并多个 commit

有时候我们想把当前最新的多个琐碎的 commit 压缩成一条清晰的历史记录。

4.1 找到要保留区间的前一个 commit

执行 git log --oneline,若要合并前两条 commit,就取第三条的 commit id(下图中为 bd04cbb)。

查看提交历史,确定 rebase 起点

4.2 交互式 rebase

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

执行 git rebase -i 命令

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

进入交互式 rebase 的编辑界面

进入 vim 后,默认会列出几个提交。把第一行保留为 pick,下面几行开头的 pick 改成 s(或者 squash 也行),然后保存退出(:wq!)。

接着会进入第二个编辑界面,让你把多条提交信息合并成一条,可以编辑成更清晰的信息。下图是修改前的样子:

交互式 rebase 中合并提交信息的编辑界面(修改前)

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

编辑最终的提交信息并保存

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 分支上 commitIde5ac3d4 的 commit 进行 cherry-pick

执行 git cherry-pick 复制单个提交到当前分支

从上图可以看到,其他分支上的修改被复制了过来,并且在 develop 分支上产生了一个拥有全新 commitId 的新提交。

5.2 复制多个 commit

git cherry-pick <commitId1> <commitId2> ...

假设我们在 develop 分支上,想把该分支上最新的 2 个 commit 复制到 test 分支上。

查看 develop 分支的提交历史,准备 cherry-pick

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

在 test 分支上执行 git cherry-pick 复制多个提交

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

查看 cherry-pick 后 test 分支的提交历史

复制三个及以上 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 操作指南能成为你日常开发中的实用速查手册。如果在实践中遇到其他问题,欢迎到云栈社区与更多开发者交流探讨。




上一篇:计算机高材生退学当电工:我们正在被FOBO这种新型焦虑淘汰吗?
下一篇:别再混着抄了!Linux 和 Windows 的 ping 命令差异详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-13 06:23 , Processed in 0.812992 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表