目錄:
git
版本控制介紹github
什麼是版本控制數據庫
爲何要版本控制安全
本地版本控制系統服務器
集中化的版本控制系統網絡
分佈式版本控制系統app
認識 Git分佈式
Git 簡史ide
Git 與其餘版本管理系統的主要區別工具
Git 的三種狀態
Git 使用快速入門
獲取 Git 倉庫
記錄每次更新到倉庫
推送改動到遠程倉庫
遠程倉庫的移除與重命名
查看提交歷史
撤銷操做
分支
推薦閱讀
版本控制是一種記錄一個或若干文件內容變化,以便未來查閱特定版本修訂狀況的系統。 除了項目源代碼,你能夠對任何類型的文件進行版本控制。
有了它你就能夠將某個文件回溯到以前的狀態,甚至將整個項目都回退到過去某個時間點的狀態,你能夠比較文件的變化細節,查出最後是誰修改了哪一個地方,從而找出致使怪異問題出現的緣由,又是誰在什麼時候報告了某個功能缺陷等等。
許多人習慣用複製整個項目目錄的方式來保存不一樣的版本,或許還會更名加上備份時間以示區別。 這麼作惟一的好處就是簡單,可是特別容易犯錯。 有時候會混淆所在的工做目錄,一不當心會寫錯文件或者覆蓋意想外的文件。
爲了解決這個問題,人們好久之前就開發了許多種本地版本控制系統,大多都是採用某種簡單的數據庫來記錄文件的歷次更新差別。下圖來源於Git官網。
接下來人們又遇到一個問題,如何讓在不一樣系統上的開發者協同工做? 因而,集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS)應運而生。
集中化的版本控制系統都有一個單一的集中管理的服務器,保存全部文件的修訂版本,而協同工做的人們都經過客戶端連到這臺服務器,取出最新的文件或者提交更新。下圖來源於Git官網。
這麼作雖然解決了本地版本控制系統沒法讓在不一樣系統上的開發者協同工做的詬病,但也仍是存在下面的問題:
•單點故障:中央服務器宕機,則其餘人沒法使用;若是中心數據庫磁盤損壞有沒有進行備份,你將丟失全部數據。本地版本控制系統也存在相似問題,只要整個項目的歷史記錄被保存在單一位置,就有丟失全部歷史更新記錄的風險。•必須聯網才能工做:受網絡情況、帶寬影響。
因而分佈式版本控制系統(Distributed Version Control System,簡稱 DVCS)面世了。 Git 就是一個典型的分佈式版本控制系統。
這類系統,客戶端並不僅提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。 這麼一來,任何一處協同工做用的服務器發生故障,過後均可以用任何一個鏡像出來的本地倉庫恢復。 由於每一次的克隆操做,實際上都是一次對代碼倉庫的完整備份。下圖來源於Git官網。
分佈式版本控制系統能夠不用聯網就能夠工做,由於每一個人的電腦上都是完整的版本庫,當你修改了某個文件後,你只須要將本身的修改推送給別人就能夠了。可是,在實際使用分佈式版本控制系統的時候,不多會直接進行推送修改,而是使用一臺充當「中央服務器」的東西。這個服務器的做用僅僅是用來方便「交換」你們的修改,沒有它你們也同樣幹活,只是交換修改不方便而已。
分佈式版本控制系統的優點不單是沒必要聯網這麼簡單,後面咱們還會看到 Git 極其強大的分支管理等功能。
Linux 內核項目組當時使用分佈式版本控制系統 BitKeeper 來管理和維護代碼。可是,後來開發 BitKeeper 的商業公司同 Linux 內核開源社區的合做關係結束,他們收回了 Linux 內核社區無償使用 BitKeeper 的權力。 Linux 開源社區(特別是 Linux 的締造者 Linus Torvalds)基於使用 BitKeeper 時的經驗教訓,開發出本身的版本系統,並且對新的版本控制系統作了不少改進。
Git 在保存和對待各類信息的時候與其它版本控制系統有很大差別,儘管操做起來的命令形式很是相近,理解這些差別將有助於防止你使用中的困惑。
下面咱們主要說一個關於 Git 其餘版本管理系統的主要差異:對待數據的方式。
Git採用的是直接記錄快照的方式,而非差別比較。我後面會詳細介紹這兩種方式的差異。
大部分版本控制系統(CVS、Subversion、Perforce、Bazaar 等等)都是以文件變動列表的方式存儲信息,這類系統將它們保存的信息看做是一組基本文件和每一個文件隨時間逐步累積的差別。
具體原理以下圖所示,理解起來其實很簡單,每一個咱們對提交更新一個文件以後,系統記錄都會記錄這個文件作了哪些更新,以增量符號Δ(Delta)表示。下圖來源於Git官網。
咱們怎樣才能獲得一個文件的最終版本呢?
很簡單,高中數學的基本知識,咱們只須要將這些原文件和這些增長進行相加就好了。
這種方式有什麼問題呢?
好比咱們的增量特別特別多的話,若是咱們要獲得最終的文件是否是會耗費時間和性能。
Git 不按照以上方式對待或保存數據。 反之,Git 更像是把數據看做是對小型文件系統的一組快照。 每次你提交更新,或在 Git 中保存項目狀態時,它主要對當時的所有文件製做一個快照並保存這個快照的索引。 爲了高效,若是文件沒有修改,Git 再也不從新存儲該文件,而是隻保留一個連接指向以前存儲的文件。 Git 對待數據更像是一個 快照流。下圖來源於Git官網。
Git 有三種狀態,你的文件可能處於其中之一:
•已提交(committed):數據已經安全的保存在本地數據庫中。•已修改(modified):已修改表示修改了文件,但還沒保存到數據庫中。•已暫存(staged):表示對一個已修改文件的當前版本作了標記,使之包含在下次提交的快照中。
由此引入 Git 項目的三個工做區域的概念:Git 倉庫(.git directoty) 、工做目錄(Working Directory) 以及 暫存區域(Staging Area) 。下圖來源於Git官網。
基本的 Git 工做流程以下:
•在工做目錄中修改文件。•暫存文件,將文件的快照放入暫存區域。•提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。
有兩種取得 Git 項目倉庫的方法。
•在現有目錄中初始化倉庫: 進入項目目錄運行 git init
命令,該命令將建立一個名爲 .git
的子目錄。•從一個服務器克隆一個現有的 Git 倉庫: git clone [url]
自定義本地倉庫的名字: git clone [url]
directoryname
•檢測當前文件狀態 : 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
這三條命令的集合)
若是你尚未克隆現有倉庫,並欲將你的倉庫鏈接到某個遠程服務器,你可使用以下命令添加:·git remote add origin <server>
,好比咱們要讓本地的一個倉庫和 Github 上建立的一個倉庫關聯能夠這樣git remote add origin https://github.com/Snailclimb/test.git
將
將這些改動提交到遠端倉庫:git push origin master
(能夠把 master 換成你想要推送的任何分支)
如此你就可以將你的改動推送到所添加的服務器上去了。
•將 test 重命名位 test1:git remote rename test test1
•移除遠程倉庫 test1:git remote rm test1
在提交了若干更新,又或者克隆了某個項目以後,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的工具是 git log
命令。git log
會按提交時間列出全部的更新,最近的更新排在最上面。
能夠添加一些參數來查看本身但願看到的內容:
只看某我的的提交記錄:
git log --author=bob
有時候咱們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,能夠運行帶有 --amend
選項的提交命令嘗試從新提交:
git commit --amend
取消暫存的文件
git reset filename
撤消對文件的修改:
git checkout -- filename
假如你想丟棄你在本地的全部改動與提交,能夠到服務器上獲取最新的版本歷史,並將你本地主分支指向它:
git fetch origingit reset --hard origin/master
分支是用來將特性開發絕緣開來的。在你建立倉庫的時候,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
轉自公衆號: JavaGuide