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

发布于:2025-02-21 ⋅ 阅读:(21) ⋅ 点赞:(0)

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

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 强制推送,否则远程仓库的历史会不一致。

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 找回。

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 解决冲突后继续回滚 适用于手动解决冲突后继续回滚
查看 Tag git tag 显示所有 Tag 仅本地
创建 Tag git tag -a v1.0.1 -m "message" 创建带注释的 Tag 需要推送才会到远程
推送 Tag git push origin v1.0.1 推送 v1.0.1 到远程 远程仓库可见
删除远程 Tag git 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 + 文件修改,所有改动都被丢弃。

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


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 但不影响文件内容


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 不可逆,谨慎使用!


4. git reset 三种模式对比

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

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 找回)。


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(原来的最新提交)。


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


网站公告

今日签到

点亮在社区的每一天
去签到