Git 課程學習筆記-ep4

Jordan Tseng
JordanTTCDesign
Published in
Sep 29, 2020

第四堂課,我們已經慢慢熟練 git 了喔,小組練習來到PR了,加油🙆‍♂️🙆🏽

fetch & pull 差異

這次一開始講的是 git fetch,是把遠端資料庫抓下來的方法之三 。

git fetch origin master

它跟 git pull 很像,差別是:

  • git pull:fetch 下來直接 merge。
  • git fetch:只是先下載下來,沒有 merge

這個觀念很重要,我閱讀到很多程式設計師會以為 git fetch 可以讓他們在 local repository 上面的工作跟 remote repository 的工作可以同步。它會下載同步所需的資料,但不會更新任何的檔案。

下圖可以看到 fetch 下來的 o/master在第三格,但是 master 還在二格。

git fetch下來之後,確認完 code 沒問題後,就可以 git merge嘞

🥳🥳🥳🥳🥳🥳 大家merge起來~ 🥳🥳🥳🥳🥳🥳

git merge origin/master

這樣就會直接跟已經下載的遠端數據庫合併

記住要在資料庫名稱、分支名稱之間加入斜線→origin/master

什麼是 origin/?

你也許會對於 remote branch 前面的 origin/ 感到困惑(我也是😅)。這是remote branch 的一個命名方式。

  • <remote 名稱>/<branch 名稱>

當你看到一個 branch 叫做 origin/master,就表示這個 branch 叫做 master,而且這個 remote 的名稱叫作 origin。

GitHub PR 流程

再來是很重要的 pr → Pull Request。

據說是開發者慣用的開發習慣,在工作時,不是每個人都擁有全部資料庫的權限,可以利用PR從開發主機發出合併要求給正式主機,讓管理者去合併。

因為可能權限只在主管手中

步驟如下:

Fork 專案→這樣就會在自己的 github 帳號中複製出一個這個專案的repo。

箭頭位置Fork

在自己的本地端,git clone 這個複製的 repository,因為這個複製回來的專案已經在你自己的 GitHub 帳號下,所以你就有完整的權限,想怎麼改就怎麼改!

開始爽改一波~

視自己更改需求 branch 新分支,再用 dev 去 merge。

(例如本圖中的專案有兩個 branch:master、dev)

完成準備上傳

git push origin dev 

先推到自己複製過來的遠端資料庫上吧。

重點來了!

申請發 pr 合併

發個通知,讓主管知道你有做了一些事情,「順便看他有沒有在專心」?

選擇要合併的自己的分支,要合併對方哪個分支。

其實那個「通知」,就是發一個請原作來拉回去(Pull)的請求(Request),因此才叫做PR

恭喜完成一次Pull Request,鼓勵一下自己。

第一次完成後,其實不能沾沾自喜。

如這時候跟對方的 repository也更新了,自己的本地端其實不會更新耶🥵怎辦?

應該要抓對方的網址:

git remote add 自取名稱 對方網址

注意但這時候自取名稱,不能用 origin ,因為已經被取過了,通常用在自己的 repository。

remote了,就可以抓別人更新的檔案:

git fetch hex dev

這樣應該就是可以變成一個循環拉~

分支衝突

分支衝突,用兩種來解說:本地分支衝突、遠端與本地衝突

本地分支衝突

在本地端創建兩個分支 master、dev ,兩個都在html裡面同位置寫一個<h1> </h1>,產生了底下的線圖。

接著merge吧!

git checkout master 
git merge dev --no-ff

這樣會在 vscode 產生像是下圖中的衝突選擇視窗,告訴你要選擇哪段code要保留?

我們先選目前變更吧

選擇並儲存完成後,用 git status 查詢一下:

這時候在顯示文字中,會發現其實兩個分支尚未合併成功喔🤪

如果OK了要合併,就要打:

git add .
git commit
合併成功路線示意圖

這樣就合併完成!

遠端衝突示範

老師使用本地端和 直接在github頁面操作衝突示範

在遠端改資料,改title和h1
在本地端也更改同樣位置的code

改完後,用 git fetch origin/master 抓下遠端資料,因為先不要合併,看看有啥問題,在考慮合併與否。

merge 開始!!

merge後,一樣會跳出讓你選擇要保留哪一段?

我們這次先試試看選擇接受目前本地端的code

結果code就自動變成像下圖:

固定流程:保存結束→ git add. → git commit

因為兩個本地端和遠端過程是不同的,就不會產生快轉模式,會有小耳朵。

如果同時顯示本地端和遠端目前狀態大概會像下圖

當本地端解決完衝突,注意合併之後其實遠端不會自動更新,應該要自己最後再git push origin/master,遠端才有code喔!!

遠端合作

我們來做一個遠端合作的情境吧!,來更加了解使用狀況。

下圖情境是:

昨天做到 c1,下班前 git push 至遠端,但……

今天,老闆分配一個新同事跟我一起開發。到了今天快下班時,新同事馬上commit 上去兩個 commit c4 c5,導致我的 c2 c3 無法直接 git push 上去。

左邊是我在本地端的資料庫,右邊是遠端資料庫。

因為不能直接 git push 上去,我只能 git fetch 下來看看怎麼合併處理。

不用 git pull 是因為怕直接合併發生大量衝突,處理可能會很麻煩。

至於為啥會從 c1 長出來,因為遠端 master 的起點本來是在 c1

解決完衝突,合併出dev,在推到遠端,把 c2 c4 c6 一同推上去。

恭喜可以下班了!!

另外做法:

git fetch 下來看 code時,其實也不一定要馬上合併喔!

如上圖,架設我今天想加班繼續開發,我也可以先不用解決衝突,先寫一些css吧。

把衝突流到最後再解決,合併討厭同事的code,當然這要看情況做🙆‍♂️🙆‍♂️

補充注意

在作業中,同學 Fork 我的練習專案,我(專案原作者),只要同意他的PR,就會直接 merge 了喔,所以在同意前需要好好檢查。

可以點擊檔案去檢查code
練習專案 sourceTree 路線圖

未完待續

--

--