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 將錯誤的提交移動位置,但是需要注意一點,該命令只能一個一個節點的復制移動,不能只復制最新的一個。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM