Linux 安裝git
$ sudo apt-get install git
驗證git是否已安裝成功
$ which git
查詢git版本
$ git --version
git 產生SSH Key
ssh-keygen
查看SSH Key
$ cat ~/.ssh/id_rsa.pub
查詢目錄的狀態
$ git status
查詢目前的設定
$ git config --list
查詢特定檔案的commit
$ git log XXXXX.py
注意:需要有副檔名
查看特定檔案修改什麼
$ git log -p XXXXX.py
+代表新增
-代表刪除
SourceTree的話也可以看到:
在commit時點選:Log Selected 則會另外彈出一個視窗
查詢”單行”代碼作者及修改時間
$ git blame XXXX.py
組合內容為:
commit的識別碼 、 修改人名 、修改日期及時間 該行號(上圖我僅擷取2016行~2023行)
如果檔案太多行了,你只想看某而已,就加入-L 開始行號~結束行號
$ git blame -L 2010,2030 XXXX.py
有些檔案不想放在Git裡面
先建立檔名為:
.gitignore
然後編輯這個檔案的內容:
#忽略 test.py 檔案
test.py
#忽略 log目錄下的所有檔案
log/*
#忽略所有附檔名是 .tmp的檔案
.tmp
#忽略所有檔名為settings的檔案
settings.*
若不知道使用的工具或程式語言通常會忽略哪些檔案,可以至此連結查看
清出忽略
$ git clean -fx
忽略部分補充
如果要忽略的檔案在編輯.gitignore時就已經存在,需要先移出Git控管,之後就會被忽略了。
舉例:在3月1號時已經將test.py加入Git控管中,在3月5號才將.gitignore內新增要將test.py忽略,但此時Git已經在控管了,所以3月5號加的忽略不會進行,必須先將目前控管中的test.py移除。
救回被刪除的檔案
此三個檔案被我不小心刪掉了
救回方式(等同於還原所有檔案):
$ git checkout .
如果想救一個檔案:
$ git checkout S01.py
SourceTree用法
打開SourceTree會看到上面有被誤刪的檔案,點選最右邊的-,讓誤刪的檔案下去Unstaged files的位置。
鼠標移至誤刪的檔案位置,右建點選discard(丟棄)
然後會問你:您確定要放棄對這些文件的更改嗎?
意思就是⇒你不要刪除嗎
按下OK!!!!完成後就會看到誤刪的檔案回來了
補充
並不是所有檔案都能救出來,如果.git的目錄被刪除了,代表歷史紀錄也被刪除,會救不回來。
修改commit描述的訊息文字
修改最後一筆
$ git commit --amend -m "fix commit msg"
退版方式
先查看版本號
$ git log --oneline
方法一:相對位置
$ git reset d7ea967^
最後加的^代表前一次的意思,所以是指da824b4的commit,如果是d7ea967^^,就是前兩個版本,如果超過5個,可以寫成d7ea967~5,畢竟太多^很容易看得眼花。
相對位置也可以用另一種來表示:
$ git reset master^
或
$ git reset HEAD^
因為HEAD和master目前都是指向d7ea967這個commit,而且d7ea967這數字很難記,所以通常都不會用commit的英數來做,都已以上兩個方式,且都會一樣的結果。
方法二:絕對位置
直接指明在git log的版本號
$ git reset d9d68f9(版本號)
sourceTree用法
回到History,點選右鍵
已經退版但想再回一開始的版本
git reset HEAD~2,現在要在把他reset回到一開始(d7ea967)的commit。
$ git reset d7ea967 --hard
忘記版本的數字
$ git reflog
顯示HEAD有移動時的所有位置,目前HEAD的位置就是在執行完”reset”的位置,所以可以猜測,d7ea967是在reset前的位置,
Reset 的模式
Reset英文單字翻譯為”重新設定”,但事實上Git的Reset指令用中文來說比較像是”前往”或”變成”的概念,事實上並沒有真的把這個commit”拆掉”(放心,所有commit都在)
比較正確的解讀應該是”我要前往兩個commit之前的狀態”,因為實際上git reset指令也不是真的刪除或是重新設定,只是”前往”到指定的commit。
git reset 指令可以搭配參數使用,常見的三種參數,分別:
- mixed
- soft
- hard
HEAD是什麼?
HEAD 是一個指標,指向某一個分支,通常你可以把 HEAD 當做「目前所在分支」看待。
$ cat .git/HEAD
從這個檔案看起來,HEAD 目前正指向著 master 分支。
如果有興趣再深入看一下 refs/heads/master 的內容就會發現,其實所謂的 Master 分支也不過就是一個 40 個字元的檔案罷了:
切換分支,在看看HEAD檔案內容
$ git checkout dog
$ git cat .git/HEAD
HEAD 通常會指向目前所在的分支。不過 HEAD 也不一定總是會指向某個分支,當 HEAD 沒有指向某個分支的時候便會造成「detached HEAD」的狀態,詳情請參閱,待補。
在 SourceTree 的介面裡,HEAD 是以一個「空心的小圈圈」圖示呈現
在切換分支的同時,除了 HEAD 的內容會改變之外,在Reflog,當 HEAD 的內容改變的時候也會留下紀錄。
分支(Branche)
什麼是分支?
在開發軟體時,可能同時會有多人在開發同一功能或修復錯誤,也可能會有多個發佈版本的存在,並且需要針對每個版本進行維護。
為了能支援同時進行數個功能的增加或版本控制,Git具備了分支的功能。
建立分支
$ git branch 新的分支名稱
查詢現在的分支
$ git branch
前方有*代表目前所在分支
切換分支
$ git checkout 分支名稱
在 checkout 命令給定 -b 參數執行,可以同時建立分支和切換。
$ git checkout -b 分支名稱
rebase
離開rebase
git rebase --abort
在.git目錄裡面有什麼
此處先建立一個index.html檔案,再add後查看狀態。
利用hash來確認該檔案的值,來對照資料夾是否有這個檔案名。
.git\objects\30
Git會用40個字的SHA-1值的前面2字作為目錄,剩下38字是檔案名字
檢視差異
git difftool --dir-diff --tool=meld HEAD~ HEAD
建立一個方便的Bash函式:
git-diff-meld() (
git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)