一、问题来源
- 在多人合作程序开发的过程中,并且以git作为远程仓库管理代码,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,所以就需要做回滚操作
- 两种解决方法:回退(reset)、反做(revert)。
二、回退
回退操作,是会把从开始回退的版本到最新的版本之前的所有版本记录,全部抹灭,即没有操作痕迹,只能保留回退前的所有操作记录信息
-
若进行了四次git操作,分别对应A、B、C、D
-
此时发现B的代码有误,想要回滚,并且希望B之后的所有提交都撤回,那么需要找到A对应的版本号,执行命令,进行回退
//第一步,查看所有的操作记录 git log //查看所有的历史提交记录,按Q键可结束查看 //第二步,找到B的上个版本A对应的版本号,例如A的版本号是 4b0073265f1229777999a9462789ea46393bf4a5 git reset --hard qwetyuiop //第三步,推送到远程仓库 git push //第四步,若第三步执行失败,执行第四步,强制推送 git push -f
-
以下是一个具体实例供参考
- 添加了文件
testFile.cs
和testFile2.cs
,注释为: update testFile&testFile2 - 推送到远程仓库
- 查看历史操作记录
- 回退到这个版本的上一个版本,那版本号就是上个版本的版本号
PS E:\Eago_Git\First_Project> git pull Already up to date. PS E:\Eago_Git\First_Project> git add testFile.cs PS E:\Eago_Git\First_Project> git add testFile2.cs PS E:\Eago_Git\First_Project> git commit -m "update testFile&testFile2" [feature/20240318 a556e83] update testFile&testFile2 2 files changed, 4 insertions(+), 1 deletion(-) PS E:\Eago_Git\First_Project> git push Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Delta compression using up to 8 threads Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 434 bytes | 434.00 KiB/s, done. Total 4 (delta 1), reused 0 (delta 0), pack-reused 0 remote: remote: To create a merge request for feature/20240318, visit: remote: https://gitlab.com/net_code/First_Project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature%2F20240318 remote: To https://gitlab.com/net_code/First_Project.git 0cb467c..a556e83 feature/20240318 -> feature/20240318 PS E:\Eago_Git\First_Project> git pull Already up to date. PS E:\Eago_Git\First_Project> git log commit 0cb467c0375593b8b435d3dc0f0de134ace6314a Date: Wed Jul 3 16:43:39 2024 +0800 uypdae testfile commit 4b0073265f1229777999a9462789ea46393bf4a5 Date: Tue Jun 25 10:07:24 2024 +0800 update commit 597dcbfc83f2953957e682be09195a199c94f072 Date: Mon Mar 18 15:00:31 2024 +0800 update commit 4573966531b4860e350db81b9467431aa9dd47ce Merge: a7c08a7 c268f03 Date: Mon Mar 18 14:59:01 2024 +0800 PS E:\Eago_Git\First_Project> git reset -hard 4b0073265f1229777999a9462789ea46393bf4a5 error: did you mean `--hard` (with two dashes)? PS E:\Eago_Git\First_Project> git reset --hard 4b0073265f1229777999a9462789ea46393bf4a5 HEAD is now at 4b00732 update PS E:\Eago_Git\First_Project> git push -f Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 remote: remote: To create a merge request for feature/20240318, visit: remote: https://gitlab.com/net_code/First_Project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature%2F20240318 remote: To https://gitlab.com/net_code/First_Project.git + a556e83...4b00732 feature/20240318 -> feature/20240318 (forced update)
- 添加了文件
三、反做
反做是只会回滚某一次的提交操作,某一次前后的操作还会保留
-
若进行了四次git操作,分别对应A、B、C、D
-
此时发现B的代码有误,想要回滚,并且希望B之前的都保留,B之后的所有都保留,那么需要进行反做
//第一步,查看所有的操作记录 git log //查看所有的历史提交记录,按Q键可结束查看 //第二步,找到B的版本号,例如A的版本号是 e22428d5b5f30ea48f7b72337624f500d9821c6e git revert -n e22428d5b5f30ea48f7b72337624f500d9821c6e //假如B修改的文件与B之后的文件,例如C或D,有冲突,那么就会提示需要解决冲突,这时候可能需要借助可视化工具操作,手动合并解决冲突 //hint: after resolving the conflicts, mark the corrected paths //hint: with 'git add <paths>' or 'git rm <paths>' //第三步,添加解决冲突的文件,若没有冲突的文件,可跳过这一步 git add testFile.cs //第四步,提交 git commit -m "update merge" //第五步,推送 git push
-
以下是一个具体实例供参考
- 第一次,
testFile
文件和testFile2
文件都添加了内容 你好 - 第二次,
testFile
文件把 你好 中间加个 1 - 第三次,两个文件都新增一行内容 我还
- 反做第二次的操作,这时候testFile肯定会冲突,因为第二次和第三次操作的是同一个文件,所以需要手动解决
- 添加提交推送冲突
PS E:\Eago_Git\First_Project> git add testFile.cs PS E:\Eago_Git\First_Project> git add testFile2.cs PS E:\Eago_Git\First_Project> git commit -m "update 你好" [feature/20240318 4844278] update 你好 2 files changed, 7 insertions(+), 1 deletion(-) PS E:\Eago_Git\First_Project> git push Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Writing objects: 100% (4/4), 437 bytes | 437.00 KiB/s, done. Total 4 (delta 2), reused 0 (delta 0), pack-reused 0 remote: To create a merge request for feature/20240318, visit: remote: https://gitlab.com/net_code/First_Project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature%2F20240318 remote: To https://gitlab.com/net_code/First_Project.git 7aaa627..4844278 feature/20240318 -> feature/20240318 PS E:\Eago_Git\First_Project> git add testFile.cs PS E:\Eago_Git\First_Project> git commit -m "update testFile 你1好" [feature/20240318 e22428d] update testFile 你1好 1 file changed, 1 insertion(+), 1 deletion(-) PS E:\Eago_Git\First_Project> git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 298 bytes | 298.00 KiB/s, done. Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 remote: remote: To create a merge request for feature/20240318, visit: remote: https://gitlab.com/net_code/First_Project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature%2F20240318 remote: To https://gitlab.com/net_code/First_Project.git 4844278..e22428d feature/20240318 -> feature/20240318 PS E:\Eago_Git\First_Project> git add testFile.cs PS E:\Eago_Git\First_Project> git commit -m "update testFile add 我还" [feature/20240318 1407596] update testFile add 我还 1 file changed, 3 insertions(+), 1 deletion(-) PS E:\Eago_Git\First_Project> git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 8 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 306 bytes | 306.00 KiB/s, done. Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 remote: remote: To create a merge request for feature/20240318, visit: remote: https://gitlab.com/net_code/First_Project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature%2F20240318 remote: To https://gitlab.com/net_code/First_Project.git e22428d..1407596 feature/20240318 -> feature/20240318 PS E:\Eago_Git\First_Project> git log Date: Wed Jul 3 16:56:03 2024 +0800 update testFile add 我还 Date: Wed Jul 3 16:55:05 2024 +0800 commit 4844278787d4007930715010a9a3df5fb6d9eb61 Date: Wed Jul 3 16:53:34 2024 +0800 update 你好 commit 7aaa6279597434926c735f90bfabb3b74102581d Date: Wed Jul 3 16:51:53 2024 +0800 merge testFile Date: Wed Jul 3 16:49:20 2024 +0800 update PS E:\Eago_Git\First_Project> git revert -n e22428d5b5f30ea48f7b72337624f500d9821c6e Auto-merging testFile.cs CONFLICT (content): Merge conflict in testFile.cs error: could not revert e22428d... update testFile 你1好 hint: after resolving the conflicts, mark the corrected paths hint: with 'git add <paths>' or 'git rm <paths>' PS E:\Eago_Git\First_Project> git add testFile.cs PS E:\Eago_Git\First_Project> git commit -m "update merge" [feature/20240318 f680724] update merge 1 file changed, 2 insertions(+), 2 deletions(-) PS E:\Eago_Git\First_Project> git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 8 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 293 bytes | 293.00 KiB/s, done. Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 remote: remote: To create a merge request for feature/20240318, visit: remote: https://gitlab.com/net_code/First_Project/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature%2F20240318 remote: To https://gitlab.com/net_code/First_Project.git 1407596..f680724 feature/20240318 -> feature/20240318 PS E:\Eago_Git\First_Project> git pull Already up to date.
- 第一次,