11. 代码提交错了分支如何处理

前言

该文章只是记录了一些自己的见解,可能并不准确,只是为了学习时的一些记录,不喜勿喷,谢谢

如果当我们准备在master分支修改点代码的时候,我们误操作,在dev分支修改的代码,且提交到了dev分支,写错了分支,此时我们想将该操作移动到master分支上,就可以使用本章内容知识了。

1. 模拟场景

下面模拟的场景是,我们本应该在master分支编写sorry.txt 和 sorry2.txt 两个文件,但是我们在dev分支上编写了,且提交到本地仓库

[root@huangzb git1]# git branch --list
* master
[root@huangzb git1]# git log
commit 8d09f829db84323eb313606dfcfb4d50eb32e464 (HEAD -> master, tag: v2.0, tag: v1.0, origin/test2, origin/master, origin/dev)
Author: 用户C <用户C@C.com>
Date:   Tue Apr 7 21:10:43 2020 +0800
 
    update heloc.txt
[root@huangzb git1]# git checkout -b dev
Switched to a new branch 'dev'
[root@huangzb git1]#
[root@huangzb git1]# echo '误操作' > sorry.txt
[root@huangzb git1]# git add .
[root@huangzb git1]# git commit -m 'dev误操作'
[dev 4a6d6e4] dev误操作
1 file changed, 1 insertion(+)
create mode 100644 sorry.txt
[root@huangzb git1]#
[root@huangzb git1]# echo '误操作2' > sorry2.txt
[root@huangzb git1]# git add .
[root@huangzb git1]# git commit -m '误操作2'
[dev b6c312e] 误操作2
1 file changed, 1 insertion(+)
create mode 100644 sorry2.txt
[root@huangzb git1]# git log
commit b6c312ef96828c459f9af2490e36b0d04e798470 (HEAD -> dev)
Author: 用户A <用户A@A.com>
Date:   Thu Apr 16 16:12:50 2020 +0800
 
    误操作2
 
commit 4a6d6e4a228881bad4fa629ec46be90f76ce56e9 (HEAD -> dev)
Author: 用户A <用户A@A.com>
Date:   Thu Apr 16 16:10:56 2020 +0800
 
    dev误操作
 
commit 8d09f829db84323eb313606dfcfb4d50eb32e464 (tag: v2.0, tag: v1.0, origin/test2, origin/master, origin/dev, master)
Author: 用户C <用户C@C.com>
Date:   Tue Apr 7 21:10:43 2020 +0800
 
    update heloc.txt
 

2. 补救方法

使用命令 git cherry-pic 提交的sha1-id

补救方法步骤

  1. 切换到正确的分支(即原本我们想在master分支上编写,现在错误的在dev上编写,所以我们此时需要切换到master分支上)
  2. 使用命令 git cherry-pick sha1-id 将指定提交节点复制到当前分支中
  3. 将错误分支的提交还原

操作如下:

2.1 切换到正确的分支

[root@huangzb git1]# git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
[root@huangzb git1]#

2.2 复制-移动指定提交节点

该操作的原理图如下:

使用命令 git cherry-pick 提交id 来将指定commitId复制一份到当前分支,且会重新生成一个新的提交id,避免回滚时疑惑,而且使用该命令只能一个一个节点的移动,不能只复制最后一个节点,忽略其中的多个节点。

操作如下:

[root@huangzb git1]# git cherry-pick 4a6d6e
[master 407ef72] dev误操作
Date: Thu Apr 16 16:10:56 2020 +0800
1 file changed, 1 insertion(+)
create mode 100644 sorry.txt
[root@huangzb git1]#
[root@huangzb git1]# git cherry-pick b6c312e
[master 85c1e9c] 误操作2
Date: Thu Apr 16 16:12:50 2020 +0800
1 file changed, 1 insertion(+)
create mode 100644 sorry2.txt
[root@huangzb git1]#
[root@huangzb git1]# ll
total 24
-rw-r--r-- 1 root root 25 Apr 15 19:27 helloc.txt
-rw-r--r-- 1 root root 14 Apr  5 22:18 hello.txt
-rw-r--r-- 1 root root 38 Apr  5 22:27 README.md
-rw-r--r-- 1 root root 11 Apr 16 16:36 sorry2.txt
-rw-r--r-- 1 root root 10 Apr 16 16:36 sorry.txt
-rw-r--r-- 1 root root 14 Apr  4 13:42 welcome.txt
[root@huangzb git1]#
[root@huangzb git1]# git log
commit 85c1e9ceafce32dd6b9d6b433441492382526e65 (HEAD -> master)
Author: 用户A <用户A@A.com>
Date:   Thu Apr 16 16:12:50 2020 +0800
 
    误操作2
 
commit 407ef72ad19eff57e1025b3cf0bcacdd2afaae78
Author: 用户A <用户A@A.com>
Date:   Thu Apr 16 16:10:56 2020 +0800
 
    dev误操作
 
commit 8d09f829db84323eb313606dfcfb4d50eb32e464 (tag: v2.0, tag: v1.0, origin/test2, origin/master, origin/dev)
Author: 用户C <用户C@C.com>
Date:   Tue Apr 7 21:10:43 2020 +0800
 
    update heloc.txt
 

从上图可以看出,当我们一下几点结果:

  1. 使用命令 git cherry-pick 后,确实将dev分支的修改复制到了master分支中
  2. 发现复制过来的两个节点,节点名字跟之前的两个节点名字不一样,重新生成了两个节点,但是内容是一致的

此时对于 master分支,代码是最新且正确的了,下面将处理dev分支的操作了

2.3 还原错误的分支

在本例子中,错误的分支是dev分支,该分支中存在两个错误的提交节点,需要删除掉,在我们的认知里,未commit之前都可以还原操作,但是一旦commit后,无法删除记录,所以我们这里就采用曲线救国手段,步骤如下:

  1. 切换到错误的分支
  2. 找到误操作前的节点
  3. 切换到误操作前的节点--会形成游离的分支
  4. 删除错误的分支
  5. 基于此时的游离分支重新创建错误的分支即可

操作如下:

2.3.1 切换到错误的分支

[root@huangzb git1]# git checkout dev
Switched to branch 'dev'
[root@huangzb git1]#

2.3.2 找到误操作前的节点

commit b6c312ef96828c459f9af2490e36b0d04e798470 (HEAD -> dev)
Author: 用户A <用户A@A.com>
Date:   Thu Apr 16 16:12:50 2020 +0800
 
    误操作2
 
commit 4a6d6e4a228881bad4fa629ec46be90f76ce56e9
Author: 用户A <用户A@A.com>
Date:   Thu Apr 16 16:10:56 2020 +0800
 
    dev误操作
 
commit 8d09f829db84323eb313606dfcfb4d50eb32e464 (tag: v2.0, tag: v1.0, origin/test2, origin/master, origin/dev)
Author: 用户C <用户C@C.com>
Date:   Tue Apr 7 21:10:43 2020 +0800
 
    update heloc.txt
 

可以看到,误操作前的最新节点id:8d09f829db8

2.3.3 切换到误操作前的节点--会形成游离的分支

[root@huangzb git1]# git checkout 8d09f829db8
Note: checking out '8d09f829db8'.
 
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
 
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
 
  git checkout -b <new-branch-name>
 
HEAD is now at 8d09f82 update heloc.txt
[root@huangzb git1]#

2.3.4 删除错误的分支

[root@huangzb git1]# git branch -D dev
Deleted branch dev (was b6c312e).
[root@huangzb git1]#

2.3.5 基于此时的游离分支重新创建错误的分支即可

[root@huangzb git1]# git checkout -b dev
Switched to a new branch 'dev'
[root@huangzb git1]#
[root@huangzb git1]# git log
commit 8d09f829db84323eb313606dfcfb4d50eb32e464 (HEAD -> dev, tag: v2.0, tag: v1.0, origin/test2, origin/master, origin/dev)
Author: 用户C <用户C@C.com>
Date:   Tue Apr 7 21:10:43 2020 +0800
 
    update heloc.txt
 

可以看到已经将dev分支还原了。

3. 注意点

我们可以使用命令 git cherry-pick 将错误的提交移动位置,但是需要注意一点,该命令只能一个一个节点的复制移动,不能只复制最新的一个。

原文地址:https://www.cnblogs.com/duguxiaobiao/p/12714101.html