一、Git命令行操作
1.1本地庫初始化
進(jìn)入文件夾
git init
注意:生成的 .git 目錄中存放的是本地庫相關(guān)文件,不要?jiǎng)h除
1.2設(shè)置簽名
-
項(xiàng)目(倉庫)級(jí)別
僅在當(dāng)前本地庫有效git config user.name tom #設(shè)置用戶名tom git config user.email fu@qq.com #設(shè)置用戶郵箱 信息保存位置:
.git/config 文件

-
系統(tǒng)用戶級(jí)別
僅在當(dāng)前登錄的操作系統(tǒng)用戶有效git config --global user.name tom git config --global user.email fu@qq.com
僅僅加了一個(gè)
--global優(yōu)先級(jí)別:
項(xiàng)目級(jí)別>系統(tǒng)級(jí)別就近原則:項(xiàng)目級(jí)別優(yōu)先于系統(tǒng)用戶級(jí)別,二者都有時(shí)采用項(xiàng)目級(jí)別的簽名
如果只有系統(tǒng)用戶級(jí)別的簽名,就以系統(tǒng)用戶級(jí)別的簽名為準(zhǔn)
二者都沒有不允許的
- 信息保存位置:
~/.gitconfig文件

1.3基本操作
1.3.1 狀態(tài)查看
git status #查看工作區(qū)、暫存區(qū)狀態(tài)
1.3.2 添加
git add fileName #指定文件
git add . #所有
說明:將工作區(qū)的文件添加到暫存區(qū)

1.3.3 提交
git commit -m 'commit message' fileName
說明:將暫存區(qū)內(nèi)容提交到本地庫

1.3.4 查看歷史記錄
git log
git reflog #常用
說明:HEAD@{移動(dòng)到當(dāng)前版本需要多少步}
git log --greph #圖形顯示,更直觀
git log --pretty=oneline #漂亮一行顯示
git log --oneline #簡(jiǎn)潔顯示
多屏顯示控制方式:
空格向下翻
b 向上翻
q 退出

1.3.5 前進(jìn)后退

-
基于索引值(推薦)
git reset --hard 指針位置 例子:git reset --hard a6ace91 #回到這個(gè)狀態(tài) -
使用 ^ 符號(hào)
只能后退git reset --hard HEAD^ 例子:git reset --hard HEAD^^ 注意:幾個(gè) ^ 表示后退幾步 -
使用 ~ 符號(hào)
只能后退git reset --hard HEAD~n 例子:git reset --hard HEAD~3 注: n 表示后退 n 步

1.3.6 reset的三個(gè)參數(shù)比較
soft:
- 僅本地庫移動(dòng) HEAD 指針


mixed:
- 在本地庫移動(dòng) HEAD 指針
- 重置暫存區(qū)


hard:
- 在本地庫移動(dòng) HEAD 指針
- 重置暫存區(qū)
- 重置工作區(qū)

1.3.7 刪除文件并找回
- 前提:刪除前,文件存在的狀態(tài)提交到了本地庫
- 相當(dāng)于建立一個(gè)快照,雖然刪除了,但只要添加到暫存區(qū),就能找回
git reset --hard [指針位置]
刪除操作已經(jīng)提交到本地庫:指針位置指向歷史記錄
刪除操作尚未提交到本地庫:指針位置指向 HEAD

1.3.8 文件差異比較
git diff [文件名]
將工作區(qū)中的文件和暫存區(qū)進(jìn)行比較
git diff 哈希值 文件名 #和歷史中的一個(gè)版本比較
git diff [本地庫中歷史版本][文件名]
將工作區(qū)中的文件和本地庫里歷史記錄比較
不帶文件名,比較多個(gè)文件

2.2 分支管理

hot_fix` `master` `feature_x` `feature_y
2.2.1 什么是分支管理
- 在版本控制中,使用推進(jìn)多個(gè)任務(wù)。
2.2.2 分支的好處
- 同時(shí)并行推進(jìn)多個(gè)功能開發(fā),提高開發(fā)效率。
- 各個(gè)分支在開發(fā)過程中,如果某一分支開發(fā)失敗,不會(huì)對(duì)其它分支有任何影響。失敗的分支重新開始即可。
2.2.3 分支操作
- 創(chuàng)建分支
git branch 分支名
- 查看分支
git branch
git branch -v # 查看所有分支

- 切換分支
git checkout 分支名
git checkout -b 分支名 #創(chuàng)建分支并直接切換到該分支

-
合并分支
相當(dāng)于把修改了的文件拉過來第一步:切換到接受修改的分支上(被合并,增加新內(nèi)容)
git checkout [被合并的分支名]第二步:執(zhí)行 merge 命令
git merge [有新內(nèi)容的分支名]
git merge xxx
注意:合并分支的時(shí)候要明確誰誰合并
我在a分支里面修改了。要合并到master,就先切換到master,然后合并b

- 刪除分支
git branch -d 分支名
2.2.4 解決沖突
- 沖突的表現(xiàn)


- 沖突的解決
- 第一步:編輯,刪除特殊標(biāo)記
<<<=== - 第二步:修改到滿意位置,保存退出
- 第三步:添加到緩存區(qū)
git add [文件名] - 第四步:提交到本地庫
git commit -m "日志信息" ``注意:后面一定不能帶文件名
- 第一步:編輯,刪除特殊標(biāo)記

二、Git保存版本的機(jī)制
1.1 集中式版本控制工具的文件管理機(jī)制
以文件變更列表的方式存儲(chǔ)信息。這類系統(tǒng)將它們保存的信息看作是一組基本文件和每個(gè)文件隨時(shí)間逐步累積的差異。

1.2 Git的文件管理機(jī)制
Git把數(shù)據(jù)看作是小型文件系統(tǒng)的一組快照。每次提交更新時(shí)Git都會(huì)對(duì)當(dāng)前的全部文件制作一個(gè)快照并保存這個(gè)快照的索引。為了高效,如果文件沒有修改, Git不再重新存儲(chǔ)該文件,而是只保留一個(gè)鏈接指向之前存儲(chǔ)的文件。所以Gt的工作方式可以稱之為快照流。

1.3 Git 文件管理機(jī)制細(xì)節(jié)
- Git的“提交對(duì)象”

- 提交對(duì)象及其父對(duì)象形成的鏈條

三、Git分支管理機(jī)制
1.1 分支的創(chuàng)建

1.2 分支的切換




四、Git 結(jié)合Github
1.1 創(chuàng)建遠(yuǎn)程庫地址別名
git remote -v #查看遠(yuǎn)程地址別名
git remote add 別名 遠(yuǎn)程地址
例子:git remote add origin https://xx

1.2 推送
開發(fā)修改完把本地庫的文件推送到遠(yuǎn)程倉庫
前提是提交到了本地庫才可以推送
git push 別名 分支名
git push -u 別名 分支名 #-u指定默認(rèn)主機(jī)
例子:git push origin master
1.3 克隆
完整的把遠(yuǎn)程庫克隆到本地
克隆下來后不要在主分支里面做開發(fā)
clone進(jìn)行一次,從無到有的過程,更新用pull
git clone [遠(yuǎn)程地址]
例子:git clone https://xx

clone之后的效果:
- 完整的把遠(yuǎn)程庫克隆到本地
- 創(chuàng)建 origin 遠(yuǎn)程地址別名
- 初始化本地庫
1.4 拉取
本地存在 clone 下來的文件 就用 pull 更新
pull = fetch(抓?。?+ merge(合并)
git fetch [遠(yuǎn)程庫地址別名] [遠(yuǎn)程分支名]
git merge [遠(yuǎn)程庫地址別名/遠(yuǎn)程分支名]
git pull [遠(yuǎn)程庫地址別名] [遠(yuǎn)程分支名]
1.5 解決沖突
要點(diǎn):如果不是基于GitHub遠(yuǎn)程庫的最新版所做的修改,不能推送,必須先拉取pull。
拉取下來后如果進(jìn)入沖突狀態(tài),則按照 "分支沖突解決" 操作。
注意:解決沖突后的提交是不能帶文件名的
1.6 rebase
提交記錄簡(jiǎn)潔不分叉
沒學(xué)懂,感覺有點(diǎn)雞肋
混眼熟
git rebase -i 索引號(hào)
git rebase -i HEAD~3 #合并最近三條記錄
說明:在vim編輯里面改成s
1.7 beyond compare
用軟件解決沖突
1.安裝 :
beyond compare
2.配置:
git config --local merge.tool bc3 #合并名稱
git config --local mergetool.path '/usr/local/bin/bcomp' #軟件路徑
git config --local mergetool.keepBackup false #False不用保存?zhèn)浞?3.應(yīng)用:
git mergetool
說明:--local指只在當(dāng)前操作系統(tǒng)有效
1.8 跨團(tuán)隊(duì)合作
-
Fork 本地克隆clone修改,然后推送到遠(yuǎn)程庫push
-
Pull Request 請(qǐng)求
-
Create pull request 發(fā)消息
-
兩個(gè)人可以進(jìn)行對(duì)話
-
代碼審核review
-
合并代碼
-
填寫本次操作的日志信息
將遠(yuǎn)程庫修改拉取到本地(結(jié)束)
- 適用于個(gè)人
邀請(qǐng)成員:Settings --> Collaborators -->填寫用戶名 -->打開鏈接接受邀請(qǐng)
企業(yè)
創(chuàng)建一個(gè)組織方便管理-
review
組織做review通過Pull request -
給開源社區(qū)共享代碼
點(diǎn)擊別人倉庫的 fork 到自己的倉庫-- >然后 clone 下來 修改后推送到遠(yuǎn)程庫-->點(diǎn)擊Pull Request請(qǐng)求-->Create pull request發(fā)消息
1.9 Tag標(biāo)簽
為了清晰的版本管理,公司一般不會(huì)直接使用 commit 提交
git tag -a v1.0 -m '版本介紹' #創(chuàng)建本地 tag 信息
git tag -d v1.0 #刪除 tag
git push origin --tags #將本地 tag 信息推送到遠(yuǎn)程庫
git pull origin --tags #拉取到本地
git checkout v.10 #切換 tag
git clone -b v0.1 地址 #指定 tag下載代碼
1.10 SSH 免密登錄
- 輸入:
ssh-keygen -t rsa -C GitHub郵箱地址 - 進(jìn)入
.ssh目錄,復(fù)制id_rsa.pub文件內(nèi)容 - 登錄GitHub。
Settings-->SSH and GPG keys-->New SSH Key - 回到git通過ssh地址創(chuàng)建。
git remote add 別名 SSH地址
五、Git工作流
1.1 概念
- 在項(xiàng)目開發(fā)過程中使用Git的方式
1.2 分類
1.2.1 集中式工作流
像SVN一樣,集中式工作流有一個(gè)中央倉庫,所有的修改都提交到了Master分支上
-
這種方式與SVN的只要區(qū)別就是開發(fā)人員有本地庫。Git很多特性并沒有用到。
1.2.2 GitFlow工作流 (重要)
主干分支
master開發(fā)分支develop修復(fù)分支hotfix預(yù)發(fā)布分支release功能分支feature-
GitFlow 有獨(dú)立的分支,讓發(fā)布迭代過程更流暢。

1.2.3 Forking 工作流
在 GitFlow 基礎(chǔ)上, 充分利用了 Git 的 Fork 和 pull request 的功能以達(dá)到代碼審核的目的。
-
安全可靠地管理大團(tuán)隊(duì)的開發(fā)者












