在實際開發中,會使用git做爲版本控制工具來完成團隊協做。所以,對基本的git操做指令進行總結是十分有必要的,本文對一些術語或者理論基礎,不從新碼字,能夠參考廖雪峯老師的博文html
git的通用操做流程以下圖(來源於網絡)java
主要涉及到四個關鍵點:git
更細節的來看:github
平常開發時代碼實際上放置在工做區中,也就是本地的XXX.java這些文件,經過add等這些命令將代碼文教提交給暫存區(Index/Stage),也就意味着代碼全權交給了git進行管理,以後經過commit等命令將暫存區提交給master分支上,也就是意味打了一個版本,也能夠說代碼提交到了本地倉庫中。另外,團隊協做過程當中天然而然還涉及到與遠程倉庫的交互。vim
所以,通過這樣的分析,git命令能夠分爲這樣的邏輯進行理解和記憶:bash
git管理配置的命令;服務器
幾個核心存儲區的交互命令:網絡
工做區與暫存區的交互;app
暫存區與本地倉庫(分支)上的交互;編輯器
本地倉庫與遠程倉庫的交互。
查詢配置信息
git config --list
;git config --local --list
;git config --global --list
;git config --system --list
;第一次使用git,配置用戶信息
git config --global user.name "your name"
;git config --global user.email "youremail@github.com"
;其餘配置
git config --global merge.tool vimdiff
;git config --global color.ui auto
;git config --global core.editor vi
;新建倉庫
git init
;git clone <url>
,如:git clone git://github.com/wasd/example.git;克隆項目時若是想定義新的項目名,能夠在clone命令後指定新的項目名:git clone git://github.com/wasd/example.git mygit
;提交
git add .
git add <file1> <file2> ...
;git add [dir]
;撤銷
git rm <file1> <file2>
;git rm --cached <file>
;git reset HEAD <file>...
;git checkout --<file>
。要肯定上一次對文件的修改再也不須要,若是想保留上一次的修改以備之後繼續工做,可使用stashing和分支來處理;git stash
;git stash list
;git stash apply
,若是想應用更早的儲藏:git stash apply stash@{2}
;從新應用被暫存的變動,須要加上--index
參數:git stash apply --index
;git stash drop stash{0}
;若是使用pop命令不只能夠從新應用儲藏,還能夠馬上從堆棧中清除:git stash pop
;git stash show -p stash@{0} | git apply -R
;一樣的,若是你沒有指定具體的某個儲藏,Git 會選擇最近的儲藏:git stash show -p | git apply -R
;更新文件
git mv [file-original] [file-renamed]
;查新信息
git status
;git diff <file-name>
;提交文件到版本庫
git commit -m "commit_info"
;git commit -a -m "commit_info"
;git commit --amend
;查看信息
git diff --cached
;git diff <file-name> --cached
;-p
展開每次提交的內容差別,用-2
顯示最近的兩次更新,如git log -p -2
;打標籤
Git 使用的標籤有兩種類型:輕量級的(lightweight)和含附註的(annotated)。輕量級標籤就像是個不會變化的分支,實際上它就是個指向特定提交對象的引用。而含附註標籤,其實是存儲在倉庫中的一個獨立對象,它有自身的校驗和信息,包含着標籤的名字,電子郵件地址和日期,以及標籤說明,標籤自己也容許使用 GNU Privacy Guard (GPG) 來簽署或驗證。通常咱們都建議使用含附註型的標籤,以便保留相關信息;固然,若是隻是臨時性加註標籤,或者不須要旁註額外信息,用輕量級標籤也沒問題。
git tag
;git tag -l "v1.4.2.*"
;-a
參數,如git tag -a v1.4 -m "my version 1.4"
;git show v1.4
;-s
參數:git tag -s v1.5 -m "my signed 1.5 tag"
;git tag -v <tag-name>
,如git tag -v v1.5
;-a
,-s
以及-m
選項都不須要,直接給出標籤名字便可,如git tag v1.5
;git push origin <tag-name>
,如git push origin v1.5
;git push origin --tags
;分支管理
git branch <branch-name>
,如git branch testing
;git checkout <branch-name>
,如git checkout testing
;git checkout -b <branch-name>
;git branch -d <branch-name>
;git merge <branch-name>
;git branch
;git branch -v
;git branch --merged
;git branch --no-merged
;git merge <remote-name>/<branch-name>
,如git merge origin/serverfix
;若是是單線的歷史分支不存在任何須要解決的分歧,只是簡單的將HEAD指針前移,因此這種合併過程能夠稱爲快進(Fast forward),而若是是歷史分支是分叉的,會以當前分叉的兩個分支做爲兩個祖先,建立新的提交對象;若是在合併分支時,遇到合併衝突須要人工解決後,再才能提交;:git checkout -b <branch-name> <remote-name>/<branch-name>
,如git checkout -b serverfix origin/serverfix
;git push
。該命令會自動判斷應該向遠程倉庫中的哪一個分支推送數據;在跟蹤分支上合併遠程分支:git pull
;git rebase <rebase-branch> <branch-name>
,如git rebase master server
,將特性分支server提交的改變在基底分支master上重演一遍;使用rebase操做最大的好處是像在單個分支上操做的,提交的修改歷史也是一根線;若是想把基於一個特性分支上的另外一個特性分支變基到其餘分支上,可使用--onto
操做:git rebase --onto <rebase-branch> <feature branch> <sub-feature-branch>
,如git rebase --onto master server client
;使用rebase操做應該遵循的原則是:一旦分支中的提交對象發佈到公共倉庫,就千萬不要對該分支進行rebase操做;git remote
;在克隆完每一個遠程倉庫後,遠程倉庫默認爲origin
;加上-v
的參數後,會顯示遠程倉庫的url
地址;git remote add [remote-name] [url]
,好比:git remote add example git://github.com/example/example.git
;git fetch [remote-name]
,如git fetch origin
;使用fetch只是將遠端數據拉到本地倉庫,並不自動合併到當前工做分支,只能人工合併。若是設置了某個分支關聯到遠程倉庫的某個分支的話,可使用git pull
來拉去遠程分支的數據,而後將遠端分支自動合併到本地倉庫中的當前分支;git push [remote-name] [branch-name]
,如git push origin master
;若是想將本地分支推送到遠程倉庫的不一樣名分支:git push <remote-name> <local-branch>:<remote-branch>
,如git push origin serverfix:awesomebranch
;若是想刪除遠程分支:git push [romote-name] :<remote-branch>
,如git push origin :serverfix
。這裏省略了本地分支,也就至關於將空白內容推送給遠程分支,就等於刪掉了遠程分支。git remote show origin
;git remote rename [old-name] [new-name]
,如git remote rename origin org
;git remote rm [remote-name]
;通常咱們總會有些文件無需歸入 Git 的管理,也不但願它們總出如今未跟蹤文件列表。一般都是些自動生成的文件,好比日誌文件,或者編譯過程當中建立的臨時文件等。咱們能夠建立一個名爲 .gitignore 的文件,列出要忽略的文件模式。以下例:
## 此爲註釋 – 將被 Git 忽略
## 忽略全部 .a 結尾的文件
*.a
## 但 lib.a 除外
!lib.a
## 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
/TODO
## 忽略 build/ 目錄下的全部文件
build/
## 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
## 忽略 doc/ 目錄下全部擴展名爲 txt 的文件
doc/**/*.txt
複製代碼
參考資料