摘要:
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
- 在你的頭像旁邊點選 “+”,點擊 “New repository”
2. 輸入任意名稱,練習用可以所權限自己看就好呦,推薦點選自動生成一個 readme
成功~~。:.゚ヽ(*´∀`)ノ゚.:。
我們就可以開始放上我們的程式碼了~
生成 SSH Key
不過在這之前還得先設定授權才行
大多數 Git 伺服器都會選擇使用 SSH 公開金鑰來進行授權
如果用不同台裝置要記得重新取得授權喔~
那我們就開始生成自己常用裝置的 SSH 吧
可以參考官方文件:
首先!開啟終端機複製這行:
- 生成 SSH Key
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 到
cd ~/.ssh
再ls
,可以看到底下有兩個檔案
記得!!!!!!
(id)_rsa.pub
是公鑰,可以給出去的
(id)_rsa
是私鑰,是不行給出去的
所以我們要複製 公鑰 的內容
3. cat (id)_rsa.pub
就會跑出一大串東西,複製他
4. 然後到 GitHub 頁面,點選 Settings
5. 點選 SSH and GPG keys
6. 在 Key 的區域貼上剛剛複製的那一大串,Title 可以任意
這樣就大功告成啦~。:.゚ヽ(*´∀`)ノ゚.:。
如何clone repo
權限搞定也生成 repo 後,要怎麼把 repo 的檔案抓下來呢?
- 首先,點選那個綠綠的 Clone or download
2. 選擇 SSH,複製
3. 開啟終端機, cd
到桌面(或是任何你想存放檔案的地方)輸入:git clone "(你剛剛複製的 SSH 路徑)"
這樣就成功了~。:.゚ヽ(*´∀`)ノ゚.:。
基本指令介紹
開始練習前,先 cd
到你要版控的資料夾,也就是我們剛剛 clone 的資料夾
接著我們就要開始介紹何謂:stage(暫存)、repository(儲存庫)
在git中有分為三種不同的區塊:
在 Git 的世界中,會分為兩階段進行:
- 加到 暫存區 (集貨倉的概念)
- 放到儲存庫,也就是會生成一個
commit
(出貨)
為什麼要這麼麻煩呢?
因為如果我們是在寫一個靜態網頁,每寫好一頁的 Html 就直接 commit (生成一個節點)會很麻煩
因為 commit 太多,如果如果出錯想回到其中的某一版,到時候查閱紀錄會很麻煩
add
我們一般的作業區是 “工作目錄”
首先 cd
到我們的資料夾(myfirstrepo),新增一個檔案 hello
如果想知道自己到你哪些檔案有更動沒有更新上去,或是有沒有 commit
可以輸入: git status
來查看目前 Git 的狀態
當我們要更新檔案時,第一步就是要先將我們的檔案更新到暫存,也就是:
cd ~/Desktop/myfirstrepo
git add hello(或檔案在myfirstrepo內的資料夾,也可以 add 資料夾)
commit
add
完只是放到暫存而已,接下來我們要 commit
到儲存庫去
當然也可以不用add,直接
git commit -a -m"(註解我們做了什麼改變)"
再一次 git status
來查看目前 Git 的狀態
可以發現目前的狀態是有一個新的檔案 hello 尚未 commit
git commit -m"(註解我們做了什麼改變)"
如果沒有加 -m
的話會跑到自己設定的編譯系統(ex. vim)用於需要詳細說明的情況
那要離開vim是要按 :
再按 wq
如果想知道自己有沒有成功commit或是查看commit的紀錄
可以輸入: git log
來查看目前的紀錄
git log
中,有標明 head
的那行代表最新更新的意思
可以發現我有兩個 commit,但遠端和本地端已經開是不同步了
確定要這個檔案後,就要進入到 push
的階段了!
push
意即將本機端的檔案推向 server端
這個部分非常重要,如果 push
錯就麻煩了!所以一定要謹慎執行!
在介紹 push
之前,必須要先講一下分支(branch)的概念
branch
我們一開始會擁有一個 “主幹” 叫做 master
,我們每push
一個新的commit
就會多一個節點,主幹就會越長越高像樹一樣(ノ>ω<)ノ
那 branch
顧名思義就是從主幹岔開的分支!
但如果是這樣那要 分支(branch)幹嘛?直接推上 master 不就好了嗎!?
的確!這樣就沒有分支的必要
但是當今天是多人協作的時候或是要嘗試新東西、debug的時候
我們如果新增一個branch
並在上面做更改、嘗試,不僅可以有效管理分支、保留最原始的檔案,也能讓紀錄妥善保存才不會亂掉!
接著就來介紹branch的語法:
- 新增branch
git branch cat
這樣我們就新增了cat的分支
2. 查看自己在哪個branch git branch
前面有 *
的就是目前所在的branch
*
的就是目前所在的branch3. 切換到另一個branch git checkout cat
這樣我們就切到 cat 的branch了!
push
現在我們會利用commit -m
註解我們更改的項目,也學會利用 branch
來管理我們嘗試、分工、debug的紀錄
接下來我們就可以開始push
了!
git checkout cat
2. git push origin cat
如此一來就推成功了!
我們現在來看一下 Git 的狀態
可以發現遠端的 Head 與本地端 Head 還是不同步
雖然 push
了,但遠端沒有改變 (。ŏ_ŏ)
要怎麼讓遠端和本地端同步更新呢?
pull request
要同步遠端的第一步就是:
- 打開我們的 repo 查看
發現只有一個 commit 和 一條 branch,還沒有完全更新好( ´•̥̥̥ω•̥̥̥` )
不過仔細一看!多了一個按鈕!
2. 點擊 Compare & pull request
這個動作叫發 PR (pull request)
也就是提醒你的協作夥伴:「我 push 一個 commit 囉」
3. 按下 Create pull request
4. 在右手邊,可以選擇 tag 其他人 review 或 assign
這個內容主要是要讓你的主管(??總之是這個 repo 的主要負責者審核、確定內容用的
有種提交檔案更新申請書的感覺
注意上面的 branch 是 cat 合併到主幹 master,順序反了 cat 就變成主幹了,會不好管理
5. 按下 Merge pull request
這個動作主要會將 cat 更新的內容合併到 master 裡
下面我沒有截到,其實他可以向討論串一樣
大家可以留言討論或是 review code
由於這是我測試用的,沒有人跟我協作,所以我們就自己幫自己審核通過嚕
6. 點擊 Delete branch
Wait ! Wait ! Wait ! 為什麼我要刪掉我的 cat branch?
這是一個工作流程叫做 GitHub Flow
是一個統一的工作 SOP 讓工作更有效率!d(d'∀')
誒~這些動作好似曾相似!
第一步: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
是 Fetch 加上 Merge,詳細介紹可以參考這:
pull
為什麼我還要同步?我的本地端就是最新的啊?
忘記剛剛我們剛剛刪掉一個 branch 了嗎?
而且搞不好有人有更新檔案也說不定~
打開終端機
git checkout master
先切換到主要要更新的分支 (master)git pull -p
-p 可以更新分支以外,也可以順便同步分支的狀況,刪掉在遠端被刪除的分支
但如果忘記也沒有關係
git checkout master
git pull
git branch -d cat
來查看一下 Git 的狀態
同步成功!
突發狀況!那如果是要
pull
其他 repo 的檔案更新在我的 repo 呢?
流程也是差不多的,只是有一點變化~
git checkout -b sync
這個動作是:branch sync
+checkout sync
git pull (SSH Key) (分支名)
git push origin sync
- 發 PR(Merge + 刪除分支)
git checkout master
git pull -p
好不容易把檔案都推了上去,幾天後卻發現檔案居然有 bug 或是臨時要做很大的更動或嘗試該怎麼辦呢Q
首先先來確定是誰的鍋#
沒錯!git 強大的記錄功能還可以看到這個檔案哪一行程式誰寫的
想裝傻都不行(◔౪◔)
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 reset
和git 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 有一點概念~
當然有錯或是看不懂的一樣歡迎留言告訴我喔~
我會不定時更新文章的 (。◕∀◕。)
拍個手讓我知道,這個文章對你們有幫助 ♥(´∀` )人
可以拍五次喔!快來瘋狂擊掌!