git撤销commit 并保存之前的修改

本文介绍了如何使用Git的撤销命令来撤销最近的提交,并保留或丢弃所做的更改。通过不同的参数选项,如--soft、--mixed和--hard,详细解释了它们各自的特点及应用场景。

撤销并保留修改

参数 –soft

# 先进行commit ,之后后悔啦
$ git commit -am "对首篇报告研究员字段改为author_name"

执行git log

$ git log

commit 3d6788f577faba5e1d408e372031c81beee79749
Author: yous <yous.com>
Date:   Thu Dec 14 10:08:36 2017 +0800

    添加

commit 5029f0cc08cffb77f7358de7d5534e8f8eacb82e
Author: yous <yous.com>
Date:   Thu Dec 14 09:52:39 2017 +0800

    Revert "Revert "修改过程""

    This reverts commit c81f785a06804f5f40b41dedd038efbe6d83f8a8.

commit c81f785a06804f5f40b41dedd038efbe6d83f8a8
Author: yous <yous.com>
Date:   Thu Dec 14 09:52:22 2017 +0800

    Revert "修改"

    This reverts commit 5a1d18a032d8c9269613ff14593847f82043e627.

commit 5a1d18a032d8c9269613ff14593847f82043e627

可以看出,第一个是我刚刚commit的,假设我要撤销,回到“修改过程” 这个版本。

执行命令git reset --soft <commit>

$ git reset --soft 5029f0cc08cffb77f7358de7d5534e8f8eacb82e

之后我们查看下,状态:

$ git status
On branch yutao
Your branch is up-to-date with 'origin/yutao'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   dataservice/app/ggservice/v1/event/service/InfoEventService.java

可以看出已经回撤啦,并且保留了修改。

参数 –mixed

$ git reset --mixed 5029f0cc08cff
Unstaged changes after reset:
M       dataservice/app/ggservice/v1/event/service/InfoEventService.java

yutao@yutao MINGW64 /d/sts/workspace/ggservice (yutao)
$ git status
On branch yutao
Your branch is up-to-date with 'origin/yutao'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   dataservice/app/ggservice/v1/event/service/InfoEventService.java

no changes added to commit (use "git add" and/or "git commit -a")

这种方式也是可以的。 
参数--soft--mixed区别:

参数区别
--soft会将改动放在缓存区
--mixed不把改动放在缓存区

git reset –hard <commit_id>

这种方式,我个人是不推荐,它也是撤销,但是不会保留修改。 
除非你确实是不想要刚刚commit的内容,否则,这个操作会让你之前干的活,白干。 
所以非常不推荐这个方式。

<think>我们正在讨论Git中如何撤销某个特定commit中的更改。根据用户的问题,他想要撤销特定提交中的修改,而不一定是整个提交历史。根据引用[1]和[2],我们可以使用`gitrevert`命令来撤销指定commit的更改。这个命令会创建一个新的提交,该提交的内容是撤销指定commit的更改。这样做的好处是不会改变提交历史,因为它是添加一个新的提交来抵消之前的更改。引用[3]和[4]提到了`gitreset`命令,但这个命令会改变提交历史,通常用于本地分支,如果已经推送到远程仓库,使用`gitreset`可能会引起问题。而`gitrevert`是更安全的撤销方式,因为它不会改变历史,只是添加一个新的撤销提交。用户的问题中没有说明是否已经推送,但为了安全起见,我们推荐使用`gitrevert`。具体步骤:1.使用`gitlog`找到想要撤销commit的哈希值(commithash)。2.执行`gitrevert<commit_hash>`,这会创建一个新的提交,该提交将撤销指定commit的更改。3.如果撤销过程中没有冲突,Git会自动提交。如果有冲突,需要手动解决冲突,然后使用`gitadd`和`gitcommit`来提交。另外,引用[5]提到,如果要撤销多个连续的提交,可以使用`gitrevert<newest-commit-hash>..<oldest-commit-hash>`,注意范围是左闭右开区间,即不包括oldest-commit-hash(但会撤销从oldest-commit-hash之后一直到newest-commit-hash的所有提交)。实际上,这个范围是撤销从oldest-commit-hash(不包括)到newest-commit-hash(包括)之间的所有提交。所以如果要撤销连续的多个提交,需要按顺序从旧到新列出,但实际上Git会按提交的顺序反向进行revert(即从最新的提交开始逐个撤销)。但是用户只要求撤销一个特定的commit,所以我们只需要使用单个commit的revert。注意:`gitrevert`撤销的是指定commit所引入的更改。也就是说,它会将该commit所做的修改反向应用(即如果是添加了一行,那么revert就会删除那一行;如果是删除了一行,revert就会添加那一行)。如果用户想要完全丢弃那个commit的更改,且不保留任何记录(即从历史中删除),那么可以使用`gitreset`(但注意,这会导致历史改变,如果已经推送到远程,则需要强制推送,这可能会影响其他人)。不过根据问题描述,用户只是要撤销更改,所以使用`gitrevert`是更合适的。因此,回答如下:###如何撤销某个特定commit中的更改?要安全地撤销某个特定提交(commit)中的更改,推荐使用`gitrevert`命令。该命令会创建一个新的提交来撤销指定提交的更改,而不会修改已有的提交历史。具体步骤如下:1.**查找提交哈希值**:首先,使用`gitlog`命令查看提交历史,找到你想要撤销的那个提交的哈希值(commithash)。例如:```bashgitlog```在输出中找到类似`commit7461f745cfd58496554bd672d52efa8b1ccf0b42`的行,其中`7461f745cfd58496554bd672d52efa8b1ccf0b42`就是该提交的哈希值。2.**执行撤销操作**:使用`gitrevert`命令,后跟该提交的哈希值。例如:```bashgitrevert7461f745cfd58496554bd672d52efa8b1ccf0b42```执行此命令后,Git会尝试自动创建一个新的提交来撤销该提交的更改。如果过程中没有冲突,Git会自动打开默认的编辑器让你输入新提交的说明(或者你可以使用`--no-edit`选项跳过编辑,直接使用默认的提交信息)。3.**处理冲突**:如果在撤销过程中发生冲突(即要撤销的更改与当前工作目录中的更改有冲突),Git会提示你解决冲突。解决冲突后,使用`gitadd`命令将解决后的文件标记为已解决,然后使用`gitrevert--continue`继续完成撤销操作。如果你想取消撤销操作,可以使用`gitrevert--abort`。4.**完成撤销**:撤销操作完成后,新的撤销提交会被添加到你的提交历史中。你可以使用`gitlog`查看新提交。注意:`gitrevert`只撤销指定提交的更改,而不会影响其他提交。此外,如果你想要撤销多个提交,可以指定一个提交范围,例如:```bashgitrevertoldest_commit_hash..newest_commit_hash```但请注意,范围撤销会按从新到旧的顺序依次撤销每个提交(即先撤销最新的提交,再撤销较旧的),以避免在撤销过程中出现不必要的冲突[^5]。###其他方法:使用`gitreset`(谨慎使用)如果你想要完全删除某个提交及其之后的提交(注意:这会改变提交历史),可以使用`gitreset`命令。但请注意,这种方法会重写历史,如果提交已经被推送到远程仓库,则可能会给其他协作者带来问题。因此,通常只在本地分支或未推送的提交上使用。1.使用`gitlog`找到你想要回退到的提交(即要撤销的提交的前一个提交)的哈希值。2.执行`gitreset--hard<commit_hash>`,这将使当前分支的HEAD指向指定的提交,丢弃之后的所有更改(包括工作目录和暂存区的更改)[^3]。例如:```bashgitreset--hard23818c51cc7d0aefbad8ea```如果你只是想撤销提交但保留更改在工作目录中(以便重新修改),可以使用`gitreset--soft`或`gitreset--mixed`(默认)[^3][^4]:-`gitreset--soft<commit_hash>`:撤销提交,但保留更改在暂存区(即之前提交的更改会被添加到暂存区)。-`gitreset--mixed<commit_hash>`:撤销提交,且取消暂存更改(即更改会保留在工作目录,但需要重新`gitadd`)。请根据你的需求选择合适的方法。如果提交已经推送到远程仓库,建议使用`gitrevert`以避免历史重写。###相关问题§§相关问题§§1.`gitrevert`和`gitreset`有什么区别?2.如何撤销多个连续的提交?3.如果撤销过程中出现冲突,应该如何解决?4.如何撤销已经推送到远程仓库的提交?5.如何修改最后一次提交的注释信息?---[^1]:git撤销、回退某个commit修改。[^2]:Git撤回指定commit保留更改。[^3]:关于`gitreset`参数的解释。[^4]:使用`gitreset--soft`撤销提交。[^5]:撤销多个连续的提交。</think>### 如何撤销 Git 中的特定提交更改 在 Git撤销特定提交的更改有两种主流方法,根据是否保留提交历史选择: #### 方法 1:安全撤销(推荐) - `git revert` **特点**:生成新的撤销提交,保留原始提交历史 **适用场景**:已推送的提交或需保留历史的场景 **操作步骤**: 1. 查找目标提交的哈希值: ```bash git log # 复制需要撤销commit hash(如 7461f74) ``` 2. 执行撤销操作: ```bash git revert 7461f745cfd58496554bd672d52efa8b1ccf0b42 ``` 3. Git 会自动: - 创建新的撤销提交 - 反向应用目标提交的更改(如添加行→删除行) - 打开编辑器要求输入撤销说明(可添加 `--no-edit` 跳过) **结果**:提交历史中将新增一条类似 `Revert "原提交说明"` 的记录[^1][^2]。 #### 方法 2:历史重写 - `git reset` **特点**:直接删除提交,修改历史记录 **适用场景**:未推送的本地提交 **操作步骤**: ```bash # 1. 回退到目标提交的前一个状态(保留工作区修改git reset --soft 23818c51cc7d0aefbad8ea # 目标提交的前一个 commit hash # 2. 彻底丢弃目标提交的所有更改(慎用!) git reset --hard 23818c51cc7d0aefbad8ea ``` **参数区别**: - `--soft`:保留工作目录修改,更改退回暂存区[^3][^4] - `--mixed`(默认):保留修改,但退出暂存区 - `--hard`:彻底丢弃所有更改[^3] > ⚠️ **警告**:`git reset --hard` 会永久删除未提交的更改!已推送的提交需用 `git push -f` 强制覆盖,可能引发协作问题[^3]。 --- ### 关键场景处理 1. **撤销多个连续提交** ```bash git revert oldest_hash..newest_hash # 左开右闭区间(不包括 oldest) ``` 2. **撤销修改提交信息** ```bash git commit --amend # 修改最后一次提交的注释[^3] ``` 3. **撤销提交** ```bash git merge --abort # 终止合过程[^3] ``` --- ### 操作流程图 ```mermaid graph TD A[需要撤销commit] -->|已推送/需保留历史| B[git revert] A -->|未推送/需重写历史| C[git reset] B --> D[生成新撤销提交] C --> E[选择模式 --soft/--mixed/--hard] D --> F[安全推送到远程] E -->|--hard| G[彻底丢弃更改] E -->|--soft/--mixed| H[修改后重新提交] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值