Git:常用命令....
- git clone <repo>
- git config –list
- git diff –staged
- add后,commit前的撤銷:git rm –cached
- commit后的回滾:git reset –hard commit-id,比如:git reset –hard HEAD
Git是一個分布式版本控制/軟件配置管理軟件,原來是linux內核開發者林納斯·托瓦茲(Linus Torvalds)為了更好地管理linux內核開發而創立的。
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
,我的配置:
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過程
git add .
git status
git diff --cached >XXX.patch
git ci -m 'add patch'
分支策略
在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合並到master上,在master分支發布1.0版本;
你和你的小伙伴們每個人都在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
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留言,增補提交(修改小錯誤,而不增加提交記錄,掩蓋自己的小馬虎)
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
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分支
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>
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 #查看提交統計信息
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 #測試補丁能否成功
