【Git】回滚旧提交版本且不影响最新提交版本
一、场景假设
远程仓库origin中有一个分支main,有4次提交记录:v1、v2、v3、v4。
二、需求
需要回滚旧提交版本,但不影响已有的所有提交版本(即不影响最新提交版本),以便需要时可以重新回滚到最新提交版本。
如:现在想要回到版本v3,在v3上更新。之后可能回滚到最新版本v4。
三、基本思路
1、基于想要回滚的版本的commit号,创建【新分支】
(1)找到需要回滚的版本的commit号。
-
方法一:使用git log查找。
下图所示为v3的提交日志,commit后面的一长串字符即为commit号。
-
方法二(github仓库):在github仓库的commit历史中查找。
点击下图所示的commits按钮,即可看到该分支下所有历史提交记录。
如下图所示,每条历史提交记录的右侧有一个复制按钮,点击即可复制该提交记录的commit号。
(2)基于commit号在本地创建新分支。
使用如下命令:
git branch <new_branch_name> <commit_number>
假设创建新分支的名字是dev
,回滚到v3
,那么使用的命令就是:git branch dev f10c246f23c90c813813bc989e9feb2e4523ec9
(这一长串就是前面找到的v3
的commit号)。
注意:
git branch <new_branch_name>
这个命令只在本地创建分支,远程仓库(比如github)上面还不会显示有dev这个分支。
(3)将本地创建的此新分支推送到远程仓库。
将本地创建的新分支推送到远程仓库后,远程仓库才会显示此新分支。使用如下命令:
git push <remote> <new_branch_name>
假设需要将新分支dev
推送到远程仓库origin
(origin
一般是远程仓库的别名),那么使用的命令就是:git push origin dev
。
2、切换到【新分支】,如后续有更新,所做的更新都推送到【该分支】
(1)切换到新分支
切换分支默认是切换到该分支的最新版本,即在前面的示例中,切换到分支dev即相当于回滚到了v3版本。
因为前面只是创建了分支,但是并没有跟踪该分支,因此要想在该分支上更新,还需要切换到该分支。
使用如下命令:
git checkout <target_branch_name>
假设要回滚到v3、在v3基础上进行更新,那就切换到以v3为最新版本的分支dev,即使用命令:git checkout dev
。
(2)如后续有更新,将更新推送到该分支
git add .
git commit -m '<your comment>'
git push <remote> <target_branch_name>
第一行命令表示将所有更新过的文件加入到暂存区,以便后续提交;
第二行命令的是对更新内容的备注;
第三行命令的具体示例:按照前面的案例,为git push origin dev
。
3、当需要回到先前的最新版本时,切换回【拥有该最新版本的分支】,如后续基于最新版本有更新,所做的更新都推送到【该分支】
(1)切换到拥有最新版本的分支
默认切换到该分支的最新commit版本。
git checkout <target_branch_name>
按照前面的案例,为git checkout main
。
(2)如后续有更新,将更新推送到分支
git add .
git commit -m '<your comment>'
git push <remote> <target_branch_name>
第一行命令表示将所有更新过的文件加入到暂存区,以便后续提交;
第二行命令的是对更新内容的备注;
第三行命令的具体示例:按照前面的案例,为git push origin main
。
其他情况
假设切换到分支中的非最新版本号,切换版本后会提示“您正处于分离头指针状态”。如果在这非最新版本上进行修改后,直接进行以下命令并不会将更新提交到dev。
git add .
git commit -m '<your comment>' 执行此命令后会看到有此更新的版本号,如:[分离头指针 560e268] revise v2.
git push <your remote> <your branch> 如:git push origin dev
但是更新的内容会有一个版本号。若想保留更新,可以基于此修改新建一个分支。使用命令与步骤1中的相似。具体而言,假设更新内容的版本号是560e268,可以创建新的分支dev2来保存这个版本的修改。即:git branch dev2 560e268
。此时本地就会有dev2分支。要想将此本地分支推送到远程还需要进一步执行git push origin dev2
。
push操作可能会有一些网络问题导致不成功,多试几次就好。
四、一些基本命令
-
查看本地有哪些分支
git branch
-
查看远程仓库有哪些分支
git branch -r
-
在本地新建分支(此时远程还没有)
git branch <new_branch_name>
如:git branch dev
-
将在本地新建的分支推送到远程
git push origin <new_branch_name>
如:git push origin dev
-
切换分支
git checkout <branch_name>
注:git checkout主要用于切换历史版本、切换分支。
如:git checkout dev
一般默认是切换到分支中的最新提交版本。
-
在本地基于某版本创建分支并切换到该分支
git checkout -b <new_branch_name> <commit_number>
相当于合并了:
git branch <new_branch_name>
和git checkout <new_branch_name>
。 -
切换版本号
git checkout <commit_number>
这里应该是本分支下的版本号才可以进行切换。
-
删除本地分支
git branch -d <branch_name>
注意:删除的分支不能是当前所处的分支。
-
删除远程分支
删除远程分支之前要先删除本地分支。
git push origin --delete <branch_name>
这里应该是本分支下的版本号才可以进行切换。
-
删除本地分支
git branch -d <branch_name>
注意:删除的分支不能是当前所处的分支。
-
删除远程分支
删除远程分支之前要先删除本地分支。
git push origin --delete <branch_name>