[Git] 安裝及簡單設定

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}"
)

發佈留言