這是一個經常遇到的問題,也是因為有多分支與多人開發才會容易這樣。
通常我們就是跟遠端倉庫比較,因為倉庫當作是最新最穩定也是準備上正式環境的版本。
落後跟領先在語意上都很直覺了,問題是要怎麼處理,以及為什麼會這樣。
我們接著看一下領先的狀況。
$ 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 但是又推不上去,我們下一篇來解這個難題。