iT邦幫忙

2021 iThome 鐵人賽

DAY 28
3
Modern Web

【Git】從零開始學習 Git - 30 天的學習筆記系列 第 28

Day28|將 GitHub 的檔案抓取下來到自己的本地端 - git pull 指令與衝突時的解決方法

上篇介紹了如何將檔案 Push 到 GitHub 後,今天就來練習如何從 GitHub 下載檔案吧!
這些技巧都很適合也蠻常用在團隊合作的時候喔!


Pull 指令

先看一下官方文件是如何說明 git pull 指令的。

👉 git-pull - Fetch from and integrate with another repository or a local branch

解釋:git pull runs git fetch with the given parameters and calls git merge to merge the retrieved branch heads into the current branch.

從上述的說明來看,我們可以知道其實 git pull 指令就是由 git fetch 將檔案從遠端抓取下來,並使用 git fetch 指令將最新進度加到當前的分支。

因此我們可以記得:

👉 git pull = git fetch + git fetch

總結|Pull 指令是去上限抓東西下來(Fetch),並更新本機的進度(Merge)


# git fetch

假使遠端的數據庫有了新的 Commit 版本,需要將這些更新取回本地端,此時使用此指令。

$ git fetch [遠端節點名稱] 
範例: git fetch origin 

預設情況下,git fecth 會將所有有更新的分支取回,如有想指定特定的分支,也可以執行以下指令:

$ git fetch [遠端節點名稱] [分支名]

使用 git fecth 抓下來的更新,如果要在本地端讀取的話,需要使用「遠端節點名稱 / 分支名」的格式讀取。

例如:遠端的節點名稱為 origin、分支為 master,今天要將抓下來的分支合併到當前進度,那麼應該透過以下指令才有辦法讀取到最新進度:

$ git merge oringin/master

「遠端節點名稱 / 分支名」- oringin/master

💡 補充|查看分支指令 git branch 搭配各種參數

如果想知道我們抓取下來的遠端分支,可以使用 -r 參數查看。

$ git branch -r # 檢視遠端分支

-a 參數則可以查看所有分支。

$ git branch -a # 檢視所有分支

上述除了使用 merge 來合併之外,也可使用 Rebase 指令來合併。

加上 --rebase 參數

$ git pull --rebase #使用 rebase 模式合併抓取檔案

Rebase 的優點在於不會產生額外的 Commit 來紀錄合併這個動作。


執行 git pull 指令發生衝突

通常會發生衝突的原因在於,目前遠端分支上的 Commit 版本,比你本地端來的新,如此一來會判別本地端的版本較舊就會推不上去。

範例:

生命魔法團隊是由

  1. 水之精靈 - 龜人團長
  2. 地之精靈 - 艾草 aka 阿妲瑪
  3. 喵(火)之精靈 - 娜奴烙詩
  4. 風之精靈 - 希爾芙Chuyin

四個人組成。

今天我們要一起做一個專案,共同在 GitHub 一起用了一個數據庫。

--

情境:

龜人團長與艾草阿妲瑪兩人差不多同時在 GitHub 上下載了一份檔案準備進行開發。因為龜人團長動作比較快寫好專案了,因此已經先 Push 到 GitHub 上。結果後來艾草阿妲瑪終於完成他負責的部分,準備要上傳到 GitHub 的時候 ....

「咦!?Why~~為何推不上去」艾草阿妲瑪崩潰的想、砸鍵盤。

--

方法一|先拉再推

看到崩潰的艾草阿妲瑪,娜奴烙詩查看情況,才發現原來是發生了「git pull 衝突」。

於是乎,娜奴烙詩找到了解決辦法告訴艾草阿妲瑪:

「艾草~~不用擔心啦~~讓我來告訴你怎麼解決吧!」

「你可以使用先拉再推的方式」

「再一次執行將遠端的資料拉下來,這樣龜人團長上傳的進度也會加到你的本地端,解決你比較舊的問題,這時候你就可以再把你的專案推出去了」

💡 執行程式碼:

$ git pull --rebase

--rebase 參數表示「內容抓下來之後請使用 Rebase 方式合併。

方法二|誰管你先,就要按照我的來!

在遠方的希爾芙Chuyin看到艾草阿妲瑪和娜奴烙詩兩人待在一起討論,忍不住好奇心也跑過來看。了解大致情況後,希爾芙Chuyin也告訴艾草阿妲瑪說他也有個辦法,不過還是不推薦啦!畢竟有點可怕(希爾芙Chuyin 的魔力控制的比較不好QQ...)

「你可以不要理會規則呀!直接使用 -f 參數,告訴 Git 強制將你的檔案推上去,這樣你就可以順利將檔案推上去啦!不過....這也會把龜人團長上傳的檔案給覆蓋掉啦....如果你們兩個不會爭執就好....」

💡 執行程式碼:

$ git push -f
$ git push -force

-f 參數或 -force 參數都可以使用。

--

艾草阿妲瑪聽到原來有這些方法後,心情很開心,她最後選擇了第一個方法,也才避免魔法界可能發生的腥風血雨戰爭,守護和平是當前重要的事。


補充說明 |git push -f 指令

此指令的好處是在於它可以無視規則,你想推就推,但也因為這樣,容易導致專案管理的難處。

因此使用這指令時要非常小心,要知道自己在做什麼。

使用時機:

  1. 整理歷史紀錄
  2. 只有自己一個人專案時可使用
  3. 啟動保護機制

--

為了魔法世界的和平,還是要好好跟其他組員溝通啦!
如果真的被蓋掉了,那就請之前前一個進度的組員,再一次將正確的進度強迫推上去就可以了!


上一篇
Day27|在 GitHub 上建立專案與使用 git push 指令將檔案上傳到 GitHub
下一篇
Day29|常見的三種工作流程 - Git flow、GitHub Flow 與 Gitlab Flow
系列文
【Git】從零開始學習 Git - 30 天的學習筆記30

2 則留言

0
艾草
iT邦新手 4 級 ‧ 2021-10-12 10:44:43

我就是要把團長的蓋掉啦 ψ(`∇´)ψ
輸入指令:$ git push -f
世界毀滅-完結

龜人 iT邦新手 4 級 ‧ 2021-10-12 22:04:38 檢舉

0
juck30808
iT邦新手 3 級 ‧ 2021-10-12 18:37:50

恭喜大大即將完賽XD !!!

我要留言

立即登入留言