[教學] git應用-我的 commit 不見了 - 討論區

[教學] git應用-我的 commit 不見了

文章瀏覽次數 1853 文章回覆數 0

特種兵

特種兵圖像(預設)

2020-09-30 16:47:27

From:211.23.21.202

事情發生在 29 早上,利用還在蒸饅頭的時間,連進 local 的內部系統裡看看今天要改的地方。

順便測試一下昨天改的一個功能,卻發現沒有作用,這讓我大吃一驚。

清了 cache 還是一樣,打開程式碼看過,發現居然是舊的 code?

於是快速準備好後出發到公司解決這個問題。

通常,我都是在 logo 分支作業,完成後再與 master 合併。

為什麼我的 commit 不見了?先到 master 開始檢查。

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
# 沒問題,是最新的,跟遠端倉庫同步
$ git log -4
commit b3b1b975e4e37da01374044cd659aab07be6d637
Author: Kevin Lin <kevinlin@forblind.org.tw>
Date:   Mon Sep 28 17:50:50 2020 +0800

    修正回傳捐款來源字串判斷錯誤

commit 6bc05415c7fa11e8fee0ba318023fbf8c5f28d47
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Mon Sep 28 18:12:33 2020 +0800

    修改已建立但尚未派文之收文可更換說明與附件(tpl)

commit a679a42b6413d1a0299ee6c9cb79002794c049df
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Mon Sep 28 13:48:25 2020 +0800

    修復寄送附加檔信件檔案被刪掉問題

commit fb031d94a9154d3f032b2af529314ad30107627f
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Sun Sep 27 22:58:28 2020 +0800

    1.在派文管理將已派文單位改成表格方式呈現
    2.在派文管理之已派文單位可以取消派文

從上面四個 commit 看出,有三個是 28 號下午,一個是 27 號。

我記得 28 早上有寫 code 而且有推 commit 才對,感覺少了幾個 commit 了。

看看是不是有東西丟到 stash 了?

$ git stash
# 沒有

接下來,我們要查 reflog 那裡有完整的 log 資訊,

包括所有分支及所有動作。

所以在哪個分支查 reflog 的話都是一樣的。

當然,它有一些參數,像是顯示相對時間等。

如果想看較完整的 reflog 包括時間與提交者等,可以使用 git log -g

像我們這次就滿需要時間的,不過因為這樣資訊太多了,就不貼出來了,

實際上當時是有使用的。

$ git reflog
7bd0835 HEAD@{0}: checkout: moving from master to logo
# 從 master 切到 logo 分支
b3b1b97 HEAD@{1}: checkout: moving from master to master
# 從 master 切到 master 分支
# 應該是我想再次確認,從這裡也可以看出 git 的每個重要動作都有紀錄
b3b1b97 HEAD@{2}: cherry-pick: 修正回傳捐款來源字串判斷錯誤
# 在 master 撿 commit 合併
# 是從更之前的紀錄看出在哪裡做這個動作的
6bc0541 HEAD@{3}: checkout: moving from donLog to master
# 從 donLog 切到 master 分支
ae39fbb HEAD@{4}: checkout: moving from master to donLog
# 從 master 切到 donLog 分支
6bc0541 HEAD@{5}: cherry-pick: 修改已建立但尚未派文之收文可更換說明與附件(tpl)
# 撿 commit 合併
a679a42 HEAD@{6}: reset: moving to HEAD~
# 往前硬退一版
60c22fe HEAD@{7}: merge logo: Merge made by the 'recursive' strategy.
# 和併 logo 分支
a679a42 HEAD@{8}: checkout: moving from logo to master
# 從 logo 切到 master 分支
7bd0835 HEAD@{9}: commit: 修改已建立但尚未派文之收文可更換說明與附件(tpl)
# 推了一般 commit
76d02d8 HEAD@{10}: commit: 1.修正讓派文管理顯示派文異動收文
# 推了一般 commit

發現這個 commit 是剛才 master 沒有的

看到這裡,我也想起來似乎掉了不只一個 commit

而且我記得很清楚,當時都是有寫 commit 的

由上面的紀錄,我想問題大概發生在

master 合併 logo 後又退版,那時是因為有 merge 訊息,我想讓它沒有 merge 所以想從弄。

看了 logo 紀錄後,用 cherry-pick 來撿 commit 合併到 master,

但應該是沒注意看,只以為有一個 commit 要撿,結果只合了一個 commit 後就跑去修 bug 了。

然後我習慣合併過後的分支會砍掉,或者把 master 再合併回來分支。

於是我就漏臉了一些 logo 的 commit 了。

看起來要動刀,所以先把現在的 master 生一個分支出來備份。

$ git branch temp

$ git branch
   donLog                                                                        
   kevinlin                                                                      
   logo                                                                          
 * master                                                                        
   temp                                                                          

好,接下來我把 master 切到 27 號最後一個 commit,

因為我覺得 28 這邊有問題,那我們就重來。

$ git reset --hard fb031d9                                                      
 HEAD is now at fb031d9 1.在派文管理將已派文單位改成表格方式呈現 2.在派文管理之已
 派文單位可以取消派文                                                            
# 然後,我們切到 logo 分支,試著回到 28 的 commit 看看漏掉哪些沒合到。
$ git checkout logo

$ git log -4

commit 7bd0835df5c25bd424238392fb57a37a65ec6708
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Mon Sep 28 18:12:33 2020 +0800

    修改已建立但尚未派文之收文可更換說明與附件(tpl)

commit 76d02d88928f6cded13cd17bbce72c93941e2e58
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Mon Sep 28 15:43:03 2020 +0800

    1.修正讓派文管理顯示派文異動收文
    2.修正派文管理派文與取消功能無法獲得即時資訊問題

commit fb031d94a9154d3f032b2af529314ad30107627f
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Sun Sep 27 22:58:28 2020 +0800

    1.在派文管理將已派文單位改成表格方式呈現
    2.在派文管理之已派文單位可以取消派文

commit 8ad2824291ab8cc1d174de8446268101dfeb2dc2
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Sun Sep 27 17:50:03 2020 +0800

    在派文管理新增刪除收文的所有收文部門紀錄

跟還沒退版 master 也就是 temp 比起來多了 76d02d8 這個 commit,

看來我那時還沒有把 logo 刪掉也還沒有 pull master 回來

但還是覺得有少 commit,所以我們必須把 logo 退版

看看退過去後還有沒有之前漏掉的 commit

$ git reset --hard 76d02d88
# 就退到漏掉的這個 commit 
 HEAD is now at 76d02d8 1.修正讓派文管理顯示派文異動收文 2.修正派文管理派文與取消
 功能無法獲得即時資訊問題                                                        

退回去後看 log 還是一樣,這樣就確定只漏掉一個 commit,

之所以會覺得還有漏,是因為那個 commit 其實做了三件事,但我寫在同一個 commit 裡面。

而且其實我有下 show 去查 diff 確認內容沒問題。

那為什麼會記得是早上在寫 code 呢?原來是早上寫一寫還沒推,

然後系統突然有使用者回報問題,就先把手上的東西丟到 stash 切到 master 去修 bug 了。

修好後先推上去,已經是下午,接著才又回去開發,所以真真 logo 推 code 已經是下午了。

好,那就切回 master 然後先撿這個 commit 來合併。

$ git cherry-pick 76d02d88                                                      
 [master bbb960e] 1.修正讓派文管理顯示派文異動收文 2.修正派文管理派文與取消功能無
 法獲得即時資訊問題                                                              
  Date: Mon Sep 28 15:43:03 2020 +0800                                           
  3 files changed, 6 insertions(+), 4 deletions(-)                               

# 在看一下 logo 還有沒有漏掉的 commit 
$ git log -2 logo
# 因為我在 master 所以想看 logo 的 log 才要這樣打
commit 76d02d88928f6cded13cd17bbce72c93941e2e58
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Mon Sep 28 15:43:03 2020 +0800

    1.修正讓派文管理顯示派文異動收文
    2.修正派文管理派文與取消功能無法獲得即時資訊問題

commit fb031d94a9154d3f032b2af529314ad30107627f
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Sun Sep 27 22:58:28 2020 +0800

    1.在派文管理將已派文單位改成表格方式呈現
    2.在派文管理之已派文單位可以取消派文

# 在看 temp log
# 因為他是之前的 master 
# 所以我們撿完漏掉的 commit 後再把後來 master 的 commit 也都撿回來
$ git log -4 temp

commit b3b1b975e4e37da01374044cd659aab07be6d637
Author: Kevin Lin <kevinlin@forblind.org.tw>
Date:   Mon Sep 28 17:50:50 2020 +0800

    修正回傳捐款來源字串判斷錯誤

commit 6bc05415c7fa11e8fee0ba318023fbf8c5f28d47
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Mon Sep 28 18:12:33 2020 +0800

    修改已建立但尚未派文之收文可更換說明與附件(tpl)

commit a679a42b6413d1a0299ee6c9cb79002794c049df
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Mon Sep 28 13:48:25 2020 +0800

    修復寄送附加檔信件檔案被刪掉問題

commit fb031d94a9154d3f032b2af529314ad30107627f
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Sun Sep 27 22:58:28 2020 +0800

    1.在派文管理將已派文單位改成表格方式呈現
    2.在派文管理之已派文單位可以取消派文

$ git cherry-pick a679a42b6 b3b1b975e 6bc0541
# 所以前面三個 commit 現在沒有,要撿回來
 [master b59af14] 修復寄送附加檔信件檔案被刪掉問題                               
  Date: Mon Sep 28 13:48:25 2020 +0800                                           
  2 files changed, 1 insertion(+), 11 deletions(-)                               
 [master c62c834] 修正回傳捐款來源字串判斷錯誤                                   
  Author: Kevin Lin <kevinlin@forblind.org.tw>                                   
  Date: Mon Sep 28 17:50:50 2020 +0800                                           
  1 file changed, 1 insertion(+), 1 deletion(-)                                  
 [master fbfb1a4] 修改已建立但尚未派文之收文可更換說明與附件(tpl)                
  Date: Mon Sep 28 18:12:33 2020 +0800                                           
  2 files changed, 51 insertions(+), 16 deletions(-)                             

看一下最後弄好的 master 狀態

$ git status                                                                    
 On branch master                                                                
 Your branch and 'origin/master' have diverged,                                  
 and have 4 and 3 different commits each, respectively.                          
   (use "git pull" to merge the remote branch into yours)                        

 nothing to commit, working tree clean                                           

# 因為移來移去,所以肯定跟遠端倉庫不同了
# 我們現在確定手上的 master 是最新最完整的,
# 那最快的方式就是硬推蓋掉倉庫,不然以後就有拉不完的 merge 了
# 當然,你也可以切到遠端 origin/master 去調整
# 但就算調好了其他使用者一樣會有問題
# 而且正式環境有點急,所以這邊選擇直接蓋
$ git push origin master -f

 logo@192.123.3.2's password:                                                    
 Enumerating objects: 47, done.                                                  
 Counting objects: 100% (47/47), done.                                           
 Delta compression using up to 2 threads                                         
 Compressing objects: 100% (31/31), done.                                        
 Writing objects: 100% (31/31), 3.59 KiB | 44.00 KiB/s, done.                    
 Total 31 (delta 21), reused 0 (delta 0)                                         
 To 192.123.3.2:/xxx/yyyy                                                        
  + b3b1b97...fbfb1a4 master -> master (forced update)                           

大功告成了。
從結論上來說,直接從 master 撿回漏掉的 logo commit 就好,

但那就是結果論,正式環境不能有閃失,所以會用比較安全的方式來處理。

我們不能漏掉任何的 commit 而且那有可能不是你寫的。

好了,繼續寫程式去。

補充:

  • reflog 有時間限制,也就是太舊的 log 會被清掉,那就真的找不到了,因此發現問題最好趕快處理
  • reflog 跟 git log 一樣,顯示的方式是最上面最新,所以我習慣從中間找一個有印象的 commit 開始往上看
    ※最後更新時間:2020-10-01 10:12:12 From:1.161.147.7 By:特種兵