?其他系列文章導航
設計模式合集
多線程合集
分布式合集
ES合集
文章目錄
?其他系列文章導航
文章目錄
前言
版本控制
什么是版本控制
為什么要版本控制
一、認識 Git
1.1Git 簡史
1.2Git 與其他版本管理系統的主要區別
1.3Git 的三種狀態
二、Git 使用快速入門
2.1獲取 Git 倉庫
2.2記錄每次更新到倉庫
2.3推送改動到遠程倉庫
2.4遠程倉庫的移除與重命名
2.5查看提交歷史
2.6撤銷操作
2.7分支
前言
版本控制
什么是版本控制
版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。 除了項目源代碼,你可以對任何類型的文件進行版本控制。
為什么要版本控制
有了它你就可以將某個文件回溯到之前的狀態,甚至將整個項目都回退到過去某個時間點的狀態,你可以比較文件的變化細節,查出最后是誰修改了哪個地方,從而找出導致怪異問題出現的原因,又是誰在何時報告了某個功能缺陷等等。
一、認識 Git
1.1Git 簡史
Linux 內核項目組當時使用分布式版本控制系統 BitKeeper 來管理和維護代碼。但是,后來開發 BitKeeper 的商業公司同 Linux 內核開源社區的合作關系結束,他們收回了 Linux 內核社區免費使用 BitKeeper 的權力。 Linux 開源社區(特別是 Linux 的締造者 Linus Torvalds)基于使用 BitKeeper 時的經驗教訓,開發出自己的版本系統,而且對新的版本控制系統做了很多改進。
1.2Git 與其他版本管理系統的主要區別
Git 在保存和對待各種信息的時候與其它版本控制系統有很大差異,盡管操作起來的命令形式非常相近,理解這些差異將有助于防止你使用中的困惑。
下面我們主要說一個關于 Git 與其他版本管理系統的主要差別:對待數據的方式。
Git 采用的是直接記錄快照的方式,而非差異比較。我后面會詳細介紹這兩種方式的差別。
大部分版本控制系統(CVS、Subversion、Perforce、Bazaar 等等)都是以文件變更列表的方式存儲信息,這類系統將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異。
具體原理如下圖所示,理解起來其實很簡單,每當我們提交更新一個文件之后,系統都會記錄這個文件做了哪些更新,以增量符號 Δ(Delta)表示。
我們怎樣才能得到一個文件的最終版本呢?
很簡單,高中數學的基本知識,我們只需要將這些原文件和這些增加進行相加就行了。
這種方式有什么問題呢?
比如我們的增量特別特別多的話,如果我們要得到最終的文件是不是會耗費時間和性能。
Git 不按照以上方式對待或保存數據。 反之,Git 更像是把數據看作是對小型文件系統的一組快照。 每次你提交更新,或在 Git 中保存項目狀態時,它主要對當時的全部文件制作一個快照并保存這個快照的索引。 為了高效,如果文件沒有修改,Git 不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件。 Git 對待數據更像是一個 快照流。
1.3Git 的三種狀態
Git 有三種狀態,你的文件可能處于其中之一:
- 已提交(committed):數據已經安全的保存在本地數據庫中。
- 已修改(modified):已修改表示修改了文件,但還沒保存到數據庫中。
- 已暫存(staged):表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
由此引入 Git 項目的三個工作區域的概念:Git 倉庫(.git directory)、工作目錄(Working Directory) 以及 暫存區域(Staging Area) 。
基本的 Git 工作流程如下:
- 在工作目錄中修改文件。
- 暫存文件,將文件的快照放入暫存區域。
- 提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。
二、Git 使用快速入門
2.1獲取 Git 倉庫
有兩種取得 Git 項目倉庫的方法。
- 在現有目錄中初始化倉庫: 進入項目目錄運行
git init
命令,該命令將創建一個名為.git
的子目錄。 - 從一個服務器克隆一個現有的 Git 倉庫:
git clone [url]
自定義本地倉庫的名字:git clone [url] directoryname
2.2記錄每次更新到倉庫
- 檢測當前文件狀態 :
git status
- 提出更改(把它們添加到暫存區):
git add filename
(針對特定文件)、git add *
(所有文件)、git add *.txt
(支持通配符,所有 .txt 文件) - 忽略文件:
.gitignore
文件 - 提交更新:
git commit -m "代碼提交信息"
(每次準備提交前,先用git status
看下,是不是都已暫存起來了, 然后再運行提交命令git commit
) - 跳過使用暫存區域更新的方式 :
git commit -a -m "代碼提交信息"
。git commit
加上-a
選項,Git 就會自動把所有已經跟蹤過的文件暫存起來一并提交,從而跳過git add
步驟。 - 移除文件:
git rm filename
(從暫存區域移除,然后提交。) - 對文件重命名:
git mv README.md README
(這個命令相當于mv README.md README
、git rm README.md
、git add README
這三條命令的集合)
2.3推送改動到遠程倉庫
-
如果你還沒有克隆現有倉庫,并欲將你的倉庫連接到某個遠程服務器,你可以使用如下命令添加:
git remote add origin <server>
,比如我們要讓本地的一個倉庫和 GitHub 上創建的一個倉庫關聯可以這樣git remote add origin https://github.com/Snailclimb/test.git
-
將這些改動提交到遠端倉庫:
git push origin master
(可以把 master 換成你想要推送的任何分支)如此你就能夠將你的改動推送到所添加的服務器上去了。
2.4遠程倉庫的移除與重命名
- 將 test 重命名為 test1:
git remote rename test test1
- 移除遠程倉庫 test1:
git remote rm test1
2.5查看提交歷史
在提交了若干更新,又或者克隆了某個項目之后,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的工具是 git log
命令。git log
會按提交時間列出所有的更新,最近的更新排在最上面。
可以添加一些參數來查看自己希望看到的內容:
只看某個人的提交記錄:
git log --author=bob
2.6撤銷操作
有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有 --amend
選項的提交命令嘗試重新提交:
git commit --amend
取消暫存的文件
git reset filename
撤消對文件的修改:
git checkout -- filename
假如你想丟棄你在本地的所有改動與提交,可以到服務器上獲取最新的版本歷史,并將你本地主分支指向它:
git fetch origin
git reset --hard origin/master
2.7分支
分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master 是“默認”的分支。在其他分支上進行開發,完成后再將它們合并到主分支上。
我們通常在開發新功能、修復一個緊急 bug 等等時候會選擇創建分支。單分支開發好還是多分支開發好,還是要看具體場景來說。
創建一個名字叫做 test 的分支
git branch test
切換當前分支到 test(當你切換分支的時候,Git 會重置你的工作目錄,使其看起來像回到了你在那個分支上最后一次提交的樣子。 Git 會自動添加、刪除、修改文件以確保此時你的工作目錄和這個分支最后一次提交時的樣子一模一樣)
git checkout test
你也可以直接這樣創建分支并切換過去(上面兩條命令的合寫)
git checkout -b feature_x
切換到主分支
git checkout master
合并分支(可能會有沖突)
git merge test
把新建的分支刪掉
git branch -d feature_x
將分支推送到遠端倉庫(推送成功后其他人可見):
git push origin