[DAY9] 初學 Git (下)


Posted by 生菜 on 2020-06-22

更基礎的 Git 觀念,可參考前一篇[DAY8] 初學 Git (上)
這篇會介紹:

  1. branch 觀念和常用指令
  2. GitHub 和 GitHub Flow
  3. 各種其他 Git 狀況
  4. 第四期程式導師計畫交作業方法

branch ——世界線的開展與收束

branch 是什麼?

某天你正在寫新功能,此時有一個 bug 需要緊急修復,現在你面對到一個問題:當你回傳 bug fix 時,不可能連正在開發的新功能一起完成——這樣新功能的檔案該放哪?
branch 可以面對這個狀況。

怎麼理解 branch

可以把 branch 想成創造分身/另一個世界線的概念,先把開發中的新功能放到那個分身/平行世界中,等 bug fix 結束,再合併回來,這樣如果過程中發生了無法回復的傷害,也可以乾脆不要這個分身/平行世界。因此 branch 也廣泛用於多人共同編輯的專案上。
這個網站可以讓大家模擬 branch 的運作方法: Learn Git Branching

常用指令

建立和刪除 branch

git branch (新 branch 名稱)

git branch -v:查看現在有哪些 branch 。

git branch -d (欲刪除 branch 名稱)

切換 branch

相對於切換 commit 的 git checkout , branch 上的切換是:

git checkhout (欲切換 branch 名稱)

合併 branch

git merge (欲合併 branch 名稱)

merge 是將後方 branch 合併進現在的 branch 。因此若要將 branch1 合併進 master ,就要先切換到 master , 再輸入git merge branch1
不過誰合併誰實際上似乎不會有太多差異,只會在系統紀錄上有細微差別(新的 commit 誰的名字在前面)。

合併時遇到衝突怎麼辦

若 master 和欲合併的 branch 中都有更改過某個檔案,合併時可能會出現:

Auto-merging 456.txt
CONFLICT (content): Merge conflict in 456.txt
Automatic merge failed; fix conflicts and then commit the result.

這就表示兩個版本在 456.txt 做了不同的更改, Git 不知道要以哪個為優先。此時打開 456.txt 會看到有衝突的地方會顯示:

<<<<<<< HEAD
123123
=======
hihihi
>>>>>>> new

手動修改留下最後想要的版本,再 commit 就可以了。

GitHub 和 Git flow

GitHub

當多人協作版本控制時,就需要一個地方 .git 的資料夾。 Git 是版本控制的程式,而 GitHub 就可以是放 Git respository 的地方。
https://gitbook.tw/chapters/github/push-to-github.html

開始使用 GitHub

首先要把本地(你的電腦)內的 Git 連接上 GitHub :

git remote add origin (repository位址)

這裡的 remote 是遠端的意思, origin 則只是代號。

上傳

本地(你的電腦)和雲端 (GitHub)並不是連動的,可想像成 Google 雲端硬碟和電腦裡的檔案,因此時常需要手動同步。
這裡指令的邏輯是從本地出發,因此上傳要用推(push),下載要用拉(pull)。

git push orgin master

你可能會想「啊我就不想打那麼多字啊」,這樣可以一開始就用 git push -u orgin master設定好 upstream ,之後只打 git push , Git 就會預設你要上傳到 upstream ,這裡 GitHub 會建議你一開始設定 master 為upstream。

下載

如果已經有權限,就用:

git pull orgin master

可能會產生衝突,此時就用上面 merge 遇到衝突的方法,一樣手動解決即可。
但如果想下載別人在 GitHub 上的檔案,則要用:

git clone (網址)

如果沒有權限是不能再把東西 push 上去的,此時就可以使用 fork 的功能。

Git Flow

Git flow 是一套使用 Git 工作的流程,現在已經有許多不同的 Git flow 出現,以下介紹 GitHub 官網提供 的版本。

  1. 開一個新的分支
  2. 建立 commit
  3. pull request
  4. 其他人 review
  5. 合併回 master

最後可以 pull 回來,並 git branch -d 將剛剛開的 branch 刪掉。

其他 Git 狀況

修改 commit 說明

想要改 commit 的說明文字,可以輸入:

git reset --amend

之後進入 vim 編輯器修改就可以了。

修改 commit 內容

如果已經 commit 但後悔了,可以使用:

git reset HEAD^

HEAD 是用來存放「最新檔案資訊的」檔案, ^ 代表前一個的意思,也就是將最新檔案資訊 reset 到前一個。
如果之前修改的檔案都不要了,可在後面加一個 --hard 。否則會自動預設 --soft ,也就是雖然 commit 消失,但檔案還是被改動過的樣子。

回復檔案狀態

還沒 commit 前,若想回復檔案到上一個 commit 的狀態,可輸入:

git check --(欲回復檔案名)

改 branch 名稱

git branch -m (新的名稱)

把 branch 抓下來

想將遠端的 branch 抓到本地,可輸入:

git pull origin (欲抓 branch 名稱)

Git Hook

Hook 是鉤子的意思,在程式中看到 Hook 就是勾住某樣東西,發生變化時通知我。例如 Git 的 pre-commit Hook 就是在 commit 前檢查是否符合規範,若違反就無法 commit 。

第四期程式導師計畫交作業方式

  1. 把雲端上的最新版本抓下來 git pull origin master ,確保和最新狀況一樣等等才能順利上傳。
  2. 開一個新 branch git branch (branch name) 並切換過去 git checkout (branch name) 。也可用組合技 git branch -b (branch name)
  3. 在自己的電腦裡編輯作業,寫寫寫。(記得要檢查)
  4. 寫完之後建立一個新 commit git commit -am "說明" ,若有新增的檔案則用 git add .git commit -m "說明"
  5. 把檔案上傳 git push origin (branch name)
  6. 在 GitHub 上 pull requst 。
  7. 到系統作業列表新增作業。
  8. 等助教 merge 。
  9. 切回 master git checkout master
  10. 把最新檔案抓下來 git pull origin master
  11. 刪掉本地的 branch git branch -d (branch name)

和 Huli 的 master 同步

  1. 先 checkout 到 master ,確定沒有任何東西需要 commit 。
  2. 把 Huli 的資料 pull 下來。
  3. push 到自己的 master。









Related Posts

路由器router 路由設計routing 路由route

路由器router 路由設計routing 路由route

[day 02] new & factory: 如何建立一個新物件

[day 02] new & factory: 如何建立一個新物件

從實際案例看 class 與 function component 的差異

從實際案例看 class 與 function component 的差異


Comments