Git 介紹與經常使用命令

Git

1、Git是什麼?

  • Git是一個開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。
  • Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。
  • Git 與經常使用的版本控制工具 CVS, Subversion 等不一樣,它採用了分佈式版本庫的方式,沒必要服務器端軟件支持。

2、Git與SVN區別

GIT不只僅是個版本控制系統,它也是個內容管理系統(CMS),工做管理系統等。html

若是你是一個具備使用SVN背景的人,你須要作必定的思想轉換,來適應GIT提供的一些概念和特徵。 Git 與 SVN 區別點:java

  1. GIT是分佈式的,SVN不是:這是GIT和其它非分佈式的版本控制系統,例如SVN,CVS等,最核心的區別。
  2. GIT把內容按元數據方式存儲,而SVN是按文件:全部的資源控制系統都是把文件的元信息隱藏在一個相似.svn,.cvs等的文件夾裏。
  3. GIT分支和SVN的分支不一樣:分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。
  4. GIT沒有一個全局的版本號,而SVN有:目前爲止這是跟SVN相比GIT缺乏的最大的一個特徵。
  5. GIT的內容完整性要優於SVN:GIT的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時下降對版本庫的破壞。

3、Git快速入門

Git官網:git-scm.comgit

Git完整命令手冊:git-scm.com/docsgithub

Git命令手冊(pdf版):github-git-cheat-sheet.pdf算法

Git簡明指南:git-guideshell

4、Git安裝

在使用Git前咱們須要先安裝 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平臺上運行。 Git 各平臺安裝包下載地址爲:git-scm.com/downloads編程

5、Git配置

Git 提供了一個叫作 git config 的工具,專門用來配置或讀取相應的工做環境變量。vim

5.1 配置文件的存儲位置

這些環境變量,決定了 Git 在各個環節的具體工做方式和行爲。這些變量能夠存放在如下三個不一樣的地方:服務器

  • /etc/gitconfig 文件:系統中對全部用戶都廣泛適用的配置。若使用 git config 時用 --system 選項,讀寫的就是這個文件。
  • ~/.gitconfig 文件:用戶目錄下的配置文件只適用於該用戶。若使用 git config 時用 --global 選項,讀寫的就是這個文件。
  • 當前項目的 Git 目錄中的配置文件(也就是工做目錄中的 .git/config 文件):這裏的配置僅僅針對當前項目有效。每個級別的配置都會覆蓋上層的相同配置,因此 .git/config 裏的配置會覆蓋 /etc/gitconfig 中的同名變量。

在 Windows 系統上,Git 會找尋用戶主目錄下的 .gitconfig 文件。主目錄即 $HOME 變量指定的目錄,通常都是 C:\Users$USER。此外,Git 還會嘗試找尋 /etc/gitconfig 文件,只不過看當初 Git 裝在什麼目錄,就以此做爲根目錄來定位。網絡

5.2 查看git的版本信息

查看git的版本信息:

git --version
複製代碼

5.3 配置用戶信息

當Git安裝完成後首先要作的事情是配置我的的用戶名稱和電子郵件地址。這是很是重要的,由於每次Git提交都會使用該信息。它被永遠的嵌入到了你的提交中:

git config --global user.name 'user_name'
git config --global user.email 'user_email'
複製代碼

具體可參考 Git Configuration

5.4 配置文本編輯器

設置Git默認使用的文本編輯器, 通常可能會是 Vi 或者 Vim。若是你有其餘偏好,好比 Emacs 的話,能夠從新設置:

git config --global core.editor emacs
複製代碼

5.5 配置差別分析工具

還有一個比較經常使用的是,在解決合併衝突時使用哪一種差別分析工具。好比要改用 vimdiff 的話:

git config --global merge.tool vimdiff
複製代碼

5.6 查看配置信息

要檢查已有的配置信息,可使用 git config --list 命令:

git config --list
複製代碼

有時候會看到重複的變量名,這是由於Git從不一樣的的配置文件中(例如:/etc/gitconfig以及~/.gitconfig)讀取相同的變量名。在這種狀況下,對每一個惟一的變量名,Git使用最後的那個值。

也能夠直接查閱某個環境變量的設定,使用以下命令 git config {key}:

git config user.name
複製代碼

也能夠直接查看某個配置文件的配置信息:

git config --global -l
or
git config --system -l
複製代碼

5.7 git 配置文件

  1. 系統級文件 $(prefix)/etc/gitconfig,本文即 /usr/etc/gitconfig 文件。 git config --system 用來指定讀寫系統級文件。初始不存在,若不存在則無影響。
  2. 用戶級文件 ~/.gitconfig git config --global 指定只操做用戶級文件。初始不存在,若不存在則無影響。
  3. Repository 級文件 .git/config git config --local 對寫操做,則只寫入 Repository 級文件(默認行爲);對讀操做,則只從 Repository 級文件讀。
  4. git config --file config-file 則指定 config-file。

5.8 清除認證信息

git config --global --unset credential.helper
or
git config --system --unset credential.helper
複製代碼

上面的命令能夠解決 remote: HTTP Basic: Access denied 錯誤。

5.9 保存認證信息

git config --local credential.helper store
or
git config --system credential.helper store
複製代碼

上面的命令能夠解決每次提交都要輸入用戶名和密碼的問題。具體可參考 Git Credential Storage

6、Git經常使用命令

6.1 建立代碼倉庫

6.1.1 git init

git init 的命令格式爲:

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

第一步:建立一個代碼倉庫很是簡單,首先,選擇一個合適的地方,建立一個空目錄:

mkdir repository
cd repository
pwd
複製代碼

mkdir命令用於建立目錄,cd命令用於進入目錄,pwd命令用於顯示當前目錄。 第二步,經過git init命令把這個目錄變成Git能夠管理的倉庫或者經過git init <directory>命令直接指定一個目錄做爲Gi倉庫:

git init
git init <directory>
複製代碼

Git瞬間就把倉庫建好了,並且告訴你是一個空的倉庫(empty Git repository),細心的讀者能夠發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裏面的文件,否則改亂了,就把Git倉庫給破壞了。若是你沒有看到.git目錄,那是由於這個目錄默認是隱藏的,用ls -ah命令就能夠看見。

6.1.2 git clone

git clone 的命令格式爲:

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]
      [--recurse-submodules] [--[no-]shallow-submodules]
      [--jobs <n>] [--] <repository> [<directory>]
複製代碼

克隆到當前目錄,可使用如下命令格式:

git clone <repository>
複製代碼

若是咱們須要克隆到指定的目錄,可使用如下命令格式:

git clone <repository> <directory>
複製代碼

參數說明:

  • repository:Git 倉庫。
  • directory:本地目錄。

6.2 添加暫存區

git add 的命令格式爲:

git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
      [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
      [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing]
      [--chmod=(+|-)x] [--] [<pathspec>…​]
複製代碼

git add命令能夠在提交以前屢次執行。它只在運行git add命令時添加指定文件的內容; 若是但願隨後的更改包含在下一個提交中,那麼必須再次運行git add將新的內容添加到索引。默認狀況下,git add命令不會添加忽略的文件。

6.2.1 基本用法

git add [path]
複製代碼

一般是經過git add [path]的形式把[path]添加到索引庫中,[path]能夠是文件也能夠是目錄。 git不只能判斷出[path]中,修改(不包括已刪除)的文件,還能判斷出新添的文件,並把它們的信息添加到索引庫中。

6.2.2 經常使用命令

git add .               # 將全部修改添加到暫存區
git add *Presenter      # 將以Presenter結尾的文件的全部修改添加到暫存區
git add Base*           # 將全部以Base開頭的文件的修改添加到暫存區(例如:BaseActivity.java,BaseFragment.java)
git add Model?          # 將以Model開頭且後面只有一位的文件的修改添加到暫存區(例如:Model1.java,ModelA.java)
git add model/*.java    # 將model目錄及其子目錄下全部*.java文件的修改添加到暫存區
複製代碼

6.3 代碼提交

git commit 的命令格式爲:

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
       [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
       [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
       [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
       [--date=<date>] [--cleanup=<mode>] [--[no-]status]
       [-i | -o] [-S[<keyid>]] [--] [<file>…​]
複製代碼

git commit命令將索引的當前內容與描述更改的用戶和日誌消息一塊兒存儲在新的提交中。

6.3.1 提交暫存區到本地倉庫區

git commit -m [message]
複製代碼

6.3.2 將未添加到暫存區的文件,同時提交到本地倉庫區

git commit –am <message>
git commit –a –m <message>
複製代碼

6.3.3 提交暫存區的指定文件到倉庫區

git commit <file1> <file2> ... -m <message>
複製代碼

6.3.4 提交時顯示全部diff信息

git commit -v
複製代碼

6.3.5 修改最近一次提交

git commit --amend
複製代碼

6.3.6 修改最近一次提交,並改寫上一次commit的提交信息

git commit --amend -m <message>
複製代碼

6.4 分支管理

git branch 的命令格式爲:

git branch [--color[=<when>] | --no-color] [-r | -a]
    [--list] [-v [--abbrev=<length> | --no-abbrev]]
    [--column[=<options>] | --no-column] [--sort=<key>]
    [(--merged | --no-merged) [<commit>]]
    [--contains [<commit]] [--no-contains [<commit>]]
    [--points-at <object>] [--format=<format>] [<pattern>…​]
git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch --unset-upstream [<branchname>]
git branch (-m | -M) [<oldbranch>] <newbranch>
git branch (-d | -D) [-r] <branchname>…
git branch --edit-description [<branchname>]
複製代碼

git branch命令用於列出,建立或刪除分支。

6.4.1 列出全部本地分支

git branch
複製代碼

6.4.2 列出全部遠程分支

git branch -r
複製代碼

6.4.3 列出全部本地分支和遠程分支

git branch -a
複製代碼

6.4.4 新建一個分支,但依然停留在當前分支

git branch <branch-name>
複製代碼

6.4.5 新建一個分支,並切換到該分支

git checkout -b <branch-name>
複製代碼

git checkout 命令加上 -b 參數表示建立並切換,至關於如下兩條命令:

git branch <branch-name>
git checkout <branch-name>
複製代碼

6.4.6 新建一個分支,指向指定commit

git branch <branch> <commit>
複製代碼

6.4.7 新建一個分支,與指定的遠程分支創建追蹤關係

git branch --track <branch> <remote-branch>
複製代碼

6.4.8 切換到指定分支,並更新工做區

git checkout <branch-name>
複製代碼

6.4.9 切換到上一個分支

git checkout -
複製代碼

6.4.10 創建追蹤關係,在現有分支與指定的遠程分支之間

git branch --set-upstream <branch> <remote-branch>
複製代碼

6.4.11 合併指定分支到當前分支

git merge <branch>
複製代碼

6.4.12 選擇一個commit,合併進當前分支

git cherry-pick <commit>
複製代碼

6.4.13 刪除本地分支

git branch -d <branch-name>
複製代碼

6.4.14 刪除遠程分支

git push origin :<branch-name>
或
git push origin --delete <branch-name>
複製代碼

6.5 標籤管理

git tag 的命令格式爲:

git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>]
    <tagname> [<commit> | <object>]
git tag -d <tagname>…
git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]
    [--points-at <object>] [--column[=<options>] | --no-column]
    [--create-reflog] [--sort=<key>] [--format=<format>]
    [--[no-]merged [<commit>]] [<pattern>…]
git tag -v [--format=<format>] <tagname>…

複製代碼

git tag命令用於建立,列出,刪除或驗證使用GPG簽名的標籤對象。

6.5.1 列出全部標籤

git tag
複製代碼

6.5.2 新建一個標籤在當前commit

git tag <tag-name>
複製代碼

6.5.3 新建一個標籤在指定commit

git tag <tag-name> <commit>
複製代碼

6.5.4 新建一個帶標籤信息的標籤在當前commit

git tag -a <tag-name> -m [message]
複製代碼

6.5.5 刪除本地標籤

git tag -d <tag-name>
複製代碼

6.5.6 刪除遠程標籤

方法一:直接刪除遠程標籤:

git push origin --delete tag <tag-name>
複製代碼

方法二:先刪除本地標籤,再刪除遠程標籤:

git tag -d <tag-name>
git push origin :refs/tags/<tag-name>
複製代碼

6.5.7 查看標籤信息

git show <tag-name>
複製代碼

6.5.8 推送某個標籤到遠程

git push origin <tag-name>
複製代碼

6.5.9 一次性推送全部還沒有推送到遠程的本地標籤

git push origin --tags
複製代碼

6.6 查看信息

6.6.1 查看Git版本號

git --version
複製代碼

6.6.2 顯示有變動的文件

git status
複製代碼

6.6.3 顯示當前分支的提交歷史記錄

下表介紹了一些 git log 命令支持的一些經常使用的選項及其釋義:

選項 說明
-p 按補丁格式顯示每一個更新之間的差別。
--word-diff 按 word diff 格式顯示差別。
--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(後跟指定格式)。
--oneline --pretty=oneline --abbrev-commit 的簡化用法。

默認不用任何參數的話,git log 會按提交時間列出全部的更新,最近的更新排在最上面。能夠看到,每次更新都有一個 SHA-1 校驗和、做者的名字和電子郵件地址、提交時間,最後縮進一個段落顯示提交說明。

git log
複製代碼

git log 有許多選項能夠幫助你搜尋感興趣的提交,接下來咱們介紹些最經常使用的。

咱們經常使用 -p 選項展開顯示每次提交的內容差別,用 -<n> 則僅顯示最近的兩次更新:

git log -p -2
複製代碼

該選項除了顯示基本信息以外,還在附帶了每次 commit 的變化。當進行代碼審查,或者快速瀏覽某個搭檔提交的 commit 的變化的時候,這個參數就很是有用了。

--stat,僅顯示簡要的增改行數統計。

git log --stat
複製代碼

--pretty 選項,能夠指定使用徹底不一樣於默認格式的方式展現提交歷史。好比用 oneline 將每一個提交放在一行顯示,這在提交數很大時很是有用。另外還有 shortfullfuller 能夠用,展現的信息或多或少有些不一樣,後面也能夠指定提交歷史的次數(好比:-<n> ),具體展現效果請本身動手實踐一下。

git log --pretty=oneline
複製代碼

format選項,能夠定製要顯示的記錄格式,這樣的輸出便於後期編程提取分析。

git log --pretty=format:"%h - %an, %ar : %s"
複製代碼

下表列出了經常使用的格式佔位符寫法及其表明的意義:

選項 說明
%H 提交對象(commit)的完整哈希字串
%h 提交對象的簡短哈希字串
%T 樹對象(tree)的完整哈希字串
%t 樹對象的簡短哈希字串
%P 父對象(parent)的完整哈希字串
%p 父對象的簡短哈希字串
%an 做者(author)的名字
%ae 做者的電子郵件地址
%ad 做者修訂日期(--date= 制定的格式)
%aD 做者修訂日期(RFC2822格式)
%ar 做者修訂日期(相對格式,如:1 day ago)
%at 做者修訂日期(UNIX timestamp)
%ai 做者修訂日期(ISO 8601 格式)
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期 (--date= 制定的格式)
%cD 提交日期(RFC2822格式)
%cr 提交日期(相對格式,如:1 day ago)
%ct 提交日期(UNIX timestamp)
%ci 提交日期(ISO 8601 格式)
%s 提交說明

除了定製輸出格式的選項以外,git log 還有許多很是實用的限制輸出長度的選項,也就是隻輸出部分提交信息。用 --since 和 --until選項顯示按照時間做限制的提交,好比說具體的某一天(「2008-01-15」),或者是多久之前(「2 years 1 day 3 minutes ago」)。用 --author 選項顯示指定做者的提交,用 --grep 選項搜索提交說明中的關鍵字。 下表還列出了其餘經常使用的相似選項:

選項 說明
-(n) 僅顯示最近的 n 條提交
--since, --after 僅顯示指定時間以後的提交
--until, --before 僅顯示指定時間以前的提交
--author 僅顯示指定做者相關的提交
--committer 僅顯示指定提交者相關的提交

6.7 遠程同步

6.7.1 顯示全部遠程倉庫

git remote -v
複製代碼

6.7.2 獲取某個遠程主機的所有更新

git fetch <remote>
複製代碼

6.7.3 獲取某個遠程主機的某個分支的更新

git fetch <remote> <branch>
複製代碼

好比,取回origin主機的master分支的更新:

git fetch origin master
複製代碼

6.7.4 顯示某個遠程倉庫的信息

git remote show <remote>
複製代碼

6.7.5 獲取某個遠程主機的某個分支的更新與當前分支合併

git pull <remote> <remote-branch>
複製代碼

好比,要取回origin主機的dev分支,與當前分支合併:

git pull origin dev
複製代碼

上面命令表示,取回origin/dev分支,再與當前分支合併。實質上,這等同於先作git fetch,再執行git merge。

git fetch origin
git merge origin/dev
複製代碼

6.7.6 獲取某個遠程主機的某個分支的更新與本地的某個分支合併

git pull <remote> <remote-branch>:<local-branch>
複製代碼

好比,要取回origin主機的dev分支,與本地的master分支合併:

git pull origin dev:master
複製代碼

6.7.7 將本地的當前分支自動與對應的遠程主機」追蹤分支」進行合併

git pull <remote>
複製代碼

6.7.8 將當前分支推送到遠程主機的對應分支

git push
複製代碼

6.7.9 將當前分支到遠程主機的對應分支

git push <remote>
複製代碼

6.7.10 將本地指定分支到遠程主機的對應分支

git push <remote> <branch>
複製代碼

6.7.11 強行推送當前分支到遠程主機的對應分支(忽略衝突)

git push <remote> --force
複製代碼

6.7.12 推送全部分支到遠程倉庫

git push <remote> --all
複製代碼

6.8 代碼回滾

6.8.1 恢復暫存區的指定文件到工做區

git checkout <file-name>
複製代碼

6.8.2 恢復某個commit的指定文件到暫存區和工做區

git checkout <commit> <file-name>
複製代碼

6.8.3 恢復暫存區的全部文件到工做區

git checkout .
複製代碼

6.8.4 回滾添加操做

git reset
複製代碼

6.8.5 回滾最近一次提交

git reset --soft HEAD^
複製代碼

6.8.6 永久刪除最後幾個提交

git reset --hard HEAD~3
複製代碼

7、 Command line instructions

7.1 Git global setup

git config --global user.name "user-name"
git config --global user.email "user-email"
複製代碼

7.2 Create a new repository

git clone <remote-repository>
cd <directory>
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
複製代碼

7.3 Existing folder

cd <existing-folder>
git init
git remote add origin <remote-repository>
git add .
git commit -m "Initial commit"
git push -u origin master
複製代碼

7.4 Existing Git repository

cd <existing-repository>
git remote rename origin old-origin
git remote add origin <remote-repository>
git push -u origin --all
git push -u origin --tags
複製代碼

8、致謝

  1. Git教程
  2. 易百教程
  3. 菜鳥教程
相關文章
相關標籤/搜索