更基礎的 Git 觀念,可參考前一篇[DAY8] 初學 Git (上)
這篇會介紹:
- branch 觀念和常用指令
- GitHub 和 GitHub Flow
- 各種其他 Git 狀況
- 第四期程式導師計畫交作業方法
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 官網提供 的版本。
- 開一個新的分支
- 建立 commit
- pull request
- 其他人 review
- 合併回 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 。
第四期程式導師計畫交作業方式
- 把雲端上的最新版本抓下來
git pull origin master
,確保和最新狀況一樣等等才能順利上傳。 - 開一個新 branch
git branch (branch name)
並切換過去git checkout (branch name)
。也可用組合技git branch -b (branch name)
。 - 在自己的電腦裡編輯作業,寫寫寫。(記得要檢查)
- 寫完之後建立一個新 commit
git commit -am "說明"
,若有新增的檔案則用git add .
和git commit -m "說明"
。 - 把檔案上傳
git push origin (branch name)
。 - 在 GitHub 上 pull requst 。
- 到系統作業列表新增作業。
- 等助教 merge 。
- 切回 master
git checkout master
。 - 把最新檔案抓下來
git pull origin master
- 刪掉本地的 branch
git branch -d (branch name)
和 Huli 的 master 同步
- 先 checkout 到 master ,確定沒有任何東西需要 commit 。
- 把 Huli 的資料 pull 下來。
- push 到自己的 master。