基礎設定
初次設定
git config –global user.name <your name>
git config –global user.email <your email>
查詢設定
git config --list指令縮寫
git config --global alias.<縮寫> <原指令>比如 branch => br , checkout => co
以上設定全部可以在 ~/.gitconfig 中找到, 當然也能直接修改
版本控制
基本流程
git init (限第一次)
第一次時初始化,會製造.git資料夾存放所需參數 (參考git實作原理)
當不想被監控時,rm掉這個資料夾即為一個方法
git add .
表示加入所有檔案進入監控系統 (add 會放入staging area中,可以視為被記錄前的暫存區)
git add 也可以接<file>
,自行選擇想監控的檔案
(註: 檔案沒有被監控的情況下,若未來想要復原到過去版本,未監控檔案(untracked file)會消失)
git commit -m "message"
表示正式加入git紀錄節點,未來可以隨時回復到此狀態,同時git強迫一定要加上訊息來記錄這個commit節點做了甚麼(message處可以替換)
建立.gitignore 檔案
裡面可以放不想被監控的檔案的路徑
參考這裡
查看狀態
git status
#查看狀況(add、unstaging)
git log
#查看commit 狀況
git log –all –graph –decorate
#則可以以樹狀圖的方式呈現分支
git diff
#可以查看與HEAD之間更新了甚麼
也可以在diff中間加入<hashcode>進行比較
<hashcode>可以在log中找到,關於hash可以參考原理筆記
還原(移動節點)
git checkout <hashcode> or <name>
<name>可以填入 master或之後的branch name
分支
分支可以說是git強大的地方之一,允許分支間獨立發展、合併,比如程式要有測試版、開發版、debug版…等等平行開發(parallel development)時非常好用
git branch <name>
#建立叫做<name>的分支
如果不加上<name>會顯示所有分支
-d 參數會刪除該分支
-D 則會強制刪除,用於發生不可思議的力量導致無法刪除時使用
git branch
#顯示所有分支
git checkout <name>
#切換分支,且在切換前會要求所有變動都commit了,否則可以使用-f參數強制切換
git merge <name>
#當下分支與 <name>分支合併
但有時不是那麼理想,會發生衝突(conflict)
比如這個分支在file A加字, 那個分支在file B刪字
此時就需要決定要採用哪邊的
解決分支衝突
純文字檔、程式碼:
可以先使用git status查看情況
然後使用git merge –abort 暫停merge 狀態
接著會在衝突的檔案中發現comflict marker
修正好後git merge –continue 即可完成
二進位檔、圖檔:
先決定要保留誰的,然後使用checkout更新即可
git checkout –ours
git 與 github
github是放置程式的遠端資料庫,aka 工程師的FB
git可以將程式推上github,也可以將程式pull下來
- 流程
1. 在Github上新增respository
2. 建立readme檔(非必要)
3. 基本三連(init add commit)
4. 加入遠端支點
5. 推上去
實際流程
0. git clone URL (第一次以後用pull,未建立respository也不需要此步驟)
1. echo “what you want to say“ > README.md
2. git init
3. git add README.md
4. git commit –m \<message>
5. git remote add \<origin> URL(專案的) (第一次才需要)
6. git push -u \<origin> \<branchname>
註 origin在這裡就只是一個變數,代表著專案的url 註2 沒有branch情況下,就打主分支master
與他人協作
github之所以興盛的原因之一就在其開源,可以領教各路神人幫忙修專案
- 概念
以畫畫為例
概念上就是把別人展出的畫作影印複製一份回家
然後修修改改
最後想要放回別人展出的地方,就需要去請求原作者同意
若作者同意,就可以把你改良好的畫作展出給別人看了
步驟
- 可以把它人專案 fork 到自己那
- 然後clone自己家那份,修改好後 add、commit,然後推回自己家
- 最後對作者發pull request,可以在此與作者溝通 (通常簡稱PR)
- 作者如果接受,按下merge pull request 就可以合併此次commit
問題紀錄
-
推github被reject? 通常就是沒有執行第0步,沒有先pull專案下來
-
如何更新fork對象的repository?
# 原版取個小名叫upstream
git remote add upstream 原版本URL.git
# 將原版的更新全部抓下來
git fetch upstream
# merge it
git rebase upstream/master
# 回推上自己的repository
git push origin master --force
fetch VS pull
pull 目前可以理解為 fetch + merge
參考資料
高見龍老師的 為你自己學 Git
https://gitbook.tw/
政大蔡銘峰老師課程
github教學