Git筆記

通用分支模型

分支模型

常駐型分支:

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查看、刪除、重命名遠(yuǎn)程分支和tag

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 --hard
    • list / 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-only Fast-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)化編輯功能

如何在 Git 里撤銷(幾乎)任何操作
10 個(gè)迅速提升你 Git 水平的提示
Git分支本地操作詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來。這樣一來,任何一處協(xié)同...
    __silhouette閱讀 16,197評論 5 147
  • Git常用語法 [TOC] Git簡介 描述 ? Git(讀音為/g?t/。)是一個(gè)開源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,933評論 0 13
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 4,152評論 0 11
  • 1. BeanCreationException org.springframework.beans.factor...
    grace666閱讀 456評論 0 0
  • 本文是我的好友饞宗通吃觀戰(zhàn)后的感想,我?guī)兔Πl(fā)布在簡書。如需轉(zhuǎn)發(fā)請通知我,謝謝。 補(bǔ)充:我這個(gè)好友大學(xué)專業(yè)是計(jì)算機(jī)相...
    很小的小小魚兒閱讀 1,369評論 1 2

友情鏈接更多精彩內(nèi)容