前言
這篇文記錄學習 Git 及 GitHub 的使用方法,兩者區別:
- Git:用來進行檔案版本控制
- GitHub:讓使用者放檔案的平台,網站上也具有版本控制功能
使用者可以在 terminal 用 Git 指令將檔案上傳到 GitHub。
什麼是 Git?怎麼用它?
Git 係用以做檔案版本控制
基本的版本控制特點:
- 以資料夾歸納版本資料:當要做一個新版本的檔案時,會建立一個新的資料夾來放置所有相關的資料(文件、子檔案... etc)。
- 不做版本控制的資料額外放置:另外有些不想加入版本控制的資料,則不放入資料夾,避免不小心變更內容。
- 以亂數命名避免版本號衝突:當有多人協作一個新版本的各個子功能時,若以版本流水號(如 v2, v3)作為資料夾名稱容易產生混淆,所以用類似亂數的代號來當命名資料夾。
- 另以檔案記錄最新版本:資料夾或檔案數量可能又多又雜,而且名稱也難以找到連結,不知道哪個文件是配哪個檔案,這時可用一個檔案記錄最新版本,只要看這檔案就可以知道檔案其中的關係。
而使用 Git 可以幫助我們做到上列的事情。
Git 指令
git init
用途:初始化,新建 Repository
指令:git init
輸入指令後會出現以下訊息(例),並在目前的資料夾建立一個 .git
資料夾,任何版本控制項目都會透過它進行監視版控。
Initialized empty Git repository in /Users/id/Desktop/test/.git/
git status
用途:顯示目前 working directory 所有檔案的狀況(例如檔案被變更)
指令:git status
git add
用途:對檔案進行版本控制(將檔案加入 staging area)
指令:
git add <file>
將單個檔案進行版本控制git add .
將所有檔案進行版本控制
注意:檔案沒有被git add
的話,那對它進行變更都不會被 git 監控到。
關於 git 檔案狀態變化可參考此文,其中有下圖解說
範例
檔案都未進行版本控制前,輸入git status
顯示以下資訊,由圖中資訊可知目前 working directory 有三個檔案未進行版本控制。
若想對test.js
進行版本控制,輸入git add test.js
。用git status
確認,可知test.js
這個檔案已加入版本控制(staging area)且尚未被 committed(即尚未加到 repository)。
想把所有的檔案都進行版本控制,輸入git add .
。用git status
確認可知全部檔案都已進行版本控制(都加入 staging area)。
若想把已進行版本控制的test.text
移出 staging area,輸入rm --cached test.txt
後用git status
確認可知各檔案狀態。
git commit
用途:新建版本(儲存對 staging area 中任何檔案的變更,並將檔案移到 repository)
指令:
git commit
進入 vim 編輯提交的記錄,儲存離開後就建立版本git commit -m ‘message’
建立版本並留訊息,其中-m
就是 message 的意思git commit -am ‘message’
直接把檔案加到 repository 以新建版本(此指令對 new file 沒用所以還是要先git add
)git commit --amend
進入 vim 修改 commit 內容(可用來修來 message)
註:git commit
過後的檔案,若想再次建立新版本,則要再次git add
然後再git commit
,因為實際加入的是檔案的『變更』而非檔案本身。想省步驟可以用git commit -am ‘message’
。
git log
用途:顯示版本歷史記錄(版本代號、作者及時間)
指令:
git log
顯示完整資訊,包含版本代號、作者、時間及建立版本時所留訊息git log --oneline
顯示簡短資訊,包含版本代號及建立版本時所留訊息
git checkout
用途:切換到其他版本
指令:
git checkout <branchname>
切換到指定版本git checkout -b <branchname>
開一個新個 branch 並切換過去git checkout master
切換到最新狀態git checkout -- <file>
將修改後的檔案回復到未更動狀態git checkout -- .
將所有檔案回復到未更動狀態
應用:
如果遠端有新的 branch 而本機沒有,可以直接用git checkout <branchname>
切換到該 branch,且本機也會存有該 branch 的資料。
.gitignore
用途:不想放到備份的資料,可以用放到.gitignore
管理,放在裡面的資料會自動被 git 忽略。
指令:touch .gitignore
建立檔案
git diff
用途:查看在 staging area 的檔案目前更動的部分
指令:git diff
git branch
用途:管理 branch
指令:
git branch -v
查看目前有哪些 branchgit branch <branchname>
建立新 branchgit branch -d <branchname>
將 branch 刪除git branch -m <branchname>
修改當前 branch 名稱至填入的新名稱
git merge
用途:合併 branches
指令:git merge <branchname>
把 branch 合併進來
註:通常會在 GitHub 上面進行 merge(使用Pull requests
),下面再提。
注意
當 merge 時若有 conflict,git 會把有衝突的檔案標出來。
CONFLICT (content): Merge conflict in code.js
使用者需要開啟該檔案,就會發現上面會標記有衝突的片段,使用者要自己手動修改檔案並儲存。
git reset HEAD^
用途:commit 之後以此指令可返回到未 commit 狀態
指令:
git reset HEAD^ --soft
保留更改的東西,回到 staging areagit reset HEAD^ --hard
所有更改的東西都刪除回到沒有 commit
適用情境: commit 了但是又不想 commit,想回到先前狀態
還不清楚怎用待補充
git hook
用途:預防錯誤
參考:
維持團隊開發程式碼品質的好工具 — Git Hooks & Husky
GitHub 簡介
**基本知識**
在別人的專案頁面可能會直接看到有專案介紹,那是頁面顯示 README.md 的結果。
GitHub flow
Understanding the GitHub flow
建議使用的工作流程。
把本機的資料放到 GitHub 上
先在 GitHub 裡開一個新的 repository
把自己的專案加遠端的 repository
在 Terminal 輸入git remote add origin <url>
加遠端的 repository,位置就是後面<url>
的部分把 local 的專案 push 到 GitHub
在 Terminal 輸入git push -u origin master
把你的專案的 master 資料 push 到 origin 的 master
更新內容到 GitHub: git push
若之後有更新想要 GitHub 也有最新內容,則一樣用push
上傳
在 Terminal 輸入git push origin <branchname>
(上一條的 -u
可省略)
注意:
若已經commit
而且又push
了,就沒法更改 message 內容。
最好的方法還是push
之前先檢查一下,避免錯的東西被放到遠端。
抓 GitHub 內容下來: git pull
若 GitHub 上面有更新版本的檔案,使用者想把那些內容抓下來,
則在 Terminal 輸入git pull origin master
pull
一樣可能會產生 conflict,解決方法和本機處理一樣
複製內容: git clone
在 GitHub 上面看到有用的專案想下載下來用,基本上那些 repository 是沒有權限直接修改的,所以要先在 GitHub 上面Fork
,就會存成一份自己帳號下的 repository,
Fork 完之後在自己的 repository 裡按Clone or download
,並複製網址。
然後在 Terminal 中輸入git clone <url>
,就會把 GitHub 上的 repository 下載到自己的裝置。
若修改後要更新 GitHub 的 repository,則一樣用push
。
合併內容: Pull requests
通常會在 GitHub 上面進行 merge(使用Pull requests
),因為 GitHub 會直接顯示 branch, commit, file... 等差異。
點選Pull requests
並按Compare & pull request
。
顯示差異
確認並 Merge