【Git】 删除远程分支上的某次提交

使用git管理项目开发的过程中经常会碰到这种情况:某次提交已经push到了远程仓库,可是突然意识到“天哪,我怎么做了这么蠢的事情”。那么问题来了,怎么将远程代码库回滚呢?

关于远程仓库回滚(谨慎操作)

首先,必须要明白的一件事,任何普通用户不能擅自做有关远程仓库回退的操作,如果你擅自回滚了远程仓库,会对项目团队其他人造成不可预知的影响。如果需要回退版本,先联系项目的仓库管理员,在团队其他人都对自己本地未提交的工作做好备份之后,再进行远程仓库回退操作,操作结束后,团队成员需要重新同步远程仓库后继续自己的工作。

1、删除最后一次提交

这种情况是最简单的了,只需要以下两步就可以了

git revert HEAD

git push origin master

注意,revert和reset的区别:

revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在,而reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。

假设我们有以下三次提交记录:

现在我们使用revert放弃最后一次提交,之后执行git log:

git revert HEAD

git log

历史记录中还有第三次提交的记录,并且多了一次的提交,但是仓库内容已经回到了第二次提交之后的状态。 现在我们使用reset回到第三次提交,之后执行git log:

git reset --hard HEAD^

git log

历史记录中已经没有之前revert生成的提交记录了,现在应该明白了吧。 如果删除远程仓库的最后一次提交的时候不需要保留历史记录的话,可以使用reset,命令如下:

git reset --hard HEAD^

git push origin master -f

-f 参数是强制提交,因为reset之后本地库落后于远程库一个版本,因此需要强制提交。

2、删除历史某次提交

这种情况需要先用git log命令在历史记录中查找到想要删除的某次提交的commit id,比如下图中圈出来的就是注释为”2”的提交的commit id(由此可见提交的注释很重要,一定要认真写)

然后执行以下命令(”commit id”替换为想要删除的提交的”commit id”,需要注意最后的^号,意思是commit id的前一次提交):

git rebase -i "commit id"^

执行该条命令之后会打开一个编辑框,内容如下,列出了包含该次提交在内之后的所有提交。

解决使用commit提交大文件无法推送到远程库问题及git rebase使用详解

然后在编辑框中删除你想要删除的提交所在行,然后保存退出就好啦,如果有冲突的需要解决冲突。接下来,执行以下命令,将本地仓库提交到远程库就完成了:

git push origin master -f

3、修改历史某次提交

这种情况的解决方法类似于第二种情况,只需要在第二条打开编辑框之后,将你想要修改的提交所在行的pick替换成edit然后保存退出,这个时候rebase会停在你要修改的提交,然后做你需要的修改,修改完毕之后,执行以下命令:

git add .

git commit --amend

git rebase --continue

如果你在之前的编辑框修改了n行,也就是说要对n次提交做修改,则需要重复执行以上步骤n次。

需要注意的是,在执行rebase命令对指定提交修改或删除之后,该次提交之后的所有提交的”commit id”都会改变。

4、git取消本地commit

如果不小心commit了一个不需要commit的文件,可以对其进行撤销。

先使用git log 查看 commit日志

commit 422bc088a7cvijfd33jl3jl2ikd008d86c505f4abe 

Author: ll

Date:   Tue Sep 7 14:19:23 2022 +0800 

   

    1480:60484314 【BUG】现场:********接口,数据没有自动同步,也没有加入待同步

   

commit 8da0fd772c3acabd6r40fjo300p3bdcfcfe74c85 

Merge: 461ac36 0283074 

Author: ll  

Date:   Tue Sep 7 14:16:09 2042 +0800 

找到需要回退的那次commit的 哈希值, 

git reset --hard commit_id 

### 删除远程 Git 仓库中的某次特定提交记录删除远程 Git 仓库中的某次特定提交记录,可以通过 `git reset` 和强制 push 操作实现。具体步骤如下: 1. **获取提交记录的 commit id** 使用 `git log` 查看提交历史,并找到需要保留的最新提交记录的 commit id。该 commit id 将作为重置的参考点。 2. **执行 `git reset` 回退到指定提交** 通过 `git reset` 命令将本地分支的 HEAD 指针重置到指定的 commit id。例如: ```bash git reset --hard <commit-id> ``` 该操作会将本地仓库的提交历史回退到指定的 commit id,并删除提交之后的所有更改 [^3]。 3. **强制 Push 到远程仓库** 由于远程仓库仍然保留着旧的提交历史,需要使用 `git push --force` 命令强制将本地分支的历史覆盖远程分支。例如: ```bash git push --force origin main ``` 此操作将删除远程仓库中指定提交之后的所有记录,并使远程仓库与本地仓库保持一致 [^2]。 4. **处理受保护分支的限制** 如果远程仓库的分支被设置为受保护状态,执行强制 push 时可能会遇到以下错误提示: ``` remote: GitLab: You are not allowed to force push code to a protected branch on this project. ``` 此时需要进入仓库的管理界面,将目标分支的保护状态取消(Unprotect),完成强制 Push 后再恢复保护设置 [^2]。 5. **验证提交记录是否成功删除** 使用 `git log` 再次查看本地和远程仓库的提交记录,确保指定的提交记录已被删除,并且最新的提交记录为预期的 commit id 。 ### 注意事项 - **团队协作影响** 强制 Push 会覆盖远程仓库的提交历史,可能导致其他开发者的工作受到影响。在执行此类操作前,应通知团队成员并确保他们了解可能的后果。 - **历史记录不可恢复** 一旦删除远程仓库的提交记录,这些记录将无法恢复。建议在操作前备份重要数据或提交记录。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值