為你自己學 Git 筆記 — GitHub 應用篇

Kion
15 min readMar 9, 2019

--

https://pixabay.com/photo-3087585/

摘要:

1. 如何創建 GitHub repo、clone repo
2. 基本指令介紹:add & commit & push & branch & pull
3. 怎麼發 pull request
4. 了解什麼是 GitHub Flow

不知道大家有沒有覺得這張圖很熟悉,我近期超常看到有人引用的 XD

這次為什麼要特別寫一篇 Git 呢?

Git 真的是一個很好用的工具,我在上課交作業也是使用 Git (●´ω`●)ゞ
未來在很多協作上,Git 更是不可或缺的工具和協作概念
但是很多細節需要深究
這篇文章也沒有介紹的非常詳細,只是講幾個我常用的指令而已,十分主觀
因此如果要再更詳細深究的請參閱這篇:

我日後應該也會再出我學習的新心得~
如果有需要前導介紹的同學,請拉到這篇文章的最下方補足知識呦

GitHub 實作

為了可以接著練習下面的 Git 語法,可以一起建立看看喔

一開始建立帳戶後,就可以創建自己的 repo (repositories)或是加入別人的 repo

如何創建 repo

  1. 在你的頭像旁邊點選 “+”,點擊 “New repository”
在你的頭像旁邊點選 “+”,點擊 “New repository”

2. 輸入任意名稱,練習用可以所權限自己看就好呦,推薦點選自動生成一個 readme

輸入任意名稱,練習用可以所權限自己看就好呦,推薦點選自動生成一個 readme

成功~~。:.゚ヽ(*´∀`)ノ゚.:。

我們就可以開始放上我們的程式碼了~

生成 SSH Key

不過在這之前還得先設定授權才行
大多數 Git 伺服器都會選擇使用 SSH 公開金鑰來進行授權
如果用不同台裝置要記得重新取得授權喔~
那我們就開始生成自己常用裝置的 SSH 吧

可以參考官方文件:

首先!開啟終端機複製這行:

  1. 生成 SSH Key
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  2. cd ~/.sshls,可以看到底下有兩個檔案

記得!!!!!!

(id)_rsa.pub 是公鑰,可以給出去的

(id)_rsa是私鑰,是不行給出去的

所以我們要複製 公鑰 的內容

3. cat (id)_rsa.pub 就會跑出一大串東西,複製他

4. 然後到 GitHub 頁面,點選 Settings

點選 Settings

5. 點選 SSH and GPG keys

點選 SSH and GPG keys

6. 在 Key 的區域貼上剛剛複製的那一大串,Title 可以任意

點擊 New SSH key
在 Key 的區域貼上剛剛複製的那一大串,Title 可以任意

這樣就大功告成啦~。:.゚ヽ(*´∀`)ノ゚.:。

如何clone repo

權限搞定也生成 repo 後,要怎麼把 repo 的檔案抓下來呢?

  1. 首先,點選那個綠綠的 Clone or download
首先,點選那個綠綠的 Clone or download

2. 選擇 SSH,複製

選擇 SSH,複製(HTTP 我還沒研究過哈哈)

3. 開啟終端機, cd 到桌面(或是任何你想存放檔案的地方)輸入:
git clone "(你剛剛複製的 SSH 路徑)"

這樣就成功了~。:.゚ヽ(*´∀`)ノ゚.:。

基本指令介紹

開始練習前,先 cd到你要版控的資料夾,也就是我們剛剛 clone 的資料夾
接著我們就要開始介紹何謂:stage(暫存)、repository(儲存庫)

在git中有分為三種不同的區塊:

https://gitbook.tw/chapters/using-git/working-staging-and-repository.html

在 Git 的世界中,會分為兩階段進行:

  1. 加到 暫存區 (集貨倉的概念)
  2. 放到儲存庫,也就是會生成一個 commit (出貨)

為什麼要這麼麻煩呢?

因為如果我們是在寫一個靜態網頁,每寫好一頁的 Html 就直接 commit (生成一個節點)會很麻煩
因為 commit 太多,如果如果出錯想回到其中的某一版,到時候查閱紀錄會很麻煩

add

我們一般的作業區是 “工作目錄”
首先 cd 到我們的資料夾(myfirstrepo),新增一個檔案 hello

如果想知道自己到你哪些檔案有更動沒有更新上去,或是有沒有 commit
可以輸入: git status 來查看目前 Git 的狀態

紅字就是尚未 add 的檔案

當我們要更新檔案時,第一步就是要先將我們的檔案更新到暫存,也就是:

  1. cd ~/Desktop/myfirstrepo
  2. git add hello(或檔案在myfirstrepo內的資料夾,也可以 add 資料夾)
成功~

commit

add完只是放到暫存而已,接下來我們要 commit 到儲存庫去

當然也可以不用add,直接 git commit -a -m"(註解我們做了什麼改變)"

再一次 git status 來查看目前 Git 的狀態
可以發現目前的狀態是有一個新的檔案 hello 尚未 commit

可以發現目前的狀態是有一個新的檔案 hello 尚未 commit
  1. git commit -m"(註解我們做了什麼改變)"
成功~

如果沒有加 -m的話會跑到自己設定的編譯系統(ex. vim)用於需要詳細說明的情況
那要離開vim是要按 :再按 wq

如果想知道自己有沒有成功commit或是查看commit的紀錄
可以輸入: git log 來查看目前的紀錄
git log 中,有標明 head 的那行代表最新更新的意思
可以發現我有兩個 commit,但遠端和本地端已經開是不同步了

可以發現我有兩個 commit,但遠端和本地端已經開是不同步了

確定要這個檔案後,就要進入到 push 的階段了!

push 意即將本機端的檔案推向 server端
這個部分非常重要,如果 push 錯就麻煩了!所以一定要謹慎執行!
在介紹 push 之前,必須要先講一下分支(branch)的概念

branch

我們一開始會擁有一個 “主幹” 叫做 master ,我們每push一個新的commit就會多一個節點,主幹就會越長越高像樹一樣(ノ>ω<)ノ
branch 顧名思義就是從主幹岔開的分支!

但如果是這樣那要 分支(branch)幹嘛?直接推上 master 不就好了嗎!?

的確!這樣就沒有分支的必要
但是當今天是多人協作的時候或是要嘗試新東西、debug的時候
我們如果新增一個branch並在上面做更改、嘗試,不僅可以有效管理分支、保留最原始的檔案,也能讓紀錄妥善保存才不會亂掉!

接著就來介紹branch的語法:

  1. 新增branch git branch cat
    這樣我們就新增了cat的分支

2. 查看自己在哪個branch git branch

前面有 *的就是目前所在的branch

前面有 *的就是目前所在的branch

3. 切換到另一個branch git checkout cat

這樣我們就切到 cat 的branch了!

這樣我們就切到 cat 的branch了!

push

現在我們會利用commit -m 註解我們更改的項目,也學會利用 branch來管理我們嘗試、分工、debug的紀錄
接下來我們就可以開始push了!

  1. git checkout cat
移動至 branch cat

2. git push origin cat

如此一來就推成功了!

我們現在來看一下 Git 的狀態
可以發現遠端的 Head 與本地端 Head 還是不同步

遠端的 Head 與本地端 Head 不同步

雖然 push 了,但遠端沒有改變 (。ŏ_ŏ)
要怎麼讓遠端和本地端同步更新呢?

pull request

要同步遠端的第一步就是:

  1. 打開我們的 repo 查看

發現只有一個 commit 和 一條 branch,還沒有完全更新好( ´•̥̥̥ω•̥̥̥` )
不過仔細一看!多了一個按鈕!

2. 點擊 Compare & pull request

點擊 Compare & pull request

這個動作叫發 PR (pull request)
也就是提醒你的協作夥伴:「我 push 一個 commit 囉」

3. 按下 Create pull request

Write 空白也可以喔~

4. 在右手邊,可以選擇 tag 其他人 review 或 assign

旁邊可以 tag 其他人 review 或 assign

這個內容主要是要讓你的主管(??總之是這個 repo 的主要負責者審核、確定內容用的
有種提交檔案更新申請書的感覺

注意上面的 branch 是 cat 合併到主幹 master,順序反了 cat 就變成主幹了,會不好管理

5. 按下 Merge pull request

按下 Merge pull request

這個動作主要會將 cat 更新的內容合併到 master 裡

下面我沒有截到,其實他可以向討論串一樣
大家可以留言討論或是 review code
由於這是我測試用的,沒有人跟我協作,所以我們就自己幫自己審核通過嚕

6. 點擊 Delete branch

點擊 Delete branch

Wait ! Wait ! Wait ! 為什麼我要刪掉我的 cat branch?
這是一個工作流程叫做 GitHub Flow
是一個統一的工作 SOP 讓工作更有效率!d(d'∀')

https://guides.github.com/introduction/flow/

誒~這些動作好似曾相似!

第一步:Create branch

也就是我們剛剛的 cat

第二步:Add commits

也就是 git commit -m"add hello"

第三步:Open a Pull Request

我們回到 repo 點擊的綠色按鈕(Compare & pull request)

第四步:Discuss and Review your code

也就是在按 merge 前,討論串的地方

第五步:Depoly

驗證新增的這條分支的功能是否符合期待
若有問題,可以從 master 拉之前的檔案回復上一動

第六步:Merge

確定這條分支 ok,合併至 master 並刪除該分支

我覺得這篇寫得很清楚詳細,可以參考:

我目前也只接觸 GitHub Flow 有機會再分享其他兩個的心得~

所以這就是為什麼要刪掉 cat 的原因,而且既然他都已經合併就不用需要它了
下次再開一條 branch 即可

pull

同步遠端後,接著要同步本地端,這個時候就要用到 pull
pull
是 Fetch 加上 Merge,詳細介紹可以參考這:

為什麼我還要同步?我的本地端就是最新的啊?

忘記剛剛我們剛剛刪掉一個 branch 了嗎?
而且搞不好有人有更新檔案也說不定~

打開終端機

  1. git checkout master
    先切換到主要要更新的分支 (master)
  2. git pull -p
    -p 可以更新分支以外,也可以順便同步分支的狀況,刪掉在遠端被刪除的分支

但如果忘記也沒有關係

  1. git checkout master
  2. git pull
  3. git branch -d cat

來查看一下 Git 的狀態

可以發現現在遠端和本地端 Head 同步了

同步成功!

突發狀況!那如果是要 pull 其他 repo 的檔案更新在我的 repo 呢?

流程也是差不多的,只是有一點變化~

  1. git checkout -b sync
    這個動作是: branch sync+ checkout sync
  2. git pull (SSH Key) (分支名)
  3. git push origin sync
  4. 發 PR(Merge + 刪除分支)
  5. git checkout master
  6. git pull -p

好不容易把檔案都推了上去,幾天後卻發現檔案居然有 bug 或是臨時要做很大的更動或嘗試該怎麼辦呢Q

首先先來確定是誰的鍋#
沒錯!git 強大的記錄功能還可以看到這個檔案哪一行程式誰寫的
想裝傻都不行(◔౪◔)

  1. git blame hello

也可以指定行數 ex. git blame -L 5,10 hello列出第5-10行的意思

但知道是誰寫錯又有什麼用呢?
這時候git又派上用場了! git 不僅可以看程式碼是誰寫的,還可以回溯你每一個commit

checkout

還記得上面提到的 git checkout 嗎?
沒錯!除了移動分支以外,checkout 還能回溯到之前的 commit
也就是 git checkout HEAD~* 檔名

那我們要怎麼知道我們要回去哪一版呢?
還記得上面講過的 git log嗎?

如果只想看特定檔案的紀錄的話:git log 檔名,就能馬上看到他之前的 commit

那我們就開始吧!

1. git checkout HEAD~* 檔名

*為第幾個版本以前,也就是說:
回到上一版是 git checkout 檔名
回到上上一版是 git checkout HEAD~2 檔名

reset

當然除了這個方法也可以使用 git reset
首先我們可以透過git log 來看之前commit的 “代號”

然後輸入 git reset 代號 一樣可以跳轉到那一版
或是一樣打 git reset HEAD~*

如此一來原本的暫存區就會改成某一版的檔案
當然可以改檔案更新在工作區or暫存區or倉庫
但是比較常用和保險的是原本的設定(也就是更新在暫存區)所以這邊就不再做解說
詳細請看

那,git resetgit checkout有什麼差異呢?

沒錯!這兩個乍看是一樣的意思,但意義是完全不同的

git checkout 比較像是移動 head 並將暫存更改為某一版的 commit
如果此時再做分支就會從那一版岔開

git checkout 示意圖:-A - B - C (master)
\
D (HEAD, new-branch)

但是 git reset 比較像是拆掉前面的 commit 重來

git reset 示意圖:- A - B - C (HEAD, master)如果使用了git reset B則會變成- A - B (HEAD, master)

從上圖我們就可以明白 git reset相對git checkout 是比較有風險的做法
就看當時的情況作功能的選擇!

這篇的內容不完全與 「為你自己學Git」 相同,有加入我平時使用的習慣和想法
且涵蓋的內容也沒有很完全
若要更深入的學習,很建議把這個教材看完喔~

希望看完大家會對 Git 有一點概念~

當然有錯或是看不懂的一樣歡迎留言告訴我喔~
我會不定時更新文章的 (。◕∀◕。)

拍個手讓我知道,這個文章對你們有幫助 ♥(´∀` )人
可以拍五次喔!快來瘋狂擊掌!

--

--

Kion
Kion

Responses (1)