zoukankan      html  css  js  c++  java
  • 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 将错误的提交移动位置,但是需要注意一点,该命令只能一个一个节点的复制移动,不能只复制最新的一个。

  • 相关阅读:
    05-流程控制
    04-基础语法3
    03-基础语法2
    SQLyog-证书密钥
    博客园美化系列__看板娘
    修改博客园模板样式【完美解决方案】
    Linux-Deepin 下开启SSH远程登陆
    Mui---自己利用Vue编写的表格
    canvas--操作步骤--属性
    Mui-打开手机相册
  • 原文地址:https://www.cnblogs.com/duguxiaobiao/p/12714101.html
Copyright © 2011-2022 走看看