Note: Github

Michael Hwang
6 min readMay 29, 2019

前陣子面試發現對git有需求,但是完全不會,結果被電爆,哭哭。
沒辦法,誰叫我邊緣都是自幹。總之來惡補一下吧。
(筆記於Datacamp的課程- Introduction to GitHub for data science)

Github是一個分散式版本控制系統,方便同個專案多人同時進行,卻又不會只把資料儲存在同個server已造成風險。git有以下特點:

  1. 所有變動皆不會消失。
  2. 若是有衝突會自動通知
  3. 可同時的多工多系統進行工作。

每個git project 含有兩種元素: 檔案和資料夾,以及project的"歷史",而這兩個都儲存在repository 裡(資料庫),並且在每個root directory裡的 .git儲存了全部的額外資料。

以下code使用Git Bash執行(Windows系統)

在git裡,檔案的變動有分為幾個階段。暫時性的變動會儲存在 staging area(用 git add)並且依然可進行後續修改,而永久性變動會存進.git(用 git commit)並不可再變動。

git status
# 檢視staging area
# 會顯示Untracked file,需要用add加入,否則不會捕捉變動
# 也會顯示若是commit會有多少變動存入

git diff [, filename/directory]
# 比對不同版本,也可指定檔案或特定資料夾
# 表格中, -表示刪減,+新增, a ver1 b ver2, @@ 表示修改範圍,從x行開始y行
git diff id1..id2
# 比對id1和id2。id1用hash表示,或HEAD~number
# HEAD 表示最新,當下的版本。

git add filename
# 把檔案放入 staging area
git commit
# save everything in staging area. 若是取消也是全部一起
#可在後面追加 -m "message"寫註記,並且用 --amend -m "new message"修改
註記。若是沒追加則會跳出nano編輯器以供寫入較長的註記。

內建文字編輯器: nano (朋友說現在都是vim沒人再用nano,現在暫時擺著
nano filename #open file with editor
ctrl +o #save file
ctrl + x #exit editor
ctrl + k #delete line
ctrl + u # un-delete line

git log
# 看變動歷史, 一樣可指定文件和資料夾。
# 已頁呈現,越新越下面。案空白鍵滾動,q離開
# 若加入數字則可指定最新幾次的變動,EX: git log -3 ,最近三筆。
# 每次commit都有一組hash代碼(具唯一性),一般讀取用前4~6碼即可。

git show
# 類似diff的表格
# 可接上hash看指定commit,或皆上HEAD~number看最近幾個的變動
(EX:看最新變動 git show HEAD~1)

git annotate filename
# 看file的變動的詳細資料
# 包含hash,作者,時間,第幾列,內容

.gitignore
# 此檔案所包含的檔案/資料夾名稱或附檔名會被git所忽略

git clean
# 刪除untracked file。因為是untracked,一旦刪除就真的不見了。
# -n flag 會顯示出即將刪除檔案,-f 會執行刪除

git checkout hash filename
# 讀取指定版本的檔案

git checkout -- filename
#刪除unstaged change
#同clean,一旦刪除就永久消失
# 輸入 . 代替檔名則表示全部

git reset
#使staged change變成unstage
#若是要刪除 staged change,需先reset 再 checkout
# 可指定檔案或資料夾(內所有變動)。若無指定則是當下全部。

git rm filename
# 刪除檔案,並且自動add in staged area

git config --list
# 顯示環境設定。
# 設定又可以層級高低分為local, global, system,可分別呼叫

cat filename
#打印出文件下資料

Branch

顧名思義,代表不同文件的版本。默認主幹版本為master。
前面所述大部分功能操作也適用於branch上(EX: diff, add, commit, checkout)

git branch
# 看當下所有branch。目前工作的branch前會加上*。
# branch之間可以用git diff branch1..branch2比較
#可以用checkout指令載入指定的branch
# 若是當下有未存檔change,並不能切換branch

git checkout -b new-branch-name
# 創建一個新的branch並轉移過去

git merge source-branch destination-branch
#從source branch把檔案合成到destination branch
#若是有衝突,需修改於 both modified報錯的檔案

git init new-repository-name
# 創建一個新的repository
# 儘管可以在repository下再進一個新的已形成巢狀結構,但太過複雜不建議
# 若是要將已存在的檔案轉成repository,則輸入他的位置或於該資料夾輸入
git init

git clone path/url [,newprojectname]
# 複製既有的repository,可以是從網路找或是電腦裡既存的
# 默認project名是繼承的,若是要更改則在後面追加

git remote
# 傳回clone原始來源。 若是加上 -v則會附上URL/path
# 默認remote name是 origin

git remote add remote-name url
# 加入新的remote來源

git pull remote branch
# 從遠端的指定branch載入資料並且merger到當本地當下的branch
# 一樣,若是改變未儲存會報錯

git push remote branch
# 像遠端上傳檔案。
# 為避免擅自覆蓋掉別人的work,沒有merge過的是無法上傳的
# 解決方法: push前先pull下來merge過

--

--