Git 是 分布式版本管理工具炼蹦。因為這里在開發(fā)后臺時候使用逮壁,所以寫在后臺開發(fā)相關的分類下颓遏。
1. 簡介
Git 是最先進的分布式版本管理工具徐矩。具體用起來就像下圖這樣∪保可以看到滤灯,對于每一個版本,都會有修改的具體說明遥皂,這樣一來力喷,方便我們進行版本控制、切換等演训。
2. 使用
安裝完成就可以使用了弟孟。
這里我在 windows 下使用 git。其實最好還是在 linux 下來用样悟。
word 文件作為二進制的文件拂募,不能被 Git 跟蹤庭猩。
2.1 建立版本庫
git init // 初始化 版本庫 命令
在相應的目錄下,使用 git init 命令陈症“可以看到在對應的目錄下生成了 一個 .git 隱藏文件,這里面寫的就是文件版本管理控制的相關信息录肯,不能被篡改(所以才是隱藏的)趴腋。
2.2 添加文件到版本庫
git add [FileName1]
git add [FileName2] // 添加 多個文件
git commit -m "[Description]" // 提交。 -m 后面是本次提交 的 說明
這里论咏,建立一個 txt 文件优炬,寫入 兩行 文字,然后add 和 commit
2.3 版本回退
這里修改一哈 test.txt 文件厅贪,在第二行最后加入 BEST蠢护,然后 使用 git status 命令查看倉庫狀態(tài)⊙蹋可以看到葵硕,當前 test.txt 被修改,但是還沒有提交贯吓。
如果我們要看 改了 什么內(nèi)容懈凹,使用 git diff 命令⌒觯可以看到蘸劈,紅色哪一行代表的是更改之前版本,綠色是更改之后的尊沸,所以是在那一句后面 加了 BEST威沫。
之后進行提交。
之后查看一下 status 洼专,可以看到 working tree clean.
再提交一個新的版本棒掠。
這時候看一下歷史版本,使用
git log // --pretty=oneline
這時候可以看到我們一共提交了3個版本的文檔屁商,對應的有 ID(使用哈希加密算法算出來的一大串數(shù)字烟很,為了在分布式工作時候不會產(chǎn)生沖突)、備注等±猓現(xiàn)在我們想要把版本回退到 "append REEDIT" 的版本雾袱。
Git 用 HEAD 表示當前的版本,上一個版本就是 HEAD^官还,依次類推芹橡,HEAD~100
git reset --hard HEAD^ // 回退到上一個版本
這時候還是可以到第三個版本的。只需要找到第三個版本的 ID 號即可望伦。
git reflog // 記錄每一次命令
3. 相關知識
3.1 工作區(qū)和暫存區(qū)
使用 git add 命令就是把 工作區(qū) 添加到 暫存區(qū)林说;
使用 git commit 命令就是把 暫存區(qū)所有的文件添加到當前分支煎殷。
仍然是之前的多次 add , 一次 commit 的關系。
3.2 管理修改
這里要明白一個概念就是說 Git 是管理的修改信息腿箩,而不是直接管理文件的豪直。所以如果執(zhí)行 修改1--> add 1 -->修改2-->commit,這個時候可以看到只是保存了 修改1 對應的內(nèi)容珠移。
3.3 撤銷修改
git checkout -- [FILENAME] // 用 版本庫 里 的版本 替換 工作區(qū) 的版本弓乙。
這里有兩種情況:
一種是 沒有 add到 暫存區(qū),這時候撤銷就是 回到 .git 版本庫中的版本
一種是 沒有 commit 之前又 進行了修改剑梳,這時候撤銷就是 回到 暫存區(qū) 的狀態(tài)唆貌。 ( 暫存區(qū)也是版本庫中的)
總之就是 回到 git commit 或者 git add 的 最近一次有記錄的版本。
git reset HEAD test.txt // 可以把 暫存區(qū) 的 test.txt 退回到 工作區(qū)
之前說的是版本回退用 git reset HEAD --hard 命令垢乙。 這里也可以 進行回退工作。
git rm [FILENAME] 用來刪除 .git 版本庫中的文件
這里的情景是你手動在文件目錄中刪除了 test.txt 文件语卤,然后可以查看 status 看到其文件被刪除追逮,但是這個時候在版本庫中還是有 這個文件的,為了做到對應粹舵,用 git rm 命令刪除版本庫中的文件钮孵。
4. 遠程倉庫
4.1 關聯(lián)遠程倉庫
這一部分是最常用的了。
這里用本地倉庫來關聯(lián) github 上面的遠程倉庫眼滤。
首先申請一個 github 的賬號巴席,然后 新建一個 repository。
這里本地關聯(lián)線上倉庫需要 SSH key 用于安全驗證诅需,向 github 證明是你自己進行上傳漾唉。所以需要首先配置一下 SSH key 相關。在本地 配置一個 SSH key堰塌,然后在 github 的賬號設置里面把 本地的 SSH key 公鑰寫進去赵刑。
windows 下 shift+右鍵 打開 git bash. 然后 ssh-keygen -t rsa -C "[EmailAddr]" 就生成了 SSH keys. 在 Windows 下就是 c/users/username/.ssh 目錄下 就會有 SSH keys 配置文件。id_rsa 是私鑰场刑,id_rsa.pub是公鑰般此。
然后進行關聯(lián)。這里 git remote add [RemoteRepName] [RemoteAddr]牵现。默認用了 origin 铐懊,一般看到這個 origin 都知道是遠程倉庫。
然后可以 push 一哈瞎疼。push 命令就是把本地倉庫的指定分支都 push 到線上倉庫科乎。可以看到這里的 git push origin master 把本地 master 分支 push 到 origin.
可以看到線上的 Github 已經(jīng)有了
4.2 分支
分支就好像是在 master 之前跑的一點的一個進度丑慎。如果你在開發(fā)工程喜喂,自己寫的代碼還沒有確定是萬無一失的瓤摧,就需要一個分支,先存下來玉吁,而這個分支不會影響 master 中的代碼照弥。
我們看一下具體的例子。
在線上建立一個 名為 gitskills 倉庫进副。然后 git clone 下來这揣。
創(chuàng)建一個 dev 分支
git branch dev // 創(chuàng)建
git checkout dev // 切換
然后 git branch 查看分支。帶 * 的是當前分支
然后更改 readme.md影斑,之后提交更改给赞。
之后切換到 master 分支,發(fā)現(xiàn)在 dev 分支里面做的更改矫户,已經(jīng)看不到了片迅。說明 dev 分支和 master 分支是獨立的。
現(xiàn)在合并分支皆辽,可以看到柑蛇,dev 分支被合并到 master 分支,里面的更改是可見的了驱闷。
git merge [BranchName] #合并分支到當前分支耻台。
分支合并之后,刪除之前的分支空另,世界又清凈整潔了盆耽。
解決沖突
建立一個 feature1 分支,然后在該分支下 編輯 readme.md 之后提交扼菠;然后在 master 分支下也編輯 提交摄杂。兩次編輯的內(nèi)容不同。這時候 merge 就會產(chǎn)生 conflict
這時候查看 文件娇豫〕捉看到了不同的地方,然后手動 更改冯痢。
之后再提交氮昧,可以看到 conf 解決了,合并成功了浦楣⌒浞剩可以刪除 feature1 分支了。
git log --graph 可以查看分支合并圖
no-ff 模式合并
直接用 merge 都是普通合并模式振劳,采用 fast-foward 方式合并椎组。如果加參數(shù) --no-ff 則是 recursive 方式合并。
這種合并方式要提交一個新的 commit 历恐,所以要加一個 -m 參數(shù)寸癌。
no-ff 和普通合并的區(qū)別在于专筷,no-ff 方式可以保留分支歷史。
分支策略
一張圖說明分支策略蒸苇。即 master 只用來做新版本發(fā)布磷蛹,開發(fā)都在 dev,每個人又有自己的分支溪烤。
5. 常用操作
git push # 自然要求是有 remote 倉庫的味咳。 這個時候不用指定分支,直接是之前 clone 的分支
git commit 操作之后會自動生成一個版本序列號檬嘀。然后 git push 把本地倉庫的版本序列號同步到遠程倉庫
git clone # 將遠程倉庫 clone 下來
這個操作會自動和被克隆的倉庫 remote 連接槽驶。
git fetch
首先要了解 FETCH_HEAD:是一個版本鏈接文件,記錄在 .git/ 目錄下鸳兽,記錄著 目前已經(jīng)從遠程倉庫取下來的分支的末端版本(即取的時候的最新版本)掂铐。
而 git fetch 命令就是 更新遠程倉庫中包含分支的最新版本號,記錄到本地FETCH_HEAD文件中(即將本地版本和遠程最新版本對應起來揍异。)
git pull
其實 git pull 相當于一個復合命令堡纬。
首先,基于本地的 FETCH_HEAD 記錄蒿秦,比對本地的 FETCH_HEAD 記錄與遠程倉庫的版本號,然后 git fetch 獲取當前指向分支的后續(xù)版本數(shù)據(jù)蛋济,然后利用 git merge 將其與本地的當前分支合并棍鳖。
總之,就是把當前分支的最新的版本從遠程倉庫拉下來碗旅,與本地倉庫的版本來 merge 一哈渡处。