git reset和git revert详解

git resetgit revert详解

背景

程序员在编码开发提交代码的时候,经常会出现需要回退、回撤代码的情况,比如某个功能延期了,需要回退某个功能提交的代码,遇到这种情况的时候发现有不少工作很多年的程序员都不太清楚怎么处理,这也是令我有点意外的,为了更好的帮助哪些不了解怎么进行代码回退或者代码撤销的新老程序员,特意写了这篇文章,希望对大家有所帮助。遇到这种情况,我们今天的主角git resetgit revert就可以派上用场了。

git reset 详解

git reset命令的作用是将指定提交之后的内容从当前分支中移除,并将HEAD指针移动到指定提交,同时将当前分支指针移动到指定提交,并将之后的提交从历史中移除。

使用示例

# 回退到指定版本
git reset <commit-hash>

# 等同于 `git reset <commit-hash>`, `<commit-hash>`之后的提交内容都会保留到工作区
git reset --mixed <commit-hash>

# `<commit-hash>`之后的提交内容会保留到暂存区,但是工作区不会改变
git reset --soft <commit-hash>

# `<commit-hash>`之后的提交内容都不会被保留,直接被移除掉了
git reset --hard <commit-hash>

# 回退到上一个版本
git reset HEAD^

# 回退到上两个版本
git reset HEAD~2

常用选项

git reset -h

usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]
   or: git reset [-q] [<tree-ish>] [--] <paths>...
   or: git reset --patch [<tree-ish>] [--] [<paths>...]

    -q, --quiet           be quiet, only report errors
    --mixed               reset HEAD and index
    --soft                reset only HEAD
    --hard                reset HEAD, index and working tree
    --merge               reset HEAD, index and working tree
    --keep                reset HEAD but keep local changes
    --recurse-submodules[=<reset>]
                          control recursive updating of submodules
    -p, --patch           select hunks interactively
    -N, --intent-to-add   record only the fact that removed paths will be added later

git reset <commit-hash> 使用的最多的三个命令是--mixed--soft--hard

--mixed(默认值)表示重置HEAD和index,也就是说<commit-hash>之后的提交内容都会保留到工作区

--soft表示只重置HEAD指针,也就是说<commit-hash>之后的提交内容会保留到暂存区,但是工作区不会改变

--hard表示重置HEAD、index和working tree,也就是说<commit-hash>之后的提交内容都不会被保留,直接被移除掉了

所以,如果想保留<commit-hash>之后的提交内容,最好使用mixed或者--soft,慎用--hard

注意事项

  • git reset命令适合在单人分支,比如自己专属的 feature分支上使用, 多人共享的分支,需慎用,防止不小心把别人提交的代码也回退了
  • 使用 git reset命令会修改历史提交记录,所以不能直接使用 git push推送提交到远程分支,需要使用 git push -f命令,强制推送
  • 如果不慎使用了git reset --hard <commit-hash> 命令,导致<commit-hash>之后的提交内容都被移除了,可以使用git reflog命令查看最近90天的操作记录,找到需要回滚的提交记录<reset-hash>,然后再使用git reset <reset-hash>命令进行回退,注意git reflog操作记录默认只会保留90天

git revert 详解

git revert创建一个新的提交,用来撤销指定提交引入的更改,这样可以保留提交历史的完整性。

使用示例

# 撤销指定提交
git revert <commit-hash>

# 撤销多个非连续的提交 -n 代表不自动提交
git revert -n <commit-hash-1> <commit-hash-2>
git commit -m "Revert multiple commits"

# 撤销多个连续的提交
git revert -n <commit-hash-a>..<commit-hash-b>
git commit -m "Revert multiple commits"

# 使用`--abort`取消回撤
git revert --abort

使用-n选项,可以在一个提交中撤销多个提交,最后通过一次提交来保存这些撤销。

常用选项

git revert -h

usage: git revert [<options>] <commit-ish>...
   or: git revert <subcommand>

    --quit                end revert or cherry-pick sequence
    --continue            resume revert or cherry-pick sequence
    --abort               cancel revert or cherry-pick sequence
    --skip                skip current commit and continue
    --cleanup <mode>      how to strip spaces and #comments from message
    -n, --no-commit       don't automatically commit
    -e, --edit            edit the commit message
    -s, --signoff         add Signed-off-by:
    -m, --mainline <parent-number>
                          select mainline parent
    --rerere-autoupdate   update the index with reused conflict resolution if possible
    --strategy <strategy>
                          merge strategy
    -X, --strategy-option <option>
                          option for merge strategy
    -S, --gpg-sign[=<key-id>]
                          GPG sign commit

注意事项

  • 新的提交历史: git revert创建新的提交,而不会改变现有的提交历史,这对于已经共享的分支是一种安全的操作。
  • 冲突处理: 在执行 git revert时可能会遇到冲突,需要解决冲突后再次提交。

区别比较

  • 影响范围: git reset会修改提交历史,影响之后的提交;而 git revert则通过创建新的提交来撤销指定提交,保留了提交历史的完整性。
  • 共享分支: git reset应慎用于共享分支,因为它会修改提交历史;而 git revert更适合在已经共享的分支上安全使用。

本文由 mdnice 多平台发布

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廖小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值