1.22.2022

GIT基本指令筆記

git也是一套Source Code Control System (源代碼管理系統),歷史的進化就是:RCSCVSSVNGIT。在2022的今天,會知道RCS的應該沒幾個,因為這是2000年以前的骨董。

在這裡把自己之前所做的一些常用的指令記錄下來,方便日後查閱!

# git init

初始化一個Client端的Git基本設定。

# git config --local user.name "(Your Name)"
# git config --local user.email "(Your E-Mail)"
# git config --local core.editor "/usr/bin/scite"

core.editor是可以修改git commit時的文字編輯器指令;預設是vi或是vim。如果用不習慣可以使用此一指令來修改。

除了"--local"之外,還有"--globle";兩者的差異在於前者是「此一目錄下的專案」,而後者是針對「所有的專案」。

# git config --list

可以查看自己git的相關設定;而設定檔則是在自己家目錄下的".gitconfig"它是一個隱藏檔。

# git config --local alias.co "checkout"

設定"git"開頭之後的指令別名 (即縮寫)。如上範例:"git checkout"可改寫成"git co";指令的全名建議用雙引號給括起來,尤其是中間含有空格的複合式指令。

◎ 若在"git add"之後又有修改檔案,需要再重新"git add"一次!

# git commit -m "(Your Commit Log Message)"

若在commit後面沒有接上"-m"參數,會以預設的編輯器跳出一個空白的檔案讓使用者輸入。

# git commit -m --allow-empty

"--allow-empty"意思是允許一個空白的commit。

# git commit -a

等價於:git add & git commit; 但是僅能用在"已存在"的檔案;"新增"或是"刪除"的檔案並不適用。

# git log

可以查看commit的紀錄,有一些參數可用:

# git log --graph "(string...)":尋找commit訊息裡的某一特定字串。
# git log --author "picasso"
# git log --author "picasso | mike"

尋找commit log的作者為"picasso"或是"mike"。

# git log -S "picasso"

commit的「檔案內容」有"picasso"這個單字。

# git log -p (FileName)

若有加上檔名,則是可以單獨查看那些檔案的commit log;而"-p"參數還可以查看每一次的差異在哪兒!

# git log -g

等價於git reflog,若使用了reset之後,用上述指令可以查看HEAD移動歷史紀錄。reset到過去的某一個版本也可以透過SHA1 ID。

# git log --since="9am" --until="12am" --after="2017-01"

尋找2017年一月以後,每日09:00~12:00的commit紀錄。

# git rm (FileName) --cached

它的意思是讓該檔案脫離git的控管,即該檔案由Tracked (追蹤中)變成Untracked (非追蹤中);但這並不會刪除檔案。

# git rm (FileName)

從git中移除該檔案;之後直接git commit即可。

# git mv (FileNam1) (FileNam2)

將檔案重新命名。

# git commit --amend --no-edit

"--amend"僅能用在最後一次的修改;而"--no-edit"則是我不需要修改到commit log。

◎ 若只「新增一個目錄或是資料夾」,git是無法判斷的,當然也無法add和commit;此時的作法是在該目錄下新增一個".gitkeep"隱藏檔讓git可以偵測到新增了一個檔案。

◎ 若在git專案中有一些檔案不需要被git控管可以在專案的根目錄下建立一個".gitignore"隱藏檔,把那些不需要被控管的檔案寫進去。如此,那些檔案在執行git status時就不會出現"Untracked"的狀態。

◎ 但是,".gitignore"只會忽略".gitignore"檔案建立時間之後的檔案。

◎ 若".gitignore"內的檔案忽然想要被git控管的話,則是執行:"git add -f (FileName); "即Force (強制)的意思。

◎ 若要讓.gitignore建立的時間點「之前」的檔案也適用此一規則,則是執行:git rm --cached

◎ 若.gitignore內的檔案,除了不被控管之外,也不想要了,則是執行:git rm -fX (FileName); 即強制執行刪除。

# git blame (FileName) -L 5,10

可以查看該檔案的每乙行commit紀錄;而"-L 5,10"參數則是指定修改該行的前5行到後10行。

# git checkout (FileName) HEAD~2

可以回覆被刪除或是被修改的檔案;而"HEAD~2"則是指定回覆到至今的前2個commit的版本。

# git reset --soft | --hard | --mixed HEAD~X

讓現在的專案狀態回覆到前X個commit的版本;但"--hard"參數是最常用的。HEAD是指目前所在的分支。

# git branch

可以查看目前有哪些分支。預設的分支名稱是"master"。

# git checkout (Branch Name)

切換分支。

# git add -p (FileName)

可以commit該檔案的"部分內容"。

# git branch cat

建立一個叫"cat"的分支。

# git branch cat -m tiger

把"cat"這個分支改名為"tiger"。

# git branch -d tiger

把"tiger"這個分支刪除;若"tiger"尚未合併回主分支 (master)則是無法刪除,此時必須改用"-D"參數。

# git checkout -s dog

若切換到一個不存在的分支,則會產生Error Message;此時可以加上"-s"參數,會建立該分支並同時切換

# git checkout master & git merge dog

合併分支必需要先切換到"被合併"的分支,再合併。如上例是:先切換回master主分支,然後再將dog分支合併過來。

# git merge cat --no-ff

合併分支時不要使用快轉模式 (Fast-Forward)

◎ 倘若砍掉了一個尚未合併的分支 (-D);假如有記下當時的SHA1 Code,還是可以救的回來:git branch (Branch Name) (SHA1 Code)

# git checkout cat & git rebase dog;

我現在切換到"cat"分支,但我要回到rebase到"dog"分支的基準點。

沒事兒不要用rebase來合併分支,盡量使用merge。

◎ git的標籤分兩種:Lightweight TagAnnoteted Tag建議使用後者

# git tag "0.0.0.1_release" (SHA1 Code)

這是Lightweight Tag的語法;若無指定最後的SHA1 Code,則是以現行commit為Tag

# git tag "0.0.0.1_release" -a -m "Hello!! World!! "

這是Annoteted Tag的語法,"-a -m"的意思是要新增此一Tag的訊息。

# git cherry-pick (SHA1 Code) (SHA1 Code)

cherry-pick可以撿別的branch commit過來用;倘若撿過來但不要合併可以加上"--no-commit"參數。

沒有留言:

張貼留言