GIT不只僅是個版本控制系統,它也是個內容管理系統(CMS),工做管理系統等。html
若是你是一個具備使用SVN背景的人,你須要作必定的思想轉換,來適應GIT提供的一些概念和特徵。 Git 與 SVN 區別點:java
Git官網:git-scm.comgit
Git完整命令手冊:git-scm.com/docsgithub
Git命令手冊(pdf版):github-git-cheat-sheet.pdf算法
Git簡明指南:git-guideshell
在使用Git前咱們須要先安裝 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平臺上運行。 Git 各平臺安裝包下載地址爲:git-scm.com/downloads編程
Git 提供了一個叫作 git config 的工具,專門用來配置或讀取相應的工做環境變量。vim
這些環境變量,決定了 Git 在各個環節的具體工做方式和行爲。這些變量能夠存放在如下三個不一樣的地方:服務器
在 Windows 系統上,Git 會找尋用戶主目錄下的 .gitconfig 文件。主目錄即 $HOME 變量指定的目錄,通常都是 C:\Users$USER。此外,Git 還會嘗試找尋 /etc/gitconfig 文件,只不過看當初 Git 裝在什麼目錄,就以此做爲根目錄來定位。網絡
查看git的版本信息:
git --version
複製代碼
當Git安裝完成後首先要作的事情是配置我的的用戶名稱和電子郵件地址。這是很是重要的,由於每次Git提交都會使用該信息。它被永遠的嵌入到了你的提交中:
git config --global user.name 'user_name'
git config --global user.email 'user_email'
複製代碼
具體可參考 Git Configuration
設置Git默認使用的文本編輯器, 通常可能會是 Vi 或者 Vim。若是你有其餘偏好,好比 Emacs 的話,能夠從新設置:
git config --global core.editor emacs
複製代碼
還有一個比較經常使用的是,在解決合併衝突時使用哪一種差別分析工具。好比要改用 vimdiff 的話:
git config --global merge.tool vimdiff
複製代碼
要檢查已有的配置信息,可使用 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
複製代碼
git config --global --unset credential.helper
or
git config --system --unset credential.helper
複製代碼
上面的命令能夠解決 remote: HTTP Basic: Access denied
錯誤。
git config --local credential.helper store
or
git config --system credential.helper store
複製代碼
上面的命令能夠解決每次提交都要輸入用戶名和密碼的問題。具體可參考 Git Credential Storage
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命令就能夠看見。
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
:本地目錄。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
命令不會添加忽略的文件。
git add [path]
複製代碼
一般是經過git add [path]
的形式把[path]
添加到索引庫中,[path]
能夠是文件也能夠是目錄。 git不只能判斷出[path]
中,修改(不包括已刪除)的文件,還能判斷出新添的文件,並把它們的信息添加到索引庫中。
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文件的修改添加到暫存區
複製代碼
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
命令將索引的當前內容與描述更改的用戶和日誌消息一塊兒存儲在新的提交中。
git commit -m [message]
複製代碼
git commit –am <message>
git commit –a –m <message>
複製代碼
git commit <file1> <file2> ... -m <message>
複製代碼
git commit -v
複製代碼
git commit --amend
複製代碼
git commit --amend -m <message>
複製代碼
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
命令用於列出,建立或刪除分支。
git branch
複製代碼
git branch -r
複製代碼
git branch -a
複製代碼
git branch <branch-name>
複製代碼
git checkout -b <branch-name>
複製代碼
git checkout
命令加上 -b
參數表示建立並切換,至關於如下兩條命令:
git branch <branch-name>
git checkout <branch-name>
複製代碼
git branch <branch> <commit>
複製代碼
git branch --track <branch> <remote-branch>
複製代碼
git checkout <branch-name>
複製代碼
git checkout -
複製代碼
git branch --set-upstream <branch> <remote-branch>
複製代碼
git merge <branch>
複製代碼
git cherry-pick <commit>
複製代碼
git branch -d <branch-name>
複製代碼
git push origin :<branch-name>
或
git push origin --delete <branch-name>
複製代碼
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簽名的標籤對象。
git tag
複製代碼
git tag <tag-name>
複製代碼
git tag <tag-name> <commit>
複製代碼
git tag -a <tag-name> -m [message]
複製代碼
git tag -d <tag-name>
複製代碼
方法一:直接刪除遠程標籤:
git push origin --delete tag <tag-name>
複製代碼
方法二:先刪除本地標籤,再刪除遠程標籤:
git tag -d <tag-name>
git push origin :refs/tags/<tag-name>
複製代碼
git show <tag-name>
複製代碼
git push origin <tag-name>
複製代碼
git push origin --tags
複製代碼
git --version
複製代碼
git status
複製代碼
下表介紹了一些 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
將每一個提交放在一行顯示,這在提交數很大時很是有用。另外還有 short
,full
和 fuller
能夠用,展現的信息或多或少有些不一樣,後面也能夠指定提交歷史的次數(好比:-<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 | 僅顯示指定提交者相關的提交 |
git remote -v
複製代碼
git fetch <remote>
複製代碼
git fetch <remote> <branch>
複製代碼
好比,取回origin主機的master分支的更新:
git fetch origin master
複製代碼
git remote show <remote>
複製代碼
git pull <remote> <remote-branch>
複製代碼
好比,要取回origin主機的dev分支,與當前分支合併:
git pull origin dev
複製代碼
上面命令表示,取回origin/dev分支,再與當前分支合併。實質上,這等同於先作git fetch,再執行git merge。
git fetch origin
git merge origin/dev
複製代碼
git pull <remote> <remote-branch>:<local-branch>
複製代碼
好比,要取回origin主機的dev分支,與本地的master分支合併:
git pull origin dev:master
複製代碼
git pull <remote>
複製代碼
git push
複製代碼
git push <remote>
複製代碼
git push <remote> <branch>
複製代碼
git push <remote> --force
複製代碼
git push <remote> --all
複製代碼
git checkout <file-name>
複製代碼
git checkout <commit> <file-name>
複製代碼
git checkout .
複製代碼
git reset
複製代碼
git reset --soft HEAD^
複製代碼
git reset --hard HEAD~3
複製代碼
git config --global user.name "user-name"
git config --global user.email "user-email"
複製代碼
git clone <remote-repository>
cd <directory>
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
複製代碼
cd <existing-folder>
git init
git remote add origin <remote-repository>
git add .
git commit -m "Initial commit"
git push -u origin master
複製代碼
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
複製代碼