前言: 使用git管理项目开发的过程中经常会碰到这种情况:某次提交已经push到了远程仓库,可是突然需要回退代码,怎么将远程代码库回滚呢?
不推荐这样做:在网上看到大部分人给出的解决方案是先将本地回滚,然后删除远程分支,之后再将本地的分支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"^
执行该条命令之后会打开一个编辑框,内容如下,列出了包含该次提交在内之后的所有提交。
然后在编辑框中删除你想要删除的提交所在行,然后保存退出就好啦,如果有冲突的需要解决冲突。接下来,执行以下命令,将本地仓库提交到远程库就完成了:
git push origin master -f
3、修改历史某次提交
这种情况的解决方法类似于第二种情况,只需要在第二条打开编辑框之后,将你想要修改的提交所在行的pick替换成edit然后保存退出,这个时候rebase会停在你要修改的提交,然后做你需要的修改,修改完毕之后,执行以下命令:
git add .
git commit --amend
git rebase --continue
如果你在之前的编辑框修改了n行,也就是说要对n次提交做修改,则需要重复执行以上步骤n次。
需要注意的是,在执行rebase命令对指定提交修改或删除之后,该次提交之后的所有提交的"commit id"都会改变。
转载自 博客
相关推荐
IDEA 通过 Git 回滚到某个提交节点或某个版本的操作方法 IDEA 是一款功能强大且流行的集成开发环境,而 Git 是一个开源的分布式版本控制系统。通过 Git,开发人员可以更好地管理项目代码的版本历史记录。本文将详细...
6. 测试关联:使用 `echo` 命令创建一个新的测试文件,然后使用 `git add` 和 `git commit` 命令将其上传至本地仓库,并使用 `git push` 命令将其推送至远程仓库。 在使用 Git 时,如果我们不小心删除了某个文件,...
然而,一旦代码被推送到远程仓库,特别是涉及到多个人的协同工作时,`git revert`成为更安全的选择,因为它会创建一个新的提交来撤销指定的更改,从而保持提交历史的完整性和可追踪性。 **一、简单场景:回滚单一或...
4. 集成工具:Git支持多种强大的命令行工具,如`git clone`(克隆仓库)、`git add`(暂存更改)、`git commit`(提交更改)、`git push`(上传本地更改至远程仓库)和`git pull`(获取并集成远程仓库的更新)。...
1. **版本管理**:Git的核心功能是版本管理,它可以跟踪文件和目录的变更,记录每一次修改的历史,以便在需要时回滚到任何历史版本。 2. **分支管理**:Git的分支机制使得开发过程中的并行开发变得简单,每个开发者...
- **版本控制**:Git的核心功能是版本控制,它记录了文件和目录的每次修改,可以随时回滚到任一历史版本。 - **仓库(Repository)**:Git仓库是存储项目所有版本信息的地方,包括提交历史、分支等。 - **克隆...
- 执行"Reset"后,本地仓库已回退到指定版本,但远程仓库仍为旧版本。 - 使用`git push -f`强制同步远程仓库。注意,这会覆盖远程仓库的提交历史,可能导致协作问题。 除此之外,还有其他reset模式,如"Mixed",...
4. 远程仓库:通过连接到远程Git服务器(如GitHub、GitLab或Bitbucket),团队成员可以共享代码,协作开发。 5. 撤销操作:如果误操作,Git提供强大的撤销功能,可以恢复到之前的提交状态。 6. 提交历史:Git的`git ...
Git的强大之处在于它允许开发者协同工作,通过分支和合并管理代码的不同版本,以及回滚到任何历史状态。GitKraken作为一个图形用户界面(GUI),使得复杂的Git操作变得更加简单,对新手友好,同时也提高了专业开发者...
4. **拉取与合并**:GitExtensions支持从远程仓库拉取最新的代码,并处理合并冲突。 5. **标签与重置**:用户可以创建标签来标记特定的提交,也可以使用不同的重置选项回溯到历史状态。 6. **图形化历史**:它提供...
1. 版本控制:Git提供了强大的版本控制功能,可以轻松回滚到任何历史版本。 2. 并行开发:通过分支机制,多个开发者可以在同一项目上同时工作而不会互相干扰。 3. 冲突解决:Git在合并过程中可能会出现冲突,但通过...
Git的主要功能包括版本控制、代码差异比较、分支管理、合并冲突解决、远程仓库操作等。版本控制使得你可以随时回滚到历史版本,代码差异比较帮助开发者了解代码的更改,分支管理则促进了协作和并行开发。通过与远程...
7. **远程仓库**:Git可以与像GitHub或GitLab这样的远程服务集成,`git remote add origin`命令用于添加远程仓库,`git push -u origin main`将本地分支推送到远程仓库。 8. **图形化界面**:虽然Git主要是命令行...
接下来,你可以学习基本的Git命令,如`git clone`(克隆远程仓库)、`git add`(暂存更改)、`git commit`(提交更改)、`git push`(推送本地更改至远程仓库)和`git pull`(拉取远程仓库的更新)等。 总的来说,...
`git clone`用于复制远程仓库到本地,`git add`用于将改动添加到暂存区,`git commit`用于保存暂存区的改动到本地仓库,`git push`用于将本地改动推送到远程仓库,以及`git pull`用于从远程仓库拉取并合并最新的改动...
5. 远程仓库连接:使用`git remote add origin <远程仓库URL>`与GitHub或其他托管平台的仓库关联。 6. 推送代码:使用`git push -u origin master`将本地的master分支推送到远程的master分支。 7. 克隆仓库:如果...
7. **远程操作**:`git remote add origin [url]`关联远程仓库,`git push -u origin [branch]`首次推送本地分支到远程,`git pull`拉取远程更新并合并到当前分支。 三、Git进阶用法 1. **撤销更改**:`git reset`...
这种方法的好处是它不会改写提交历史,对于已经推送至远程仓库并且其他人已经拉取了这些提交的项目而言,使用git revert更为安全。 为了更好地演示这两个命令的使用,我们首先需要准备一个Git仓库,并且有一个可...
2.5 本地库的代码推送到远程仓库 2.6 从远程仓库更新代码 2.7 提交修改文件到远程仓库中 2.8 把远程仓库中的代码克隆到本地 2.9 在IDEA中解决冲突 3.IDEA中GIT工作流 3.1 查看分支 3.2 创建分支 3.3 切换分支 3.4 ...
3. **克隆与拉取**:`git clone`用于复制远程仓库到本地,`git pull`则用来从远程仓库获取最新改动并合并到本地。 4. **提交与推送**:`git commit`用于保存本地的改动,`git push`将这些改动推送到远程仓库,供...