
分支模型
常駐型分支:
master:每個(gè)提交都是穩(wěn)定版本,每次提交打tag
develop:每次提交都是可完整編譯的開發(fā)版本,代碼穩(wěn)定后進(jìn)入master分支
臨時(shí)性分支:
feature:特定單一功能模塊分支,完成后進(jìn)入develop
release:特定發(fā)布版本分支,來源于develop,完成最終小修復(fù)、發(fā)布版本資料準(zhǔn)備等,發(fā)布后同步至develop和master分支,并刪除
hotfixes:特定嚴(yán)重bug修復(fù)分支,來源于master,完成后同步至develop和master,并刪除。發(fā)布期間同步至release分支,最后由release分支同步至develop和master
介紹一個(gè)成功的 Git 分支模型
A successful Git branching model
Config配置
默認(rèn)倉庫級:.git/.gitconfig
global用戶級:C:\Users\username.gitconfig 或 /home/[username]/.gitconfig
system系統(tǒng)級:git的安裝目錄\etc\gitconfig
優(yōu)先度:倉庫級 > 用戶級 > 系統(tǒng)級
Alias配置
~/.gitconfig
[user]
name = xxx
email = xxx@xxx.com
[color]
ui = auto
[alias]
st = status
cm = commit
cmm = commit -m
coamd = commit --amend --no-edit
coamd-re = commit --amend --no-edit --reset-author
ck = checkout
br = branch
unstage = reset HEAD --
last = log -1 HEAD
loga = log --oneline --graph --decorate --all
ck = checkout
alias = config --get-regexp alias
基本命令1
git init 在當(dāng)前目錄(項(xiàng)目)創(chuàng)建git倉庫
git config [-local | -global | -system] -l 列出指定級別的配置文件內(nèi)容
git config -l 列出綜合計(jì)算(排除沖突)后有效的配置內(nèi)容
git config -e 編輯器打開配置文件(默認(rèn)為local級)
git config --add section.key value 增加配置項(xiàng)(默認(rèn)為local級)
git config --get / --unset section.key 獲取、刪除配置項(xiàng)(默認(rèn)為local級)
設(shè)置用戶全局提交簽名
git config --global user.name myName
git config --global user.email myEmail@email.com
git config --global core.editor emacs 配置缺省編輯器
git config --global merge.tool vimdiff 配置缺省比較工具,可選有kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, 和 opendiff
git remote -v 列出遠(yuǎn)程倉庫及對應(yīng)url
git remote show origin 顯示遠(yuǎn)程倉庫origin的詳細(xì)關(guān)聯(lián)信息
git remote add [shortname] [url] 追加新的遠(yuǎn)程倉庫到當(dāng)前項(xiàng)目
git remote prune origin 移除在origin中已刪除的本地過期分支
git fetch origin 拉取origin服務(wù)器上的所有數(shù)據(jù)到本地,更新遠(yuǎn)程分支數(shù)據(jù)及索引
git fetch origin tag <tagname> 拉取遠(yuǎn)程tag
git fetch -p 拉取服務(wù)器數(shù)據(jù)后并執(zhí)行prune 命令刪除過期分支
git remote add 添加新的遠(yuǎn)程倉庫附加到當(dāng)前項(xiàng)目遠(yuǎn)程分支
git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
git push origin master 推送當(dāng)前分支到origin下的master分支上,尤其第一次提交分支
git push [origin] 之后的更新提交可使用這種簡單形式
git push origin fixBugs:greatJob 推送fixBugs分支到origin的greatJob 分支上
git push --all origin 一次性推送所有分支到遠(yuǎn)程
git push --tags 推送本地tag到服務(wù)器
git push origin :master 表示提交本地空分支到遠(yuǎn)程(即刪除遠(yuǎn)程分支)
相當(dāng)于 git push origin --delete master
git merge origin/master 把遠(yuǎn)程master分支合并到當(dāng)前分支
git checkout -b localfix origin/serverfix 把遠(yuǎn)程分支serverfix檢出到本地新分支localfix
git checkout --track origin/serverfix 檢出遠(yuǎn)程分支serverfix到本地(功能同上,v 1.6.2)
從遠(yuǎn)程分支checkout出來的本地分支稱為 跟蹤分支(tracking branch),已記錄與遠(yuǎn)程分支的關(guān)聯(lián),可直接使用git push/git pull操作。
git push origin :serverfix 刪除遠(yuǎn)程分支serverfix(使用空分支push到遠(yuǎn)程指定分支)
git push origin --delete <branchName> 刪除遠(yuǎn)程分支(v1.7)
git push origin :refs/tags/<tagname> 刪除遠(yuǎn)程tag
git push origin --delete tag <tagname> 刪除遠(yuǎn)程tag(v1.7)
git pull origin targetBranch 拉取遠(yuǎn)程分支到本地并合并,相當(dāng)于:
git fetch origin targetBranch
git diff targetBranch
git merge targetBranch
git reset HEAD <file> 取消被錯(cuò)誤add . 添加到暫存區(qū)的文件
git checkout -- <file> 回滾文件到原始狀態(tài)
git mergetool 啟動(dòng)GUI合并工具
git branch -vv
查看本地分支-遠(yuǎn)程分支映射
git branch -u upstream/foo [local_branch]
git branch --set-upstream-to=upstream/foo [local_branch]
設(shè)置分支映射
git push origin local_branch:remote_branch
推送本地分支到遠(yuǎn)程分支
git push origin :remote_branch
git push --delete origin devel
刪除遠(yuǎn)程分支(推送空分支)
拉取遠(yuǎn)程分支并創(chuàng)建本地分支
從remote_branch節(jié)點(diǎn)創(chuàng)建并切換到本地分支local_branch
git checkout -b local_branch origin/remote_branch
拉取遠(yuǎn)程分支到本地分支(新建分支但并不自動(dòng)checkout)
git fetch origin remote_branch:local_branch
定位 commit
顯示包含該commit的分支列表
git branch --contains <commit>
搜索特定message的所有commit
git log -S "searching words"
git log -G "regex"
git log --grep="searching words"
git log | grep "searching words"
git bisect:
二分查找法定位、檢出當(dāng)前branch的關(guān)鍵commit,尋找bug被引入的源頭commit
基本命令2
-
init [--bare]初始化git倉庫,bare 指定創(chuàng)建遠(yuǎn)程倉庫,僅用于管理記錄,不用于實(shí)際工作 -
clone <url> [新項(xiàng)目文件夾名]克隆遠(yuǎn)程項(xiàng)目 -
add -i交互模式下選擇需要加到暫存區(qū)的文件 -
add -p <file>交互模式下選擇當(dāng)前文件中需要加到暫存區(qū)的代碼塊 -
commit --amend -m <message>修改上次提交的注釋 -
commit --amend使用新的commit替換掉上一次commit -
cherry-pick <commit1 ...>指定commit復(fù)制并提交到當(dāng)前分支 -
stash入棧緩存并reset --hardlist / show / apply / pop / drop / clear-
save <comment>入棧緩存并添加備注 -
branch <name> [id]基于進(jìn)度創(chuàng)建新分支
clean [-f 清理 UNTRACKED 文件] [-d 以及目錄] [-n 測試運(yùn)行模式] [-i 交互模式]-
rm [--cached 僅在暫存區(qū)中] <file>刪除文件的標(biāo)準(zhǔn)方式,指定 cached 則僅在git系統(tǒng)管理中刪除文件,但保留物理文件 -
reset [目標(biāo),默認(rèn)為HEAD] [文件]回滾提交記錄或文件,被回滾的記錄將被清除-
--soft回滾commit提交記錄 -
--mixed默認(rèn)值,回滾 commit 和 add 動(dòng)作(清理暫存區(qū)) -
--hard回滾提交記錄,清理暫存區(qū)并物理刪除新文件
-
-
revert撤銷某次記錄的提交,實(shí)際上是執(zhí)行一次反向提交,增加一條commit記錄,不清除被撤銷的舊提交 -
branch <name>創(chuàng)建新分支 -
checkout -b <name> [start-point]創(chuàng)建并切換到新分支 -
checkout [目標(biāo),默認(rèn)為HEAD] [-- 文件路徑]檢出指定版本的項(xiàng)目或文件,覆蓋當(dāng)前 -
update-index --assume-unchanged <file>暫時(shí)忽略對文件修改的跟蹤,常用于大型二進(jìn)制文件管理時(shí)提高git性能 -
update-index --no-assume-unchanged <file>恢復(fù)對文件的實(shí)時(shí)跟蹤 -
diff對比暫存區(qū)或最近的commit版本與當(dāng)前工作區(qū)的區(qū)別-
--cached對比暫存區(qū)與最近一次commit版本之間的區(qū)別 -
--stat [當(dāng)前] [目標(biāo),默認(rèn)為HEAD] [-- 文件路徑]對比項(xiàng)目或文件
-
-
blame <file>查看文件每行提交者及提交時(shí)間 -
show顯示單條 git 提交記錄,并使用diff分析,可用選項(xiàng)與log相同 -
log顯示 git 有效提交歷史,不包括被 reset 掉的提交- --all --oneline --graph 所有分支以簡化的樹狀圖方式表示
- --decorate 彩色標(biāo)記分支名等信息
- --stat 統(tǒng)計(jì)方式顯示提交的文件
- -n 查看最近n條記錄
-
reflog查看 git 本地操作的完整記錄,可用于恢復(fù)被 reset 清除掉的歷史提交,但該記錄并非永久記錄,過于古老的提交將被自動(dòng)清理掉 -
tag [-f 強(qiáng)制更新] [-m <message>] <tag-name> [commit-id]對目標(biāo)commit添加tag,默認(rèn)為最近一個(gè)commit,message信息可通過show命令查看-
-d [tag-name]刪除本地tag -
-l列出清單
-
-
fetch <repo-name>拉取遠(yuǎn)程倉庫的所有分支更新,刷新所有遠(yuǎn)程分支HEAD位置 -
merge無參數(shù)表示更新本地分支HEAD標(biāo)記到遠(yuǎn)程分支版本-
--no-commit相當(dāng)于dry-run -
--no-ff / --ff-onlyFast-Forward -
--squash將目標(biāo)分支的修改應(yīng)用到當(dāng)前分支并產(chǎn)生一個(gè)獨(dú)立commit,不混合提交歷史記錄
-
-
pull相當(dāng)于fetch + merge -
remote管理遠(yuǎn)程倉庫映射-
add <repo-name> <url>追加遠(yuǎn)程倉庫映射 -
rename / remove重命名、移除遠(yuǎn)程倉庫映射 -
set-url [--push] <repo-name> <new-url> [old-url]修改遠(yuǎn)程倉庫映射的鏈接 -
-v列出所有遠(yuǎn)程倉庫 -
prune <repo-name>對比并移除本地倉庫中已失效的遠(yuǎn)程分支映射
-
-
rebase節(jié)點(diǎn)重置,用于重新整理、修建、重新提交當(dāng)前分支-
<branch / commit>重置當(dāng)前分支根節(jié)點(diǎn)到指定分支的HEAD節(jié)點(diǎn)或指定commit提交點(diǎn) -
-i <branch / commit>交互模式修改提交樹,可對部分提交進(jìn)行拆分、合并、刪除、重排序、修改信息等操作 -
--root特殊模式,針對從倉庫第一條歷史記錄開始修改(或刪除) -
--onto <target-branch / commit> <from-branch / commit> [working-branch]切換到指定工作分支,緩存從指定位置開始到HEAD之間的所有提交,遷移到指定的目標(biāo)分支或提交上(重新執(zhí)行提交序列,不改變提交的歷史日期),若在同一分支上操作,則進(jìn)行commit歷史的裁剪操作
-
要撤銷的文件已被 add 到暫存區(qū)時(shí),需要先 reset 退出暫存區(qū),再 checkout 檢出原始版本覆蓋當(dāng)前修改。
.ignore 對當(dāng)前文件夾以及子文件夾有效,但僅作用于未添加到 git 跟蹤的 UNTRACKED 文件。
patch補(bǔ)丁主要用于非開發(fā)人員,不需要進(jìn)行pull、merge等操作即可得到最近代碼
本地配置文件不需要跟蹤時(shí),從一開始就不要添加到 git 庫進(jìn)行管理。
分支節(jié)點(diǎn)符 ^ ~
^ 旁系節(jié)點(diǎn),用于表示分支樹同一層級的兄弟父節(jié)點(diǎn)
^ 表示當(dāng)前commit所在當(dāng)前分支的(第一個(gè))父節(jié)點(diǎn)
^2 表示當(dāng)前commit所在 第二分支 的(第一個(gè))父級兄弟節(jié)點(diǎn)(與 ^ 并列同一層級)
~ 直系節(jié)點(diǎn),用于表示分支樹中當(dāng)前分支的各個(gè)直系父節(jié)點(diǎn)
~ 表示當(dāng)前commit所在當(dāng)前分支的(第一個(gè))父節(jié)點(diǎn)
~2 表示當(dāng)前commit所在當(dāng)前分支的(第一個(gè))祖父節(jié)點(diǎn)(直系節(jié)點(diǎn))
^^^ = ^1^1^1 = ~3 當(dāng)前分支的 父節(jié)點(diǎn) 的 父節(jié)點(diǎn) 的 父節(jié)點(diǎn)
^^2 = ~1^2 = ~^2 當(dāng)前分支的 父節(jié)點(diǎn) 的 第二分支 的 父節(jié)點(diǎn)
^2 當(dāng)前節(jié)點(diǎn)的 第二分支 的 父節(jié)點(diǎn)
節(jié)點(diǎn)符可用于 HEAD 、分支或任意一個(gè) commit
可視化工具
SourceTree
免費(fèi)的Mac平臺(tái)git可視化客戶端
GitUp
可視化Git工具,結(jié)構(gòu)比SourceTree簡單,功能強(qiáng)大,可直接操作提交樹圖形,提供多種簡易自動(dòng)化編輯功能