Git 王者超神之路

發表於2016-12-13

安裝Git

Linux

Mac

直接在Terminal執行git命令, 如果沒有會提示安裝方法.

如果喜歡安裝程式的話, 點這裡

配置檔案

第一次安裝, 千萬別要忘了配置你的git的使用者名字和郵箱. 這個道理很簡單, 每一次的提交時需要記錄提交者的, 如果沒有提交者, 那麼bug出現找誰來背鍋??

檢視config

Git 自帶一個 git config 的工具來幫助設定控制 Git 外觀和行為的配置變數。

當前使用倉庫的 Git 目錄中的 config 檔案(就是 .git/config):針對該倉庫。

每一個級別覆蓋上一級別的配置,所以.git/config的配置變數會覆蓋/etc/gitconfig中的配置變數。

當然, 也可以檢視某一項配置資訊.

  • 形式:git config [--global|--system]

設定使用者資訊

使用--global選項, 當以後在該系統上做的任何操作都會使用此屬性. 如果你需要在某一個特定的專案使用其他名字和郵箱, 那麼可以通過設定專案中的config檔案, 這樣config中的屬性會覆蓋掉global的全域性屬性, 並且當在其他專案中並不會造成影響. 使用方式只需要去掉--global引數即可修改專案中的.git/config檔案

獲取幫助手冊

形式: git help 或者 git --help

比如檢視config手冊

Git別名

例如: 生成別名之後可以在日後用簡短的表示來使用

.gitignore檔案

對於自動生成的檔案, 日誌, 編譯的臨時檔案等. 可以對其進行配置, 讓git不追蹤這些檔案

規範如下:

  • 所有空行或者以 # 開頭的行都會被 Git 忽略。
  • 可以使用標準的 glob 模式匹配。
  • 匹配模式可以以(/)開頭防止遞迴。
  • 匹配模式可以以(/)結尾指定目錄。
  • 要忽略指定模式以外的檔案或目錄,可以在模式前加上驚歎號(!)取反

glob模式是指shell所使用的簡化了的正規表示式.

  • * :匹配零個或多個任意字元
  • [abc] :只匹配括號內的任意一個字元
  • [0-9] :使用短劃線表示範圍, 可以匹配0到9之間的任何字元.
  • ? :匹配任意一個字元
  • **:匹配任意的中間目錄,例如a/**/z可以匹配a/z,a/b/z,a/b/c/z

如下給出一個樣板:

倉庫的基礎操作

初始化倉庫

新增檔案到暫存區

status倉庫

緊湊式中字母的表示含義如下:

  • ?? :表示新新增的未追蹤的檔案
  • M :M出現在右邊,表示該檔案被修改但是還沒有放入暫存區
  • M :M出現在左邊,表示檔案被修改已經放入了暫存區
  • MM :出現兩個,代表此檔案在工作區修改已經放入了暫存區, 但之後有進行了修改,沒有新增到暫存區

diff倉庫

如果你想知道檔案具體修改的內容, 那麼diff會很有用

提交更新

移除檔案

如果在工作區間對一個檔案進行刪除, 需要先進行add,然後才可以提交. 使用git rm可以直接在工作區間刪除檔案, 並提交到暫存區.

移動檔案

同樣使用git rm會方便很多, 並且如果相對檔案重新命名也可以如此

當執行了這條語句之後, 只需要在下一次commit即可, 不需要考慮額外操作. 等價於如下:

檢視歷史提交

如果是最基本的git log, 那麼會按提交時間列出所有更新, 包括提交的SHA-1校驗和, 作者名稱,郵箱,提交時間,提交說明. 下面說說常用選項.

關於format對應的常用佔位符的寫法和意義

選項 說明
%H 提交物件(commit)的完整雜湊字串
%h 提交物件的簡短雜湊字串
%T 樹物件(tree)的完整雜湊字串
%t 樹物件的簡短雜湊字串
%P 父物件(parent)的完整雜湊字串
%p 父物件的簡短雜湊字串
%an 作者(author)的名字
%ae 作者的電子郵件地址
%ad 作者修訂日期(可以用 –date= 選項定製格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式顯示
%s 提交說明

圖形展示分支的合併歷史

git log的一些其他操作

選項 說明
-p 按補丁格式顯示每個更新之間的差異。
–stat 顯示每次更新的檔案修改統計資訊。
–shortstat 只顯示 –stat 中最後的行數修改新增移除統計。
–name-only 僅在提交資訊後顯示已修改的檔案清單。
–name-status 顯示新增、修改、刪除的檔案清單。
–abbrev-commit 僅顯示 SHA-1 的前幾個字元,而非所有的 40 個字元。
–relative-date 使用較短的相對時間顯示(比如,“2 weeks ago”)。
–graph 顯示 ASCII 圖形表示的分支合併歷史。
–pretty 使用其他格式顯示歷史提交資訊。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)。

查詢一個字串的出現和刪除的提交

哈哈,即使如果你不小心寫個隱藏bug不管幾個月之後,如果老大要想找出問題是寫引發的其實很簡單.例如這樣
$ git log -p fileName 想甩鍋?算了吧,還是認錯以後多注意吧.

還有一些限制log輸出的選項

選項 說明
-(n) 僅顯示最近的 n 條提交
–since, –after 僅顯示指定時間之後的提交。
–until, –before 僅顯示指定時間之前的提交。
–author 僅顯示指定作者相關的提交。
–committer 僅顯示指定提交者相關的提交。
–grep 僅顯示含指定關鍵字的提交
-S 僅顯示新增或移除了某個關鍵字的提交

一個實際的例子,如果要檢視 Git 倉庫中,2016 年 11 月1號到7號,作者叫蘇的提交檔案,可以用下面的查詢命令:

撤銷操作

amend重新提交

當我們commit之後突然發現漏掉了一個檔案, 這個時候不可能對一個檔案再進行commit一次, 這樣做就顯得很多餘, 而如果版本回退之前再新增也比較麻煩. 這個時候就可以使用這個amend命令.如下:

取消暫存的檔案

就是對檔案進行了git add操作. 這個時候可以reset

撤銷對檔案的修改

場景: 當檔案修改了, 但是還沒有進行git add的時候還只是在工作區間, 還原成最後一次提交的內容

要注意使用, 使用之前確定是否要拋棄已經新增的內容. 因為這個動作可能讓你最新新增的內容徹底丟失. 因為沒有進行commit, 一般來說進行了commit的內容都是可以恢復的.

標籤

Git可以給歷史中的某一個提交打上標籤, 以示重要. 比如每次正式版本的上線等.

列出標籤


建立標籤

標籤分為兩種一種是附加標籤另一種是輕量標籤.

  • 附加標籤: 會儲存打標籤者的資訊, 時間和附加資訊. 最後更隨打標籤的提交
  • 輕量標籤: 只是在一個提交上做一個標記. 儲存在一個專門儲存標籤的檔案,指向提交的hash值

先來看附加標籤:

輕量標籤

後期打標籤, 就是對已經提交某次提交進行追加標籤設定

共享標籤

預設情況下, git push不會把標籤傳遞到遠端伺服器. 需要顯示的推送標籤共享到伺服器
例如: git push origin [tagname]

檢出標籤

git中不能真正的檢出一個標籤, 但是可以在標籤處建立一個新的分支.如下

檢視標籤對應的資訊

使用git show 可以檢視對應標籤的詳細資訊, 如果git show這樣的命令只是顯示上次提交的內容

分支操作

分支的建立

分支的建立, 其實本質就是建立一個可以移動的指標,這個指標名就是新的分支名

分支的切換

所謂的分支切換就是HEAD指標的指向的改變

分支合併

利用git merge , 這條命令會把當前所在分支與目標分支的內容合併, 可以這樣理解, 如果當你試圖向目標分支合併時, 如果當前分支可以順著一個分支走下去, 那麼本質上其實只是當前指標的向前移動, 由於這種情況下的合併並沒有需要解決的分期, 所以git會稱這個是fast-forward快速前進.

刪除分支

當一個功能分支開發完畢之後, 並進行了合併, 通常這個分支也就被刪除,以保證倉庫中的乾淨.

分支管理

git branch命令不只是可以建立於刪除分支. 如果不新增任何引數, 那麼會得到所有分支的一個列表

變基

和合並merge相似的效果都是合併分支, 但是使用變基rebase可以讓提交歷史變得更簡潔. 如下

Git 王者超神之路

Git 王者超神之路

圖片1是merge合併效果, 圖片2是rebase合併效果. 明顯變基會讓提交歷史看起來更加乾淨. 使用如下:

rebase原理就是, 從目標分支和要變基的分支向上查詢出共同祖先節點就是c2, 然後把要變基的分支到c2節點的所有提交,提取出相應的修改生成一個副本, 並追加到目標分建立相對應的提交. 此時變基的分支指向目標分支master的後面某一次提交. 此時只要使用修改master指向指標使用merge即可.

遠端分支


拉取遠端分支

假設遠端如果有一個dev分支, 你使用fetch進行抓取. 這個時候, 本地不會自動生成一個可編輯的副本, 換句話說就是這種情況下, 不會有一個新的dev本地分支, 只有一個不可以修改的origin/dev指標. 這個時候可以執行git merge origin/dev命令, 將這些遠端dev分支的工作合併到當前分支. 如果想要在自己本地的dev分支上工作, 可以將其建立在遠端分支之上.

建立遠端分支

如果你的本地有一個新建的dev分支, 並且你進行了提交, 此時你想把這個分支也提交到遠端的dev分支, 但是遠端還沒有建立dev, 這個時候可以使用如下命令: git push

刪除遠端分支

跟蹤分支

從一個遠端跟蹤分支檢出一個本地分支會自動建立一個叫做 跟蹤分支(有時候也叫做 “上游分支”)。 跟蹤分支是與遠端分支有直接關係的本地分支。 如果在一個跟蹤分支上輸入git pullGit 能自動地識別去哪個伺服器上抓取、合併到哪個分支。

當克隆一個倉庫時,它通常會自動地建立一個跟蹤 origin/mastermaster 分支。 然而,如果你願意的話可以設定其他的跟蹤分支 – 其他遠端倉庫上的跟蹤分支,或者不跟蹤 master 分支。 最簡單的就是之前看到的例子,執行 git checkout -b [branch] [remotename]/[branch]。 這是一個十分常用的操作所以 Git 提供了 --track 快捷方式:

設定已有的本地分支跟蹤一個剛剛拉取下來的遠端分支,或者想要修改正在跟蹤的上游分支,你可以在任意時間使用 -u 或 –set-upstream-to 選項執行 git branch 來顯式地設定。

檢視設定的所有跟蹤分支

遠端倉庫操作

克隆倉庫

檢視遠端倉庫

如果需要檢視某一個倉庫更多的資訊時, 使用git remote show ...

新增遠端倉庫

遠端倉庫的拉取推送

拉取

大家常用的可能是git pull這個指令. 這個指令的通常會從伺服器上抓取資料自動嘗試合併到當前所在分支.

而我們可以也可以利用git fetch進行本地分支所追蹤的遠端分支沒有提交. 然後我們可以手動的進行合併.

推送

git push [remote-name] [branch-name] 例如:

只有當對伺服器有寫入許可權, 並且之前沒有人提交, 這條命令才會生效.

上面的這兩個推送也好拉取也好. 如果所在分支設定了遠端伺服器分支的追蹤, 那麼可以省略掉後面的倉庫名和分支名. 如果沒有設定那麼必須顯示的指定.

遠端倉庫移除重新命名

對遠端倉庫的名稱進行修改

想要移除一個遠端倉庫,例如伺服器搬走了,不再使用一個特定映象,或者一個貢獻者不再貢獻

原文連結https://github.com/suzeyu1992/GitOperateDemo

相關文章