git也是一套Source Code Control System (源代碼管理系統),歷史的進化就是:RCS、CVS、SVN、GIT。在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 Tag和Annoteted 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"參數。
沒有留言:
張貼留言