【git】提交修改、回撤、回滚、Tag 操作讲解,与reset (--soft、--mixed、--hard) 的区别

devtools/2025/2/27 8:40:37/

Git 提交修改、回撤、回滚、Tag 操作详解

git_commit_amend_m_message_2">1. git commit --amend -m "message"

作用:修改最近一次提交的信息或内容。
适用场景

  • 提交后发现 commit message 写错了
  • 提交后发现 add 了文件,想直接加进上一次提交。

示例 1:修改 commit 信息

git commit --amend -m "修正提交信息"

💡 作用:修改上一次提交的说明,不影响文件内容。

示例 2:补充漏提交的文件

echo "new content" >> file.txt
git add file.txt
git commit --amend -m "补充提交文件"

💡 作用:把 file.txt 的修改加进上一次提交,而不会创建新的 commit。

⚠️ 注意

  • 如果已经 git push 了,要用 git push --force 强制推送,否则远程仓库的历史会不一致。

git_reset_27">2. 回撤 (git reset)

命令作用影响
git reset HEAD~1回撤最近一次提交,保留改动代码还在,回到 已暂存 状态
git reset --hard [commit]彻底回退到指定 commit,丢失所有后续修改数据不可恢复,慎用!
示例 1:撤销最近一次提交
git reset HEAD~1

💡 作用:撤销最近一次 commit,但文件的改动还在 暂存区(可以 git add 重新提交)。

示例 2:强制回退到某个提交
git reset --hard abc123

💡 作用:彻底回退到 abc123 提交后,所有更改都会丢失git log 里后面的提交都不见了。

⚠️ 注意

  • 如果已经 push 到远程,建议不要 reset --hard,否则历史会不同步!
  • 若误操作,可尝试 git reflog 找回。

git_revert_51">3. 回滚 (git revert)

命令作用影响
git revert [commit]回滚某个提交,生成一个新的撤销提交不会丢失历史,适用于多人协作
git revert --abort取消 revert 操作适用于发生冲突时放弃回滚
git revert --continue解决冲突后继续回滚适用于手动解决冲突后继续回滚
示例 1:撤销某个提交
git revert abc123

💡 作用:生成一个新的提交来撤销 abc123 的修改,而不会修改历史。

示例 2:遇到冲突时,放弃回滚
git revert --abort

💡 作用:如果 git revert 过程中遇到冲突,放弃回滚,恢复到原来的状态。

示例 3:解决冲突后继续回滚
git revert --continue

💡 作用:如果 revert 过程中遇到冲突,手动修改后执行此命令继续回滚。


4. Git Tag 操作

命令作用
git tag查看所有本地 Tag
git tag -a v1.0.1 -m "原神启动"创建一个 v1.0.1 的 Tag
git push origin v1.0.1推送 v1.0.1 到远程仓库
git push origin -d v1.0.1删除远程 v1.0.1 Tag
示例 1:创建一个 Tag
git tag -a v1.0.1 -m "原神启动"

💡 作用:给当前 commit 打上 v1.0.1 标签,-a 代表是带注释的标签

示例 2:推送 Tag 到远程
git push origin v1.0.1

💡 作用:把 v1.0.1 Tag 推送到远程仓库。

  • git tag 只是指向 commit,与分支无关,如果 远端仓库多个分支,dev 和 master 都包含这个提交,它们都会显示 tag。
示例 3:删除远程 Tag
git push origin -d v1.0.1

💡 作用:删除远程仓库的 v1.0.1 标签。


总结表格

操作命令作用影响
修改提交git commit --amend -m "message"修改最近一次提交不会创建新 commit
回撤提交git reset HEAD~1撤销最近一次 commit,保留文件修改提交记录消失,文件仍可修改
强制回退git reset --hard [commit]彻底回退到某个 commit,丢弃所有更改不可恢复,慎用!
回滚提交git revert [commit]生成一个新的 commit,撤销指定提交不会影响历史,适合多人协作
取消回滚git revert --abort取消 revert 操作适用于冲突时放弃回滚
继续回滚git revert --continue解决冲突后继续回滚适用于手动解决冲突后继续回滚
查看 Taggit tag显示所有 Tag仅本地
创建 Taggit tag -a v1.0.1 -m "message"创建带注释的 Tag需要推送才会到远程
推送 Taggit push origin v1.0.1推送 v1.0.1 到远程远程仓库可见
删除远程 Taggit push origin -d v1.0.1删除远程 v1.0.1远程仓库不再可见

🔹 总结

  1. git commit --amend 用于修改最近一次提交,避免新建 commit。
  2. git reset 用于回撤提交,但可能会影响历史,慎用 --hard
  3. git revert 用于回滚提交不会影响历史,适合多人协作。
  4. git tag 用于标记特定版本,方便管理版本发布。

Git reset 三种模式 (--soft--mixed--hard) 的区别

git reset 是 Git 中常用的命令,它用于回退提交、撤销更改,并有三种主要模式:

  • --soft:仅回退 commit,保留已暂存的修改。
  • --mixed(默认):回退 commit + add,但保留文件修改。
  • --hard:回退 commit + add + 文件修改,所有改动都被丢弃。

git_reset_soft_HEAD1_140">1. git reset --soft HEAD~1

作用

  • 回退到上一个 commit
  • 保留所有代码改动,且仍然是已暂存状态
  • 适合想重新提交 commit 的情况

示例

echo "hello" > file.txt
git add file.txt
git commit -m "第一次提交"
echo "world" >> file.txt
git add file.txt
git commit -m "第二次提交"git reset --soft HEAD~1

执行效果

  • git log 撤销最近一次 commit(“第二次提交” 消失)
  • git status 仍然显示 file.txt 处于已暂存状态
  • 可以直接 git commit -m "修正提交" 重新提交

适用场景

提交错误时,希望修改 commit(但不想重新 add
想合并多个 commit(如 git commit --amend


git_reset_HEAD1_git_reset_mixed_HEAD1_168">2. git reset HEAD~1(等价于 git reset --mixed HEAD~1

作用

  • 回退 commit
  • 取消 git add,但保留代码改动
  • 适合误提交文件,但不想丢失代码的情况

示例

echo "hello" > file.txt
git add file.txt
git commit -m "第一次提交"
echo "world" >> file.txt
git add file.txt
git commit -m "第二次提交"git reset HEAD~1

执行效果

  • git log 撤销最近一次 commit(“第二次提交” 消失)
  • git status 显示 file.txt 变为未暂存(未 add
  • 代码内容仍然存在,可重新 git add 并提交

适用场景

误提交 commit,想撤销但保留文件
git add,想撤销 add 但不影响文件内容


git_reset_hard_HEAD1_196">3. git reset --hard HEAD~1

作用

  • 回退 commit
  • 取消 git add
  • 丢弃所有未提交的代码修改
  • 适合彻底回退到某个提交版本

示例

echo "hello" > file.txt
git add file.txt
git commit -m "第一次提交"
echo "world" >> file.txt
git add file.txt
git commit -m "第二次提交"git reset --hard HEAD~1

执行效果

  • git log 撤销最近一次 commit(“第二次提交” 消失)
  • git status 为空,file.txt 也恢复到上一个 commit 的状态
  • 代码改动彻底丢失,无法找回(除非 git reflog

适用场景

彻底回滚代码,不保留更改
想回到某个历史版本,丢弃之后的所有代码

⚠️ 警告git reset --hard 不可逆,谨慎使用!


git_reset__227">4. git reset 三种模式对比

模式撤销 Commit 记录撤销 git add撤销文件修改适用场景
git reset --soft HEAD~1提交信息错误,但代码不变
git reset HEAD~1误提交 commit 或 add,但代码不变
git reset --hard HEAD~1彻底回滚代码,不可恢复

git_reset_hard_abc123__235">1. git reset --hard abc123 详解

git reset --hard abc123

作用
git reset --hard abc123 的作用是 彻底回退到 abc123 这个提交,并丢弃后续的所有更改

  • 重置暂存区
  • 重置工作区
  • 重置abc123之后的所有提交

2. 举个例子

假设 git log --oneline 现在是:

f4e3d2b (HEAD -> master) 第四次提交
c3b2a1d 第三次提交
b2a1c3e 第二次提交
a1b2c3d 第一次提交

如果执行:

git reset --hard b2a1c3e

那么 git log --oneline 变成:

b2a1c3e (HEAD -> master) 第二次提交
a1b2c3d 第一次提交

第三次第四次 提交都消失了(但可以用 git reflog 找回)。


git_reset_hard__269">3. git reset --hard 的风险

  • 如果已经 git push,你这样回退后,本地历史和远程仓库就不一致了。
  • 其他人在拉取(pull)时可能会遇到冲突,甚至代码丢失。
  • 一旦 reset --hard,后续提交就不会在 git log,如果不懂 git reflog,可能很难恢复。

4. 如果误操作了怎么办?

可以使用:

git reflog

它会显示所有 HEAD 变更的历史,比如:

f4e3d2b HEAD@{0}: reset: moving to b2a1c3e
c3b2a1d HEAD@{1}: commit: 第四次提交
b2a1c3e HEAD@{2}: commit: 第三次提交

你可以用 reflog 找回 HEAD 之前的提交:

git reset --hard f4e3d2b

这样就恢复到了 f4e3d2b(原来的最新提交)。


git_reset_hard__295">5. git reset --hard 的推荐使用场景

本地代码写错了,想回到某个版本(但未 push)。
需要清理暂存区和工作区(相当于 git clean -df + git checkout .)。
调试时想快速回滚到某个版本

⚠️ 不要在多人协作时随便用 reset --hard,否则可能造成代码丢失!
🚀 如果已经 push 了,建议使用 git revert 代替 reset


总结

命令作用是否影响 commit 记录
git reset --soft abc123回退到 abc123,但保留修改✅ 记录保留
git reset --mixed abc123回退到 abc123,工作区保留但取消暂存✅ 记录保留
git reset --hard abc123彻底回退到 abc123,丢弃所有更改❌ 记录被删除(可用 reflog 找回)

🔥 一般推荐 reset --softreset --mixedreset --hard 要谨慎使用!


https://github.com/0voice


http://www.ppmy.cn/devtools/163008.html

相关文章

【Docker基础】理解 Registry 镜像仓库:分类、工作机制、命令与实操

文章目录 一、什么是 Docker RegistryDocker Registry 的主要功能:镜像的结构:Docker Registry 的组成:使用例子:Docker Hub: 二、镜像仓库分类三、镜像仓库工作机制四、常用的镜像仓库1. DockerHub2. 国内镜像源配置镜…

C++ 多态

文章目录 (一)多态的概念(二)多态的定义及实现1.多态的构成条件2.虚函数的重写/覆盖3.多态场景的一道选择题4.协变(了解)5.析构函数的重写6.override和final关键字7.重载/重写/隐藏的对比 (三&a…

线程同步辅助类的使用

一、countDownLatch(减法) public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch new CountDownLatch(6);for (int i 0; i < 6; i) {new Thread(()->{System.out.println(Thread.cu…

Docker教程(喂饭级!)

如果你有跨平台开发的需求&#xff0c;或者对每次在新机器上部署项目感到头疼&#xff0c;那么 Docker 是你的理想选择&#xff01;Docker 通过容器化技术将应用程序与其运行环境隔离&#xff0c;实现快速部署和跨平台支持&#xff0c;极大地简化了开发和部署流程。本文详细介绍…

月之暗面改进并开源了 Muon 优化算法,对行业有哪些影响?

互联网各领域资料分享专区(不定期更新): Sheet 正文 月之暗面团队改进并开源的 Muon 优化算法 在深度学习和大模型训练领域引发了广泛关注,其核心创新在于显著降低算力需求(相比 AdamW 减少 48% 的 FLOPs)并提升训练效率,同时通过开源推动技术生态的共建。 1. 显著降低大…

TCP/IP 5层协议簇:物理层

目录 1. 物理层&#xff08;physical layer&#xff09; 2. 网线/双绞线 1. 物理层&#xff08;physical layer&#xff09; 工作设备&#xff1a;网线、光纤、空气 传输的东西是比特bit 基本单位如下&#xff1a;数字信号 信号&#xff1a;【模拟信号&#xff08;放大器&a…

Linux: 已占用接口

Linux: 已占用接口 1. netstat&#xff08;适用于旧系统&#xff09;1.1 书中对该命令的介绍 2. ss&#xff08;适用于新系统&#xff0c;替代 netstat&#xff09;3. lsof&#xff08;查看详细进程信息&#xff09;4. fuser&#xff08;快速查找占用端口的进程&#xff09;5. …

Android 10.0 Settings中系统菜单去掉备份二级菜单

1.前言 在10.0的系统rom定制化开发中,在系统Settings开发过程中,会发现在settings中的系统菜单中需要去掉 备份这个菜单,接下来就需要分析下系统菜单中的备份菜单的相关功能,然后实现去掉备份菜单的功能 2.Settings中系统菜单去掉备份二级菜单的核心类 packages/apps/Se…