1/13 Git筆記(*Commit*工作區、暫存區與儲存庫*檢視紀錄)

1/13 Git筆記(*Commit*工作區、暫存區與儲存庫*檢視紀錄) 

Commit google得到的意思是承諾//保證....,依據我爬文的結果,我可以簡略的將CommitGit裡面的意思描述成像是「把暫存區的內容提交到倉庫裡存檔」,然後留下一些message給其他人或是未來的自己,告訴他們這次的更動改了什麼。
如果僅是透過 git add 指令把異動加到暫存區是不夠的,這樣還不算是完成整個流程。要讓暫存區的內容永久的存下來的話,使用的是 git commit 指令:




在後面加上的 -m "initial commit" 是指要要說明「你在這次的 Commit 做了什麼事」,只要使用簡單、清楚的文字說明就好,中、英文都可,重點是清楚,讓不久之後的你或是你的同事能很快的明白就行了。

Note:一定要先將檔案add到暫存區,才可以進行commit的動作。
 
如果直接打 Git commit (files name)


他會跳出你預設的文字編譯器,因為我現在還沒將我的編譯器更改,於是會跳出Vim,如果忘記Vim怎麼使用可以詳閱之前的筆記。

【冷知識】一定要有東西才能 Commit 嗎?
只要加上 --allow-empty 參數,沒東西也是可以 Commit 的:

工作區、暫存區與儲存庫:

可以從此圖一目瞭然。

  1. git add 指令把檔案從工作目錄移至暫存區(或索引)。
  2. git commit 指令把暫存區的內容移至儲存庫。

如果我修改了我已經commit的檔案,然後我再利用git status來查看,



他就會跳出“已經被修改過了”,那這時候我需要再add一次,然後再commit告訴大家我這次修改了什麼,但這樣實在是有點麻煩,於是我們也可以用
$ git commit -a -m "update content"
這樣即使沒有先 add 也可以完成 Commit。但要注意的是這個 -a 參數只對已經存在 Repository 的檔案有效,對還是新加入的檔案(也就是 Untracked file)是無效的。

教學裡的一段敘述我覺得滿有趣的,也很有道理:
「先 add commit 這樣二段式感覺可能有點麻煩,但也是有好處的。你可以想像你有一個倉庫,在倉庫門口有個小廣場,這個廣場的概念就像跟暫存區一樣,你把要存放到倉庫的貨物先放到這邊(git add),然後等收集的差不多了就可以打開倉庫門,把在廣場上的貨物送進倉庫裡(git commit),並且記錄下來這批貨是什麼用途的、誰送來的。
當然,你也可以每來一件貨物就開倉門存一次、紀錄一次,但這樣一來開倉庫的次數就會非常多。老實說這樣也沒什麼過錯,只是因為太過零碎的 Commit,有時候要查閱紀錄可能會有點不太方便;另外,過於零碎的 Commit 也可能給你的同事帶來一些困擾,例如要進行 Code Review 的時候,比較有整理的 Commit 可以一次看到比較完整的內容,而不需要一個一個 Commit 慢慢看。」
所以最好不要太長commit
Commit的時間點:
  1. 完成一個「任務」的時候:不管是大到完成一整個電子商務的金流系統,還是小至只加了一個頁面甚至只是改幾個字,都算是「任務」。
  2. 下班的時候:雖然可能還沒完全搞定任務,但至少先 Commit 今天的進度,除了備份之外,也讓公司知道你今天有在努力工作。(然後帶回家繼續苦命的做?)
  3. 你想要 Commit 的時候就可以 Commit
  4. 修正了一個bug

檢視紀錄:
此處是要檢視之前commit的紀錄,可以使用git log 指令來檢視,使用起來會是這樣


Author:誰做的
Date:什麼時間做的
每次的 Commit 大概做了些什麼事
Commit後面有一條像亂碼一樣的數英字混合,可以把它想像成Commit的身分證(當然比身分證重複的機率還低幾百億倍),因為他重複的機率非常非常低,他是利用SHA-1Secure Hash Algorithm 1)演算法所計算的結果。Git會使用這樣的字串作為識別,來分別各式各樣的commit
也可以利用--oneline  --graph 來簡略顯示





他會抓前6~8碼,但他不會顯示作者及時間,但他仍會顯示改了什麼,這專案如果是一個人做的話,其實用這個指令即可。但在看log的時候用圖形介面會更方便,像是Source Tree的介面可以按下History來觀看log



這樣可以少打一些字,且也更容易觀看,比在終端機清楚多了。在Source Tree越新的commit會在越上面,在 Description 欄位除了 Commit 訊息之外,還有一個「master」字樣,這是在 Git 裡預設的分支(Branch)的名字。關於分支目前還沒學到,之後的筆記會補上。
在這個區塊,這幾次的 Commit 分別在畫面上是以藍色的實心小圈圈呈現,而空心的小圈圈則是表示 HEAD 的位置。HEAD 通常是指向現在這個分支的最前端的地方。
Commit 欄位,可以看到 4f60799 56f6a09等等,它其實就是所謂Commit身分證,這幾串文字的「縮寫」。對 Git 來說,其實只要這 6 ~ 8 碼的 Commit 資訊,就足以識別了。那如果這個前 6 ~ 8 碼的縮寫真的重複了怎麼辦?別擔心,Git 會很貼心的告訴你「這個資訊沒辦法識別,請再提供更多位數的資訊以供識別」。
如果我只想找特定人的commit




Git這樣子才能讓我們揪戰犯)
同時可以再用 |(中文「或者」的意思) 來查詢「XXX 以及 XXX 這兩個人的 Commit 紀錄」:
$ git log --oneline --author=jiehong\edgeperson”(因為目前的commit,只有我一個人用QQ)
Grep:
使用 --grep 參數,可以從 Commit 訊息裡面搜尋符合字樣的內容:




還好裡面沒有髒話(汗),使用這種語法可以找到有關的關鍵字,亦可將當次commit的內容顯示出來。

【狀況題】我要怎麼找到哪些 Commit 的檔案內容有提到 fuck 這個字?
使用 -S 參數,可以搜尋在所有 Commit 的檔案中,哪些符合特定條件的:
$ git log -S fuck




乾之前在測試的時候真的有fuck XD

在查歷史資料的時候,可以搭配 --since --until 參數查詢:
$ git log --oneline --since="9am" --until="12am"
這樣就可以找出「今天早上 9 點到 12 點之間所有的 Commit」。還可以再加一個 after
$ git log --oneline --since="9am" --until="12am" --after="2017-01"
這樣可以找到「從 2017 1 月之後,每天早上 9 點到 12 點的 Commit
以上這些指令,在 SourceTree 都可以很方便的完成。點選左邊的側邊選單,在 WORKSPACE 選單下有個「Search」功能,即可進入搜尋畫面:



search那邊改user,接著就可以輸入作者的姓名,若將Search改為commit message,就可以將搜尋的內容改為commit時的關鍵字,





如果將Search改為file changes,就可以搜尋檔案裡的字



那今天的Git就學到這裡><


留言

熱門文章