Git 之三 常用命令:倉庫創建、提交、分支等

常用命令

  雖然 Git 同時提供了 GUI 界面 和 Bash,但是,GUI 界面的功能相對來說還是有點簡陋的。要想熟練掌握 Git 的使用,還是需要了解 Git 一系列的命令!
  Git 命令還是比較多的,後面我們以實際用到的功能來介紹。有個需要注意的地方就是命令的參數:參數分爲簡寫和全稱兩種方式,但是功能完全相同! 例如:git clone -b xxxxxgit clone --branch xxxxx 其實是一模一樣的,參數 --branch 簡寫爲 -b!但是,不是每一個參數都有簡寫,且在不同命令下,可能存在相同的簡寫,但是功能含義可能不同。下圖是 Git 官網對於 Git 命令的分類列表
在這裏插入圖片描述
其中,紅色框中的是我們平時常用的一些命令。

初始化倉庫

  初始化倉庫有兩種方式:本地新建克隆遠程倉庫,分別對應 git initgit clone 這兩個命令!創建倉庫後,會在指定的目錄下生成一個 .git 的文件夾,其中存儲 Git 管理我們代碼需要的各種配置。

本地新建

  創建本地倉庫相對比較簡單,在我們想要建立倉庫的文件夾中打開 Bash 命令框,執行 git init 命令即可。如下圖:
在這裏插入圖片描述
完整的 git init 命令如下:

git init [-q | --quiet] [--bare] [--template=<template_directory>]
	  [--separate-git-dir <git dir>]
	  [--shared[=<permissions>]] [directory]

常用參數如下:

  • -q、--quiet:僅打印錯誤和警告消息; 所有其他輸出都將被抑制。
  • --bare:創建一個裸存儲庫。 如果未設置 GIT_DIR 環境,則將其設置爲當前工作目錄。
  • --template=<template_directory>:指定將使用的模板的目錄
  • [directory]:用於給出 Git 配置文件的路徑(含名稱)。如果不指定則表示當前目錄。默認生成名字爲 .git 的目錄

執行命令成功之後,在當前目錄下生成一個名爲 .git 的隱藏文件夾,Git 的所有配置文件就存在該文件夾中。接下來就可以在此文件夾(倉庫)中,增刪改自己的文件了。
  使用 git init 初始化本地倉庫之後,本地倉庫是空的,連一個分支都是沒有的!如果此時進行創建分支則會報錯。如下圖所示:
在這裏插入圖片描述
[我們也可以打開 .git 目錄進行查看,會發現暫時沒有 master 分支。如下圖所示:
在這裏插入圖片描述
當我們提交一次修改之後,Git 會默認生成一個名爲 master 的分支。
  分支的默認名字 master,在 Git 中並沒有任何特別的含義一樣。 同時 “master” 是當你運行 git init 時默認的起始分支名字,原因僅僅是它的廣泛使用。
  以上方式創建的本地倉庫只能本地使用,其沒有與任何遠程倉庫關聯!如果要關聯遠程倉庫,則必須使用 git remote 命令進行關聯。

關聯遠程倉庫

  Git 通常也會有個遠程倉庫。使用 git init 方式創建的本地倉庫只能本地使用,其沒有與任何遠程倉庫關聯!遠程倉庫的增、刪、改、查都是通過 git remote 命令來實現。
  在 Git 中,會爲關聯的遠程倉庫創建一個本地名稱,默認不顯示指定時爲 origin,這樣我們在與遠程倉庫通信時,直接使用本地名稱就可以了!例如,我們要將代碼推送到以上關聯的遠程倉庫,直接使用 git push origin 就可以了。以下是一些常用的命令參數

  • git remote -v:參數 -v == --verbose。用於列出關聯的遠程倉庫,格式爲:本地名稱 + 遠程倉庫地址。如下圖:
    在這裏插入圖片描述
  • git remote add:命令格式:git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>。關聯一個遠程倉庫 <url>,本地名稱爲 <name>。
    在這裏插入圖片描述
  • git remote rename:命令格式:git remote rename <old> <new>。將名爲 的遠程倉庫名重命名爲。
  • git remote rm:命令格式:git remote remove <name>。其中,參數 --rm--remove 的簡寫。刪除關聯的名爲 <name> 的遠程倉庫的關聯信息。

  與遠程倉庫相關的配置,均位於 工作目錄下/.git/config 文件中,這是個文本文件,我們也可以直接打開改文件進行修改。
在這裏插入圖片描述
  還有一點就是,一個本地倉庫可以關聯多個遠程倉庫! 如下圖所示是增加了一個遠程倉庫之後的情況。
在這裏插入圖片描述
如上所示,建議在關聯遠程倉庫的時候,指定一個本地名稱,這樣我們就可以很容易的知道關聯情況。這個在我們往遠程倉庫提交代碼是很有用處!

  更新詳細的說明,見獨立的博文《Git 之五 通信協議(HTTPS、SSH、Git)、使用遠程倉庫(GitHub、GitLab、Gitee等)》!

遠程倉庫名字 “origin” 與分支名字 “master” 一樣,在 Git 中並沒有任何特別的含義一樣。 同時 “master” 是當你運行 git init 時默認的起始分支名字,原因僅僅是它的廣泛使用,“origin” 是當你運行 git clone 時默認的遠程倉庫名字。 如果你運行 git clone -o Gitx,那麼你默認的遠程分支名字將會是 Gitx/master。

克隆遠程倉庫

  同樣也非常簡單,在我們想要保存遠程倉庫的文件夾中打開 Bash 命令框,執行 git clone https://github.com/ZCShou/N_W_Z_1.git命令即可(注意將以上倉庫地址換爲自己的)。如下圖:
在這裏插入圖片描述
  該命令將遠程存儲庫克隆到新創建的目錄中,併爲本地存儲庫中的每個分支創建遠程跟蹤分支,並創建和檢出從遠程存儲庫當前活動的分支派生出來的初始分支。該命令的完整格式如下:

git clone [--template=<template_directory>]
	  [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
	  [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
	  [--dissociate] [--separate-git-dir <git dir>]
	  [--depth <depth>] [--[no-]single-branch] [--no-tags]
	  [--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
	  [--[no-]remote-submodules] [--jobs <n>] [--] <repository>
	  [<directory>]

該命令常用參數如下:

  • -o <name>、--origin <name>:指定遠程倉庫的本地名稱爲 <name>,而不使用默認的 origin。
  • -b <name>、--branch <name>:用於克隆名爲 <name> 的遠程分支,而不是以 HEAD 創建分支。在非空的倉庫中執行該命令,表示將指定的分支同步到當前倉庫!
  • <repository>:要克隆的(可能是遠程的)存儲庫。
  • <directory>:指定保存克隆的倉庫的本地目錄名稱。 如果沒有明確給出目錄,則使用遠程庫名字在當前目錄。只有當目錄爲空時,才允許克隆到現有目錄。

克隆之後,默認會使用沒有參數的 git fetch 將更新所有遠程跟蹤分支,並且沒有參數的 git pull 將另外將遠程主分支合併到當前主分支中(如果有的話)。其中也會有個 .git 的文件夾!
  使用以上命令之後,本地倉庫就會和以上指定的遠程倉庫管理關聯,且會管理所有遠程分支。在 Git 中,會爲關聯的遠程倉庫創建一個本地名稱,不顯示指定時默認爲 origin。我們可以在以上命令中使用參數 --origin 本地名稱 來指定本地名稱(git clone --origin NWZ_xxx https://github.com/ZCShou/N_W_Z_1.git)。

分支

  使用分支意味着你可以把你的工作從開發主線上分離開來,以免影響開發主線。 Git 的一大特點就是對於分支的支持!Git 的分支可謂是難以置信的輕量級,它的新建操作幾乎可以在瞬間完成,並且在不同分支間切換起來也差不多一樣快。
Git 引入了一個概念:upstream。一個分支的 upstream,其實就是與遠程分支做關聯,告訴 Git,默認此分支爲推送及拉取的遠程分支的信息。如下圖所示:
在這裏插入圖片描述
  更新詳細的說明,見獨立的博文《Git 之三 分支管理》!

檢查狀態

  當我們修改了倉庫中的文件時,使用 git status 可以列出當前目錄所有還沒有被 Git 管理的文件和被 Git 管理且被修改但還未提交(git commit)的文件。

格式:$ git status <參數>

# git status命令一般不用加參數,可能用到的參數如下:
$ git status -s   # 將結果以簡短的形式輸出

如下圖所示:
在這裏插入圖片描述

DIFF

使用 git status 我們僅可以看到文件級別的更改,如果我們想要查看文件內部具體有哪些變動,則需要 git diff 命令。

git diff [<options>] [<commit>] [--] [<path>…​]
git diff [<options>] --cached [<commit>] [--] [<path>…​]
git diff [<options>] <commit> <commit> [--] [<path>…​]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path>

如下圖所示:
在這裏插入圖片描述

添加追蹤

  在我們修改了倉庫中的文件後,必須要將修改添加到 Git 中。使用 git add 命令要用於把我們要提交的文件的信息添加到索引庫中。

格式:$ git add <參數>  <path>          # 文件名或者路徑,支持通配符,多個文件可以用空格來隔開,省略<path>表示用 . (點表示當前目錄)

注意幾個參數的區別:
  $ git add .     # 監控文件內容修改(modified)以及新文件(new),但不包括被刪除的文件
  $ git add -u    # 僅監控已經被add的文件(即tracked file),他會將被修改的文件提交到暫存區。add -u 不會提交新文件(untracked file)
  $ git add -A    # 是上面兩個功能的合集,提交所有變化 等價於 git add *
  $ git add -i    # 交互式的方式進行添加

  $ git add -h    # 查看git add的幫助信息

如下圖所示:
在這裏插入圖片描述

提交修改

  使用 git commit 命令提交的是暫存區裏面的內容。

格式:$ git commit <參數> <-F file/ -m "msg" ...>

注意幾個參數的區別:
  $ git commit -m   # 提交說明。不用-m參數的話,git將調到一個文本編譯器(通常是vim)來讓你輸入提交的描述信息
  $ git commit -a   # -a 選項可只將所有被修改或者已刪除的且已經被git管理的文檔提交倒倉庫中。如果只是修改或者刪除了已被Git 管理的文檔,是沒必要使用git add 命令的。
  $ git commit --amend  #用來修復最近一次commit. 可以讓你合併你緩存區的修改和上一次commit, 而不是多出提交一個新的快照. 還可以用來編輯上一次的commit描述。注意:生成的commit是一個全新的commit, 之前的老的commit會從項目歷史中被刪除
    例如:忘記了add一個文件:先 git add 忘記的文件,然後使用 git commit --amend --no-edit # 描述會是上一次commit的描述, --no-edit能讓我們修復commit,而且不要修改commit描述.
    再例如:又或者我們發現在提交時忘記使用 -a 選項,導致 Changes bu not updated 中的內容沒有被提交:直接使用 git commit --amend -a 即可

如下圖所示:
在這裏插入圖片描述

查看記錄

  使用 git log 命令列出歷史提交記錄如下:

git log -p -2 # -p 選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新

如下圖所示:
在這裏插入圖片描述
也可以使用 git log --oneline 命令列出歷史提交記錄的精簡版,如下:
在這裏插入圖片描述
使用 git log --graph 命令查看歷史中什麼時候出現了分支、合併

git log --oneline --graph

如果只想查找指定用戶的提交日誌可以使用命令:git log --author=xxx

git log --author=Linus --oneline -5

如果你要指定日期,可以執行幾個選項:–since 和 --before,但是你也可以用 --until 和 --after,如下:

git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges

回退

  git reset 命令將當前的分支重設(reset)到指定的或者HEAD(默認,如果不顯示指定 commit,默認是 HEAD,即最新的一次提交)

格式:$ git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]

並且根據 [mode] 有可能更新 index 和 working directory。mode 的取值可以是 hard、soft、mixed、merged、keep。下面來詳細說明每種模式的意義和效果。

  • –hard:重設(reset) index和working directory,自從 <commit> 以來在 working directory 中的任何改變都被丟棄,並把HEAD指向<commit>。
  • –soft:index和working directory中的內容不作任何改變,僅僅把HEAD指向\ <commit>。這個模式的效果是,執行完畢後,自從 <commit> 以來的所有改變都會顯示在 git status 的 “Changes to be committed” 中。
  • –mixed:僅reset index,但是不 reset working directory。這個模式是默認模式,即當不顯示告知 git reset 模式時,會使用 mixed 模式。這個模式的效果是,working directory 中文件的修改都會被保留,不會丟棄,但是也不會被標記成"Changes to be committed",但是會打出什麼還未被更新的報告。

遠程倉庫

這部分見獨立博文《Git 之五 通信協議(HTTPS、SSH、Git)、使用遠程倉庫(GitHub、GitLab、Gitee等)

參考

  1. https://git-scm.com/docs
  2. https://www.cnblogs.com/yelbosh/p/7471979.html
  3. git的基本架構欣賞 https://zhuanlan.zhihu.com/p/38245039
  4. Git的原理簡介和常用命令 https://www.cnblogs.com/yelbosh/p/7471979.html
  5. git工作流程一覽 https://www.cnblogs.com/yinn/archive/2018/01/23/7641507.html
  6. http://blog.didispace.com/gitflow-info/
  7. https://nvie.com/posts/a-successful-git-branching-model/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章