Git是一個分佈式版本控制/軟件配置管理軟件,原來是linux內核開發者林納斯·託瓦茲(Linus Torvalds)爲了更好地管理linux內核開發而創立的。html
Git配置
git config --global user.name "javachen"
git config --global user.email "june.chan@foxmail.com"
git config --global color.ui true
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config -l # 列舉全部配置
用戶的git配置文件在~/.gitconfig
,個人配置:java
june@june-mint ~/workspace/snippets/dotfiles $ cat .gitconfig
[user]
email = june.chan@foxmail.com
name = javachen
[color]
ui = auto
[color "branch"]
current = yellow reverse
local = yellow
remote = green
[color "diff"]
meta = yellow bold
frag = magenta bold
old = red bold
new = green bold
[color "status"]
added = yellow
changed = green
untracked = cyan
[alias]
st = "status"
co = checkout
ls = "ls-files"
ci = commit
br = branch
rt = reset --hard
unstage = reset HEAD
uncommit = reset --soft HEAD^
l = log --pretty=oneline --abbrev-commit --graph --decorate
amend = commit --amend
who = shortlog -n -s --no-merges
g = grep -n --color -E
cp = cherry-pick -x
cb = checkout -b
[core]
filemode = true
Git經常使用命令
查看、幫助命令
git help <command> # 顯示command的help
git show # 顯示某次提交的內容
git show $id
查看提交記錄
git log
git log <file> # 查看該文件每次提交記錄
git log -p <file> # 顯示版本歷史,以及版本間的內容差別
git log -p -2 # 查看最近兩次詳細修改內容的diff
git log --stat # 查看提交統計信息
git log --since="6 hours" # 顯示最近6小時提交
git log --before="2 days" # 顯示2天前提交
git log -1 HEAD~3 # 顯示比HEAD早3個提交的那個提交
git log -1 HEAD^^^
git reflog # 查看操做記錄
添加、提交、刪除、找回,重置修改文件
git add <file> # 將工做文件修改提交到本地暫存區
git add . # 將全部修改過的工做文件提交暫存區
git co -- <file> # 拋棄工做區修改
git co . # 拋棄工做區修改
git co HEAD <file> # 拋棄工做目錄區中文件的修改
git co HEAD~3 # 回退三個版本
git ci <file>
git ci .
git ci -a # 將git add, git rm和git ci等操做都合併在一塊兒作
git ci -am "some comments"
git ci --amend # 修改最後一次提交記錄
git rm <file> # 從版本庫中刪除文件
git rm <file> --cached # 從版本庫中刪除文件,但不刪除文件
git mv <file1> <file2> # 重命名文件
git reset --hard HEAD^ # 恢復最近一次提交過的狀態,即放棄上次提交後的全部本次修改
git reset --hard <commit id> # 恢復到某一次提交的狀態
git reset HEAD <file> # 拋棄暫存區中文件的修改
git reset <file> # 從暫存區恢復到工做文件
git reset -- . # 從暫存區恢復到工做文件
git revert <$id> # 恢復某次提交的狀態,恢復動做自己也建立了一次提交對象
git revert HEAD # 恢復最後一次提交的狀態
查看文件diff
git diff <file> # 比較當前文件和暫存區文件差別
git diff
git diff <$id1> <$id2> # 比較兩次提交之間的差別
git diff <branch1> <branch2> # 在兩個分支之間比較
git diff --staged # 比較暫存區和版本庫差別
git diff --cached # 比較暫存區和版本庫差別
git diff --stat # 僅僅比較統計信息
git diff "@{yesterday}" # 查看昨天的改變
git diff 1b6d "master~2" # 查看一個特定版本與倒數第二個變動之間的改變
Git 本地分支管理
查看、切換、建立和刪除分支
git br -r # 查看遠程分支
git br -v # 查看各個分支最後提交信息
git br -a # 列出全部分支
git br --merged # 查看已經被合併到當前分支的分支
git br --no-merged # 查看還沒有被合併到當前分支的分支
git br <new_branch> # 基於當前分支建立新的分支
git br <new_branch> <start_point> # 基於另外一個起點(分支名稱,提交名稱或則標籤名稱),建立新的分支
git br -f <existing_branch> <start_point> # 建立同名新分支,覆蓋已有分支
git br -d <branch> # 刪除某個分支
git br -D <branch> # 強制刪除某個分支 (未被合併的分支被刪除的時候須要強制)
git co <branch> # 切換到某個分支
git co -b <new_branch> # 建立新的分支,而且切換過去
git co -b <new_branch> <branch> # 基於branch建立新的new_branch
git co -m <existing_branch> <new_branch> # 移動或重命名分支,當新分支不存在時
git co -M <existing_branch> <new_branch> # 移動或重命名分支,當新分支存在時就覆蓋
git co $id # 把某次歷史提交記錄checkout出來,但無分支信息,切換到其餘分支會自動刪除
git co $id -b <new_branch> # 把某次歷史提交記錄checkout出來,建立成一個分支
分支合併和rebase
git merge <branch> # 將branch分支合併到當前分支
git merge origin/master --no-ff # 不要Fast-Foward合併,這樣能夠生成merge提交
git merge --no-commit <branch> # 合併但不提交
git merge --squash <branch> # 把一條分支上的內容合併到另外一個分支上的一個提交
git rebase master <branch> # 將master rebase到branch,至關於:
git co <branch> && git rebase master && git co master && git merge <branch>
Git補丁管理
git diff > ../sync.patch # 生成補丁
git apply ../sync.patch # 打補丁
git apply --check ../sync.patch # 測試補丁可否成功
git format-patch -X # 根據提交的log生成patch,X爲數字,表示最近的幾個日誌
Git暫存管理
git stash # 暫存
git stash list # 列全部stash
git stash apply # 恢復暫存的內容
git stash drop # 刪除暫存區
Git遠程分支管理
git pull # 抓取遠程倉庫全部分支更新併合併到本地
git pull --no-ff # 抓取遠程倉庫全部分支更新併合併到本地,不要快進合併
git fetch origin # 抓取遠程倉庫全部更新
git fetch origin remote-branch:local-branch #抓取remote-branch分支的更新
git fetch origin --tags # 抓取遠程上的全部分支
git checkout -b <new-branch> <remote_tag> # 抓取遠程上的分支
git merge origin/master # 將遠程主分支合併到本地當前分支
git co --track origin/branch # 跟蹤某個遠程分支建立相應的本地分支
git co -b <local_branch> origin/<remote_branch> # 基於遠程分支建立本地分支,功能同上
git push # push全部分支
git push origin master # 將本地主分支推到遠程主分支
git push -u origin master # 將本地主分支推到遠程(如無遠程主分支則建立,用於初始化遠程倉庫)
git push origin <local_branch> # 建立遠程分支, origin是遠程倉庫名
git push origin <local_branch>:<remote_branch> # 建立遠程分支
git push origin :<remote_branch> #先刪除本地分支(git br -d <branch>),而後再push刪除遠程分支
Git遠程倉庫管理
git remote -v # 查看遠程服務器地址和倉庫名稱
git remote show origin # 查看遠程服務器倉庫狀態
git remote add origin git@github:XXX/test.git # 添加遠程倉庫地址
git remote set-url origin git@github.com:XXX/test.git # 設置遠程倉庫地址(用於修改遠程倉庫地址)
git remote rm <repository> # 刪除遠程倉庫
git remote set-head origin master # 設置遠程倉庫的HEAD指向master分支
git branch --set-upstream master origin/master 根據遠程分支 新建本地分支 並關聯相應的分支名
git branch --set-upstream develop origin/develop
實例
## 打patch過程linux
git add .
git status
git diff --cached >XXX.patch
git ci -m 'add patch'
分支策略
在實際開發中,咱們應該按照幾個基本原則進行分支管理:git
首先,master分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;github
那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;shell
你和你的小夥伴們每一個人都在dev分支上幹活,每一個人都有本身的分支,時不時地往dev分支上合併就能夠了。緩存
轉載自 http://blog.csdn.net/we_shell/article/details/36079679服務器
1. 初始化配置
- #配置用戶信息
- $ git config --global user.name "your name"
- $ git config --global user.email you@yourdomain.com
-
- #配置到緩存(默認15分鐘)
- $ git config --global credential.helper cache
- #修改緩存時間
- $ git config --global credential.helper 'cache --timeout=3600'
-
- #開啓顏色顯示
- $ git config --global color.ui true
-
- #設置別名
- $ git config --global alias.co checkout
- $ git config --global alias.ci commit
- $ git config --global alias.st status
- $ git config --global alias.br branch
-
- #設置默認使用的文本編輯器
- $ git config --global core.editor emacs
-
- #列舉全部配置
- $ git config -l
#配置用戶信息
$ git config --global user.name "your name"
$ git config --global user.email you@yourdomain.com
#配置到緩存(默認15分鐘)
$ git config --global credential.helper cache
#修改緩存時間
$ git config --global credential.helper 'cache --timeout=3600'
#開啓顏色顯示
$ git config --global color.ui true
#設置別名
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.br branch
#設置默認使用的文本編輯器
$ git config --global core.editor emacs
#列舉全部配置
$ git config -l
2. 基本命令
- git branch brname master/cid/tag # 基於某次提交、分支或標籤建立新分支
- git branch -r # 顯示遠程分支
- git branch -a # 列出全部分支
- git branch -m master mymaster # 分支重命名 -M 大寫M會覆蓋同名的分支
- git branch -v # 查看各個分支最後提交信息
- git branch --merged # 查看已經被合併到當前分支的分支
- git branch --no-merged # 查看還沒有被合併到當前分支的分支
- <pre code_snippet_id="412536" snippet_file_name="blog_20140701_2_7193467" name="code" class="plain">git branch -d <span style="font-family: Arial, Helvetica, sans-serif;"><branch> </span><span style="font-family: Arial, Helvetica, sans-serif;"># 刪除分支</span>
- git br -D <branch> # 強制刪除某個分支 (未被合併的分支被刪除的時候須要強制)
-
- git checkout brname # 切換分支
- git checkout -b brname # 建立並切換分支
-
- git add <file> # 將工做文件修改提交到暫存區
- git add . # 將當前目錄中全部修改過的工做文件提交暫存區
-
- git rm <file> # 將文件從倉庫中移除,而且從當前目錄中刪除
- git rm <file> --cached # 將文件從倉庫中移除,但仍然保留在當前目錄中
-
- git mv FileName NewFileName # 文件重命名
-
- git checkout -- <file> # 用暫存區中filename文件來覆蓋工做區中的filename文件
- git checkout <commit> -- <file> # 用<commit>所指向的提交中filename替換暫存區和工做區中相應的文件
- git checkout -- . # 或者git checkout . 用暫存區的全部文件直接覆蓋本地文件
-
-
- #重置的默認值是HEAD,而檢出的默認值是暫存區
- git reset <file> # 將文件的改動撤出暫存區,至關於命令git add <file>的反射操做
- git reset --hard <commit> # 替換引用的指向,替換暫存區,替換工做區
- git reset --soft <commit> # 更改引用的指向(復位版本庫),不改變暫存區和工做區
- git reset --mixed <commit> # (默認)更改引用的指向及重置暫存區,可是不改變工做區
- git reset # 重置暫存區,工做區不會受到影響,引用也未改變,由於引用重置到HEAD至關於沒有重置
- git reset --soft HEAD^ # 工做區和暫存區不改變,可是引用向前回退一次,撤銷最新的提交以便從新提交
- git reset --hard HEAD^ # 完全撤銷最近的提交
-
- git commit -m 「something」 someFile # 提交指定文件
- git commit -a # 把全部已經跟蹤過的文件暫存,並提交
- git commit -c # 打開編輯器在已有的提交基礎上編輯修改
- git commit --amend # 增補提交
- git commit -C HEAD -a —amend # 複用HEAD留言,增補提交(修改小錯誤,而不增長提交記錄,掩蓋本身的小馬虎)
git branch brname master/cid/tag # 基於某次提交、分支或標籤建立新分支
git branch -r # 顯示遠程分支
git branch -a # 列出全部分支
git branch -m master mymaster # 分支重命名 -M 大寫M會覆蓋同名的分支
git branch -v # 查看各個分支最後提交信息
git branch --merged # 查看已經被合併到當前分支的分支
git branch --no-merged # 查看還沒有被合併到當前分支的分支
<pre code_snippet_id="412536" snippet_file_name="blog_20140701_2_7193467" name="code" class="plain">git branch -d <span style="font-family: Arial, Helvetica, sans-serif;"><branch> </span><span style="font-family: Arial, Helvetica, sans-serif;"># 刪除分支</span>
git br -D <branch> # 強制刪除某個分支 (未被合併的分支被刪除的時候須要強制)
git checkout brname # 切換分支
git checkout -b brname # 建立並切換分支
git add <file> # 將工做文件修改提交到暫存區
git add . # 將當前目錄中全部修改過的工做文件提交暫存區
git rm <file> # 將文件從倉庫中移除,而且從當前目錄中刪除
git rm <file> --cached # 將文件從倉庫中移除,但仍然保留在當前目錄中
git mv FileName NewFileName # 文件重命名
git checkout -- <file> # 用暫存區中filename文件來覆蓋工做區中的filename文件
git checkout <commit> -- <file> # 用<commit>所指向的提交中filename替換暫存區和工做區中相應的文件
git checkout -- . # 或者git checkout . 用暫存區的全部文件直接覆蓋本地文件
#重置的默認值是HEAD,而檢出的默認值是暫存區
git reset <file> # 將文件的改動撤出暫存區,至關於命令git add <file>的反射操做
git reset --hard <commit> # 替換引用的指向,替換暫存區,替換工做區
git reset --soft <commit> # 更改引用的指向(復位版本庫),不改變暫存區和工做區
git reset --mixed <commit> # (默認)更改引用的指向及重置暫存區,可是不改變工做區
git reset # 重置暫存區,工做區不會受到影響,引用也未改變,由於引用重置到HEAD至關於沒有重置
git reset --soft HEAD^ # 工做區和暫存區不改變,可是引用向前回退一次,撤銷最新的提交以便從新提交
git reset --hard HEAD^ # 完全撤銷最近的提交
git commit -m 「something」 someFile # 提交指定文件
git commit -a # 把全部已經跟蹤過的文件暫存,並提交
git commit -c # 打開編輯器在已有的提交基礎上編輯修改
git commit --amend # 增補提交
git commit -C HEAD -a —amend # 複用HEAD留言,增補提交(修改小錯誤,而不增長提交記錄,掩蓋本身的小馬虎)
3. git clean清除未跟蹤的文件
- git clean -dn # 列出那些文件將被清除
- git clean -f # 清除未跟蹤的文件
- git clean -df # 清除未跟蹤的文件和目錄
- git clean -dfx # 清除包括.gitignore忽略的全部文件
- git clean -X # Remove only files ignored by git
git clean -dn # 列出那些文件將被清除
git clean -f # 清除未跟蹤的文件
git clean -df # 清除未跟蹤的文件和目錄
git clean -dfx # 清除包括.gitignore忽略的全部文件
git clean -X # Remove only files ignored by git
4. Git倉庫管理
- git init #初始化一個版本倉庫
- git clone git@git:test.git #Clone遠程版本庫
-
- git remote -v # 查看遠程服務器地址和倉庫名稱
- git remote show origin # 查看遠程服務器倉庫狀態
- git remote add origin git@git:test.git # 添加遠程倉庫origin
- git remote set-url origin git@git:test.git # 設置遠程倉庫地址(用於修改遠程倉庫地址)
- git remote rm <repository> # 刪除遠程倉庫
- git remote set-head origin master # 設置遠程倉庫的HEAD指向master分支
git init #初始化一個版本倉庫
git clone git@git:test.git #Clone遠程版本庫
git remote -v # 查看遠程服務器地址和倉庫名稱
git remote show origin # 查看遠程服務器倉庫狀態
git remote add origin git@git:test.git # 添加遠程倉庫origin
git remote set-url origin git@git:test.git # 設置遠程倉庫地址(用於修改遠程倉庫地址)
git remote rm <repository> # 刪除遠程倉庫
git remote set-head origin master # 設置遠程倉庫的HEAD指向master分支
5. Git分支管理
- git pull # 抓取遠程倉庫全部分支更新併合併到本地
- git pull --no-ff # 抓取遠程倉庫全部分支更新併合併到本地,不要快進合併
- git fetch origin # 抓取遠程倉庫更新
- git merge origin/master # 將遠程主分支合併到本地當前分支
- git co --track origin/branch # 跟蹤某個遠程分支建立相應的本地分支
- git co -b <local_branch> origin/<remote_branch> # 基於遠程分支建立本地分支,功能同上
-
- git push # push全部分支
- git push origin master # 將本地主分支推到遠程主分支
- git push -u origin master # 將本地主分支推到遠程(如無遠程主分支則建立,用於初始化遠程倉庫)
- git push origin <local_branch> # 建立遠程分支, origin是遠程倉庫名
- git push origin <local_branch>:<remote_branch> # 建立遠程分支
- git push origin :<remote_branch> #先刪除本地分支(git br -d <branch>),而後再push刪除遠程分支
-
- git merge <branch> # 將branch分支合併到當前分支
- git merge origin/master --no-ff # 不要Fast-Foward合併,這樣能夠生成merge提交
- git rebase master <branch> # 將master rebase到branch,至關於git co <branch> && git rebase master && git co master && git merge <branch>
git pull # 抓取遠程倉庫全部分支更新併合併到本地
git pull --no-ff # 抓取遠程倉庫全部分支更新併合併到本地,不要快進合併
git fetch origin # 抓取遠程倉庫更新
git merge origin/master # 將遠程主分支合併到本地當前分支
git co --track origin/branch # 跟蹤某個遠程分支建立相應的本地分支
git co -b <local_branch> origin/<remote_branch> # 基於遠程分支建立本地分支,功能同上
git push # push全部分支
git push origin master # 將本地主分支推到遠程主分支
git push -u origin master # 將本地主分支推到遠程(如無遠程主分支則建立,用於初始化遠程倉庫)
git push origin <local_branch> # 建立遠程分支, origin是遠程倉庫名
git push origin <local_branch>:<remote_branch> # 建立遠程分支
git push origin :<remote_branch> #先刪除本地分支(git br -d <branch>),而後再push刪除遠程分支
git merge <branch> # 將branch分支合併到當前分支
git merge origin/master --no-ff # 不要Fast-Foward合併,這樣能夠生成merge提交
git rebase master <branch> # 將master rebase到branch,至關於git co <branch> && git rebase master && git co master && git merge <branch>
6. 查看文件diff和log
- git diff <file> # 比較當前文件和暫存區文件差別
- git diff
- git diff <$id1> <$id2> # 比較兩次提交之間的差別
- git diff <branch1>..<branch2> # 在兩個分支之間比較
- git diff --staged # 比較暫存區和版本庫差別
- git diff --cached # 比較暫存區和版本庫差別
- git diff --stat # 僅僅比較統計信息
-
- git log
- git log <file> # 查看該文件每次提交記錄
- git log -p <file> # 查看每次詳細修改內容的diff
- git log -p -2 # 查看最近兩次詳細修改內容的diff
- git log --stat #查看提交統計信息
git diff <file> # 比較當前文件和暫存區文件差別
git diff
git diff <$id1> <$id2> # 比較兩次提交之間的差別
git diff <branch1>..<branch2> # 在兩個分支之間比較
git diff --staged # 比較暫存區和版本庫差別
git diff --cached # 比較暫存區和版本庫差別
git diff --stat # 僅僅比較統計信息
git log
git log <file> # 查看該文件每次提交記錄
git log -p <file> # 查看每次詳細修改內容的diff
git log -p -2 # 查看最近兩次詳細修改內容的diff
git log --stat #查看提交統計信息
7. Git暫存和補丁管理
- git stash # 保存當前的工做進度,會分別對暫存區和工做區的狀態進行保存
- git stash [save [--patch] [-k|--[no]keep-index] [-q|--quiet] [<message>]] # 是第一條git stash命令的完整版,使用參數--patch會顯示工做區和HEAD的差別, 使用-k或者--keep-index參數,在保存進度後不會將暫存區重置,默認會將暫存區和工做區強制重置。
- git stash list # 顯示進度列表
- git stash pop [--index] [<stash>] # 默認恢復最新保存的進度,並從stash list中清除; 提供<stash>參數,則從該<stash>中恢復; 選項--index除了恢復工做區的文件外,還嘗試恢復暫存區
- git stash apply [--index] [<stash>] # 除了不刪除恢復的進度以外,其他和git stash pop 命令同樣
- git stash drop [<stash>] #刪除一個存儲的進度,默認刪除最新的進度
- git stash clear # 刪除全部存儲的進度
- git stash branch <branchname> <stash> # 基於進度建立分支
-
- git diff > ../sync.patch # 生成補丁
- git apply ../sync.patch # 打補丁
- git apply --check ../sync.patch #測試補丁可否成功
git stash # 保存當前的工做進度,會分別對暫存區和工做區的狀態進行保存
git stash [save [--patch] [-k|--[no]keep-index] [-q|--quiet] [<message>]] # 是第一條git stash命令的完整版,使用參數--patch會顯示工做區和HEAD的差別, 使用-k或者--keep-index參數,在保存進度後不會將暫存區重置,默認會將暫存區和工做區強制重置。
git stash list # 顯示進度列表
git stash pop [--index] [<stash>] # 默認恢復最新保存的進度,並從stash list中清除; 提供<stash>參數,則從該<stash>中恢復; 選項--index除了恢復工做區的文件外,還嘗試恢復暫存區
git stash apply [--index] [<stash>] # 除了不刪除恢復的進度以外,其他和git stash pop 命令同樣
git stash drop [<stash>] #刪除一個存儲的進度,默認刪除最新的進度
git stash clear # 刪除全部存儲的進度
git stash branch <branchname> <stash> # 基於進度建立分支
git diff > ../sync.patch # 生成補丁
git apply ../sync.patch # 打補丁
git apply --check ../sync.patch #測試補丁可否成功
http://git-scm.com/book/zh