git學習筆記

 

一、git簡介

git是一種分佈式版本控制系統(Distributed Version Control System,簡稱 DVCS)。git 對待數據的方法是直接記錄快照,而非差異比較。git 數據庫中保存的信息都是以文件內容的哈希值來索引,而不是文件名。每次提交更新時,git主要對當時的全部文件製作一個快照並保存這個快照的索引。如果文件沒有修改,git 不再重新存儲該文件,而是隻保留一個鏈接指向之前存儲的文件。

git 有三種狀態,你的文件可能處於其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。 已提交表示數據已經安全的保存在本地數據庫中。 已修改表示修改了文件,但還沒保存到數據庫中。 已暫存表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。

由此引入 git 項目的三個工作區域的概念:git 倉庫、工作目錄以及暫存區域。git 倉庫目錄是 git 用來保存項目的元數據和對象數據庫的地方。工作目錄是對項目的某個版本獨立提取出來的內容。暫存區域是一個文件,保存了下次將提交的文件列表信息,一般在 git 倉庫目錄中,有時候也被稱作‘索引’。

 

基本的 git 工作流程如下:

  1. 在工作目錄中修改文件。

  2. 暫存文件,將文件的快照放入暫存區域。

  3. 提交更新,找到暫存區域的文件,將快照永久性存儲到 git 倉庫目錄。

 

在使用git之前,需要設置自己的用戶名稱和郵箱:

git config --global user.name "zhangsan"
git config --global user.email [email protected]

配置git默認的文本編輯器:

git config --global core.editor gedit

設置完成後,可以使用git config --list命令來查看你的配置。

配置git命令的別名,使用 git config –global alias 命令來配置,比如 我想用 st 代表 status

git config --global alias.st status

git當中有很多操作命令,如果不知道某個命令如何使用可以利用help獲取幫助,有三種方法可以找到 git 命令的使用手冊:

               1、git help 命令

               2、git 命令 --help

               3、man git-命令

 

二、git基本命令

創建和克隆倉庫

在本地的當前項目中初始化倉庫(即創建一個倉庫)

進入項目目錄中,然後輸入:

git init

該命令將創建一個名爲 .git 的子目錄,這個子目錄含有你初始化的 git 倉庫中所有的必須文件。但是,在這個時候,我們僅僅是做了一個初始化的操作,項目裏的文件還沒有被跟蹤。我們可以通過[ git add  文件名 ] 命令來實現對指定文件的跟蹤,然後執行 [ git commit ] 提交。

克隆github上現有的倉庫

克隆倉庫的命令格式是 git clone [url] 。例如:

git clone https://github.com/528405176/hello-world

你可以在克隆遠程倉庫的時候,自定義本地倉庫的名字,使用如下命令:

git clone https://github.com/528405176/hello-world myrepository

 

記錄更新到倉庫

檢查當前文件狀態

git status

git status 命令的輸出十分詳細,但其用語有些繁瑣。 如果你使用 git status -s 命令或 git status --short 命令,你將得到一種更爲緊湊的格式輸出。新添加的未跟蹤文件前面有 ?? 標記,新添加到暫存區中的文件前面有 A 標記,修改過的文件前面有 M 標記。M 有兩個可以出現的位置,出現在右邊的 M 表示該文件被修改了但是還沒放入暫存區,出現在靠左邊的 M 表示該文件被修改了並放入了暫存區。

創建一個新的文件

echo 'My Project' > newfile

此時再次使用git status命令能夠看到一個未跟蹤文件,git 不會自動將我們新創建的文件納入跟蹤範圍,需要我們使用git add命令將其納入跟蹤範圍

git add newfile

此時再運行 git status 命令,會看到 newfile 文件已被跟蹤,並處於暫存狀態。

如果我們修改一個項目中的文件,修改後的文檔會處於非暫存狀態,我們可以使用git  add的另一個功能,將非暫存狀態的文件加入暫存區域。否則我們提交的時候將不會提交修改後的文檔。

 

查看已暫存和未暫存的修改內容

查看尚未暫存的文件更新了哪些部分,具體修改了什麼地方,可以用 git diff 命令:

git diff

此命令比較的是工作目錄中當前文件和暫存區域快照之間的差異,如果要查看已暫存的將要添加到下次提交裏的內容,可以用:

git diff --staged

或者

git diff --cached

 

提交更新

git commit

這種方式會啓動文本編輯器以便輸入本次提交的說明。默認的提交消息包含最後一次運行 git status 的輸出,放在註釋行裏,另外開頭還有一空行,供輸入提交說明。如果想要提交更詳細的修改內容的說明,可以用 -v 選項,這會將你所做的改變的 diff 輸出放到編輯器中。

另外,你也可以在 commit 命令後添加 -m 選項,將提交說明與命令放在同一行:

git commit -m "added a new file named newfile"

跳過使用暫存區域直接提交更新

git commit -a

使用上述命令,git 就會自動把所有已經跟蹤過的文件暫存起來一併提交,從而跳過 git add 步驟。

 

移除文件

如果只是手動或者在命令行使用rm從工作目錄中刪除文件,運行git status會發現該文件出現在未暫存清單。要從 git 中徹底移除某個文件,就必須要從已跟蹤文件清單中移除(確切地說,是從暫存區域移除),然後提交。

git rm newfile
git commit -m "delete newfile"

如果刪除之前修改過並且已經放到暫存區域的話,但是又並沒有提交,則必須要用強制刪除選項 -f

git rm -f newfile 

另一種情況,如果我們想把文件從 git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中。換句話說,想讓文件保留在磁盤,但是並不想讓 git 繼續跟蹤。這時可以使用--cached選項:

git rm --cached newfile

git rm 命令後面可以列出文件或者目錄的名字,也可以使用glob模式。(所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式,也被稱之爲 shell 通配符)比如:

git rm log/\*.log

注意星號 * 之前的反斜槓 \, 因爲 Git 有它自己的文件模式擴展匹配方式,所以我們不用 shell 來幫忙展開。 此命令刪除 log/ 目錄下擴展名爲 .log 的所有文件。

 

移動文件(事實上常用來重命名)

git mv oldname newname

 

 

查看提交歷史

默認不用任何參數的話,git log 會按提交時間列出所有的更新,最近的更新排在最上面。這個命令會列出每個提交的 SHA-1 校驗和、作者的名字和電子郵件地址、提交時間以及提交說明。

git log

也可以使用一些選項過濾提交信息,-p用來顯示每次提交的內容差異,可以加上 -2 來僅顯示最近兩次提交

git log -p -2

如果你想看到每次提交的簡略的統計信息,你可以使用 --stat 選項,--stat 選項在每次提交的下面列出所有被修改過的文件、有多少文件被修改了以及被修改過的文件的哪些行被移除或是添加了。 在每次提交的最後還有一個總結。

git log --stat

--pretty 這個選項可以指定使用不同於默認格式的方式展示提交歷史。 這個選項有一些內建的子選項供你使用。 比如用 oneline 將每個提交放在一行顯示,查看的提交數很大時非常有用。 另外還有 shortfullfuller。

git log --pretty=oneline

還可以利用format選項定製顯示的格式git log --pretty=format 常用的選項

選項 說明

%H

提交對象(commit)的完整哈希字串

%h

提交對象的簡短哈希字串

%T

樹對象(tree)的完整哈希字串

%t

樹對象的簡短哈希字串

%P

父對象(parent)的完整哈希字串

%p

父對象的簡短哈希字串

%an

作者(author)的名字

%ae

作者的電子郵件地址

%ad

作者修訂日期(可以用 --date= 選項定製格式)

%ar

作者修訂日期,按多久以前的方式顯示

%cn

提交者(committer)的名字

%ce

提交者的電子郵件地址

%cd

提交日期

%cr

提交日期,按多久以前的方式顯示

%s

提交說明

eg:

git log --pretty=format:"%h - %an, %ar : %s"

oneline和format還可以與--graph結合使用,顯示 ASCII 圖形表示的分支合併歷史。

git log --pretty=format:"%h %s" --graph

 

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(後跟指定格式)。

 

限制輸出長度

git log 還有許多非常實用的限制輸出長度的選項,也就是隻輸出部分提交信息。

選項 說明

-(n)

僅顯示最近的 n 條提交

--since, --after

僅顯示指定時間之後的提交。

--until, --before

僅顯示指定時間之前的提交。

--author

僅顯示指定作者相關的提交。

--committer

僅顯示指定提交者相關的提交。

--grep

僅顯示含指定關鍵字的提交

-S

僅顯示添加或移除了某個關鍵字的提交

eg:列出所有最近兩週內的提交

git log --since=2.weeks

還可以給出若干搜索條件,列出符合的提交。注意,如果要得到同時滿足這兩個選項搜索條件的提交,就必須用 --all-match 選項。否則,滿足任意一個條件的提交都會被匹配出來。

 

撤銷操作

重新提交前一次的提交,換句話說,如果你的前一次提交有任何遺漏(少提交了幾個文件,文件內內容有誤,提交說明寫錯了等),你可以隨時進行彌補或者更正,然後重新提交。這樣會覆蓋前一次提交的記錄,但前一次的提交時間會保留。重新提交時,提交信息編輯器中可以看到上次的提交說明,可以編輯覆蓋。

git commit --amend

取消暫存的文件git reset HEAD <file>

 git reset HEAD newfile

撤銷對文件的修改git checkout -- <file>

git checkout -- newfile

 

遠程倉庫的使用

查看遠程倉庫

git remote

可以指定選項 -v,會顯示需要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL。

git remote -v

如果是你和其他人合作的項目,那麼遠程倉庫除了源倉庫origin(這是 git 給你克隆的倉庫服務器的默認名字),還會列出所有協作者的倉庫。這樣我們可以輕鬆拉取其中任何一個用戶的貢獻。

添加遠程倉庫

運行git remote add <shortname> <url> 添加一個新的遠程 Git 倉庫,同時指定一個簡寫(shortname爲url的簡寫,作爲遠程倉庫的名字)。

git remote add username2 https://github.com/username2/hello-world

從遠程倉庫中抓取與拉取

git fetch 遠程倉庫名字

這個命令會訪問遠程倉庫,從中拉取所有你沒有的數據。執行完成後,你將會擁有那個遠程倉庫中所有分支的引用,但並不會自動合併或修改你當前的工作,你必須手動將其合併入你的工作。

git fetch username2

默認情況下,git clone 命令會自動設置本地 master 分支跟蹤克隆的遠程倉庫的 master 分支(或不管是什麼名字的默認分支)。但不會涉及其他工作分支的內容。

推送到遠程倉庫

git push 遠程倉庫名字 分支名字

eg:當你想要將 master 分支推送到 origin 服務器時

git push origin master

只有當你有所克隆服務器的寫入權限,並且之前沒有人推送過時,這條命令才能生效。 當你和其他人在同一時間克隆,他們先推送到上游然後你再推送到上游,你的推送就會毫無疑問地被拒絕。 你必須先將他們的工作拉取下來並將其合併進你的工作後才能推送。

查看某一個遠程倉庫的更多信息

git remote show origin

遠程倉庫的移除與重命名

移除

 git remote rm username2

重命名

git remote rename username2 newname

 

打標籤

git 可以給歷史中的某一個提交打上標籤,以示重要

列出標籤

git tag

也可以使用特定的模式查找標籤。

git tag -l 'v1.8.5*'

創建標籤

git 使用兩種主要類型的標籤:輕量標籤(lightweight)與附註標籤(annotated)。

一個輕量標籤很像一個不會改變的分支 - 它只是一個特定提交的引用。輕量標籤本質上是將提交校驗和存儲到一個文件中 - 沒有保存任何其他信息。

然而,附註標籤是存儲在 Git 數據庫中的一個完整對象。 它們是可以被校驗的;其中包含打標籤者的名字、電子郵件地址、日期時間;還有一個標籤信息;並且可以使用 GNU Privacy Guard (GPG)簽名與驗證。 通常建議創建附註標籤。

 

附註標籤(運行 tag 命令時指定 -a 選項)

git tag -a v1.4 -m 'my version 1.4'

這句命令爲最後一次的提交打上版本標籤。使用 git show 命令可以看到標籤信息與對應的提交信息。

git show v1.4

 

輕量標籤

git tag v1.4-lw

這時,如果在標籤上運行 git show,你不會看到額外的標籤信息, 命令只會顯示出提交信息。

 

我們可以爲一個提交打上多個附註標籤和輕量標籤,但是系統不允許出現同名標籤。(事實上多個標籤也沒什麼用)

 

爲歷史提交打標籤

要給指定的歷史提交打標籤,需要在命令的末尾指定那個歷史提交的校驗和(或部分校驗和)。

 git tag -a v0.6 db89a9695 -m "my version v0.6"

共享標籤

默認情況下,git push 命令並不會傳送標籤到遠程倉庫服務器上。 在創建完標籤後你必須顯式地推送標籤到共享服務器上。

git push origin v1.1

如果想要一次性推送很多標籤,也可以使用帶有 --tags 選項的 git push 命令。 這將會把所有不在遠程倉庫服務器上的標籤全部傳送到那裏。

git push origin --tags

現在,當其他人從倉庫中克隆或拉取,他們也能得到你的那些標籤。

 

三、git分支

我們知道項目當中保存的文件是通過一次次的提交推送累積的。每次提交會創建一個提交對象,該提交對象中包含一個指向暫存內容快照的指針,以及指向父對象的指針。首次提交產生的提交對象沒有父對象,之後每次提交產生的提交對象都會把前一個提交對象當做父對象,而由多個分支合併產生的提交對象有多個父對象。

Git 的分支,其實本質上僅僅是指向提交對象的可變指針。 Git 的默認分支名字是 master。 在多次提交操作之後,你其實已經有一個指向最後那個提交對象的 master 分支。 它會在每次的提交操作中自動向前移動。

 

分支創建

git branch testing

git只是爲你在當前所在的提交對象上創建了一個可以移動的新的指針,git branch 命令僅僅 創建 一個新分支,並不會自動切換到新分支中去。

兩個指向相同提交歷史的分支。


分支切換

git有一個名爲 HEAD 的特殊指針,指向當前所在的本地分支(項目默認初始分支爲master,所以HEAD一開始是指向master分支的)。

HEAD 指向當前所在的分支。

可以使用 git log 命令查看各個分支當前所指的對象。 提供這一功能的參數是 --decorate

git log --oneline --decorate

要切換到一個已存在的分支,需要使用 git checkout 命令。

 git checkout testing

這樣 HEAD 就指向 testing 分支了。

我們也可以利用checkout新建分支的同時切換到該分支

 git checkout -b testing2

 

通過HEAD指針切換不同的分支工作,項目就會產生分叉。

項目分叉歷史。

我們可以使用 git log 命令查看分叉歷史。 運行 git log --oneline --decorate --graph --all ,它會輸出你的提交歷史、各個分支的指向以及項目的分支分叉情況。

git log --oneline --decorate --graph --all

查看分支

查看本地分支

git branch

查看所有分支(包括遠程分支)

git branch -a

查看本地分支最後一次的提交

git branch -v

合併分支

當我們在新建的工作分支上修復了bug或者加入了新的內容時,可以將其合併到主分支上,首先切換到主分支,然後利用git merge命令進行合併。

git checkout master
git merge testing

刪除分支

git branch -d testing

克隆指定分支

git clone -b testing https://github.com/528405176/hello-world

刪除遠程分支

git push --delete origin testing

重命名本地分支

git branch -m testing newtest

解決本地倉庫與遠程倉庫不一致問題

pull遠程倉庫

git pull origin

然後和本地倉庫合併

git merge origin master

最後提交

git push origin master

參考資料:

https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA%8E%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章