[教學] git應用-提交領先 - 討論區

[教學] git應用-提交領先

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

特種兵

特種兵圖像(預設)

2020-09-18 22:31:27

From:1.161.149.22

這是一個經常遇到的問題,也是因為有多分支與多人開發才會容易這樣。

通常我們就是跟遠端倉庫比較,因為倉庫當作是最新最穩定也是準備上正式環境的版本。

落後跟領先在語意上都很直覺了,問題是要怎麼處理,以及為什麼會這樣。

我們接著看一下領先的狀況。

$ git status                                              
 On branch master                                                                
 Your branch is ahead of 'origin/master' by 2 commits.                           
   (use "git push" to publish your local commits)                                

 nothing to commit, working tree clean                                           

它告訴我們:

  • 現在在 master 主分支
  • 但我們比遠端倉庫的 master 還領先了 2 個提交

也就是我們的 local 端比 remote 端還新?

通常是進行了開發後有新的提交,然後還沒推上倉庫。

也可能是 merge 完後比遠端多了 merge 的 commit 紀錄。

首先,我們先確認一下兩邊的狀況:

# 先看自己的紀錄
$ git log -4
commit 5a3890f4822f30aabf0eb28f13394a184db0388e (HEAD -> master)
Merge: 8c2392b 8cae1a1
Author: Kevin Lin <kevinlin@forblind.org.tw>
Date:   Tue Sep 15 16:15:44 2020 +0800

    Merge branch 'lineQR' of 192.168.1.8:/web/repo into lineQR

commit 8c2392ba4362b9c250c5d3e67e7c519a98cc3c48
Author: Kevin Lin <kevinlin@forblind.org.tw>
Date:   Tue Sep 15 15:48:20 2020 +0800

    1. 修改批次匯入 LINEPay QRCode 表投驗證資料(根據已更新之匯入檔)。
    2. 修改編輯捐贈資料頁 LINEPay QRCode 額外資訊欄標題。

commit 8cae1a19cd5af7493f85c66e0744e518ac79a2bb (origin/master, origin/HEAD)
Author: Kevin Lin <kevinlin@forblind.org.tw>
Date:   Tue Sep 15 15:48:20 2020 +0800

    1. 修改批次匯入 LINEPay QRCode 表投驗證資料(根據已更新之匯入檔)。
    2. 修改編輯捐贈資料頁 LINEPay QRCode 額外資訊欄標題。

commit e23be8c4ecdff08d346489a128400625a572d7b8
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Tue Sep 15 13:50:37 2020 +0800

    1.修正 leaveModel 的 count() warning line 57, 279
    2.修正 documentModel 的 count() warning line 374

# 好,它告訴我們,領先兩個提交
# 也就是倉庫目前最新的應該是 commit 8cae1a1
# 注意一下 commit 那行的最後面還有 HEAD 狀態
# commit 8cae1a1 (origin/master, origin/HEAD)
# 表示遠端倉庫的 master 是在這個 commit 上面 
# 有加 origin 的就是遠端 
# 所以有當前的 master 跟遠端的 origin/master 
# 也有當前的 HEAD 跟遠端的 origin/HEAD 
# commit 5a3890f (HEAD -> master)
# 表示目前 local 端的 HEAD 跟 master 都在這個 commit 上
# 所以兩邊 master 現在不一樣,理論上最後應該讓他們一樣
# 那我們來確認一下遠端倉庫的紀錄
$ git log -2 origin/master
commit 8cae1a19cd5af7493f85c66e0744e518ac79a2bb (origin/master, origin/HEAD, master)
Author: Kevin Lin <kevinlin@forblind.org.tw>
Date:   Tue Sep 15 15:48:20 2020 +0800

    1. 修改批次匯入 LINEPay QRCode 表投驗證資料(根據已更新之匯入檔)。
    2. 修改編輯捐贈資料頁 LINEPay QRCode 額外資訊欄標題。

commit e23be8c4ecdff08d346489a128400625a572d7b8
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Tue Sep 15 13:50:37 2020 +0800

    1.修正 leaveModel 的 count() warning line 57, 279
    2.修正 documentModel 的 count() warning line 374
# 所以三種東西都在同一個 commit 上是最標準的

至少目前結果如 git 所示,那我們就要來確認到底想要的是什麼結果。

例如,local 端是正確的,所以我們只要把它提交上去遠端倉庫即可。

而如果確定倉庫的才是最正確的版本,local 端的都不要了,

那麼你可以把目前的 HEAD 移到遠端倉庫的 origin/HEAD 上,也就是退版:

$ git reset --hard origin/HEAD
# 這樣多的那兩個 commit 就會消失

如果沒加 origin 是什麼意思?就只是把目前的 local HEAD 往前退一個版本而已喔。

當然你也可以直接把多的 commit drop 掉。

如果要退到比較之前的 commit 會建議直接給 commit id 比較保險

畢竟一直算 ~ 可能會算錯。

最後補充一個比較麻煩的狀況,就是兩邊的 commit 有點亂了,

就是有些要、有些不要,那我會建議在 local 弄好,

看是要用 cherry-pick 撿提交或是 rebase 修改、刪除提交等動作,

都弄好後用 git push origin master -f 硬推到倉庫去,當然萬不得已不要這樣做,

因為可能對其他的伙伴帶來困擾,他們必須條整手邊的 local 才行。

還有一個狀況,就是領先了倉庫的 commit 但是又推不上去,我們下一篇來解這個難題。