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 |
远程仓库不再可见 |
🔹 总结
git commit --amend
用于修改最近一次提交,避免新建 commit。git reset
用于回撤提交,但可能会影响历史,慎用--hard
。git revert
用于回滚提交,不会影响历史,适合多人协作。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 --soft
或 reset --mixed
,reset --hard
要谨慎使用!