git入門

版本控制

什么是版本控制

版本控制是一種記錄一個或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)。 除了項目源代碼,你可以對任何類型的文件進行版本控制。

為什么要版本控制

有了它你就可以將某個文件回溯到之前的狀態(tài),甚至將整個項目都回退到過去某個時間點的狀態(tài),你可以比較文件的變化細節(jié),查出最后是誰修改了哪個地方,從而找出導致怪異問題出現(xiàn)的原因,又是誰在何時報告了某個功能缺陷等等。

本地版本控制系統(tǒng)

許多人習慣用復制整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區(qū)別。 這么做唯一的好處就是簡單,但是特別容易犯錯。 有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件。

為了解決這個問題,人們很久以前就開發(fā)了許多種本地版本控制系統(tǒng),大多都是采用某種簡單的數(shù)據(jù)庫來記錄文件的歷次更新差異。下圖來源于Git官網(wǎng)。

image

集中化的版本控制系統(tǒng)

接下來人們又遇到一個問題,如何讓在不同系統(tǒng)上的開發(fā)者協(xié)同工作? 于是,集中化的版本控制系統(tǒng)(Centralized Version Control Systems,簡稱 CVCS)應運而生。

集中化的版本控制系統(tǒng)都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協(xié)同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。下圖來源于Git官網(wǎng)。

image

這么做雖然解決了本地版本控制系統(tǒng)無法讓在不同系統(tǒng)上的開發(fā)者協(xié)同工作的詬病,但也還是存在下面的問題:

?單點故障:中央服務器宕機,則其他人無法使用;如果中心數(shù)據(jù)庫磁盤損壞有沒有進行備份,你將丟失所有數(shù)據(jù)。本地版本控制系統(tǒng)也存在類似問題,只要整個項目的歷史記錄被保存在單一位置,就有丟失所有歷史更新記錄的風險。?必須聯(lián)網(wǎng)才能工作:受網(wǎng)絡狀況、帶寬影響。

分布式版本控制系統(tǒng)

于是分布式版本控制系統(tǒng)(Distributed Version Control System,簡稱 DVCS)面世了。 Git 就是一個典型的分布式版本控制系統(tǒng)。

這類系統(tǒng),客戶端并不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。 這么一來,任何一處協(xié)同工作用的服務器發(fā)生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復。 因為每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。下圖來源于Git官網(wǎng)。

image

分布式版本控制系統(tǒng)可以不用聯(lián)網(wǎng)就可以工作,因為每個人的電腦上都是完整的版本庫,當你修改了某個文件后,你只需要將自己的修改推送給別人就可以了。但是,在實際使用分布式版本控制系統(tǒng)的時候,很少會直接進行推送修改,而是使用一臺充當“中央服務器”的東西。這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。

分布式版本控制系統(tǒng)的優(yōu)勢不單是不必聯(lián)網(wǎng)這么簡單,后面我們還會看到 Git 極其強大的分支管理等功能。

認識 Git

Git 簡史

Linux 內(nèi)核項目組當時使用分布式版本控制系統(tǒng) BitKeeper 來管理和維護代碼。但是,后來開發(fā) BitKeeper 的商業(yè)公司同 Linux 內(nèi)核開源社區(qū)的合作關系結束,他們收回了 Linux 內(nèi)核社區(qū)免費使用 BitKeeper 的權力。 Linux 開源社區(qū)(特別是 Linux 的締造者 Linus Torvalds)基于使用 BitKeeper 時的經(jīng)驗教訓,開發(fā)出自己的版本系統(tǒng),而且對新的版本控制系統(tǒng)做了很多改進。

Git 與其他版本管理系統(tǒng)的主要區(qū)別

Git 在保存和對待各種信息的時候與其它版本控制系統(tǒng)有很大差異,盡管操作起來的命令形式非常相近,理解這些差異將有助于防止你使用中的困惑。

下面我們主要說一個關于 Git 其他版本管理系統(tǒng)的主要差別:對待數(shù)據(jù)的方式

Git采用的是直接記錄快照的方式,而非差異比較。我后面會詳細介紹這兩種方式的差別。

大部分版本控制系統(tǒng)(CVS、Subversion、Perforce、Bazaar 等等)都是以文件變更列表的方式存儲信息,這類系統(tǒng)將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異。

具體原理如下圖所示,理解起來其實很簡單,每個我們對提交更新一個文件之后,系統(tǒng)記錄都會記錄這個文件做了哪些更新,以增量符號Δ(Delta)表示。下圖來源于Git官網(wǎng)。

image

我們怎樣才能得到一個文件的最終版本呢?

很簡單,高中數(shù)學的基本知識,我們只需要將這些原文件和這些增加進行相加就行了。

這種方式有什么問題呢?

比如我們的增量特別特別多的話,如果我們要得到最終的文件是不是會耗費時間和性能。

Git 不按照以上方式對待或保存數(shù)據(jù)。 反之,Git 更像是把數(shù)據(jù)看作是對小型文件系統(tǒng)的一組快照。 每次你提交更新,或在 Git 中保存項目狀態(tài)時,它主要對當時的全部文件制作一個快照并保存這個快照的索引。 為了高效,如果文件沒有修改,Git 不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件。 Git 對待數(shù)據(jù)更像是一個 快照流。下圖來源于Git官網(wǎng)。

image

Git 的三種狀態(tài)

Git 有三種狀態(tài),你的文件可能處于其中之一:

?已提交(committed):數(shù)據(jù)已經(jīng)安全的保存在本地數(shù)據(jù)庫中。?已修改(modified):已修改表示修改了文件,但還沒保存到數(shù)據(jù)庫中。?已暫存(staged):表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。

由此引入 Git 項目的三個工作區(qū)域的概念:**Git 倉庫(.git directoty) 、****工作目錄(Working Directory) **以及 暫存區(qū)域(Staging Area) 。下圖來源于Git官網(wǎng)。

image

基本的 Git 工作流程如下:

?在工作目錄中修改文件。?暫存文件,將文件的快照放入暫存區(qū)域。?提交更新,找到暫存區(qū)域的文件,將快照永久性存儲到 Git 倉庫目錄。

Git 使用快速入門

獲取 Git 倉庫

有兩種取得 Git 項目倉庫的方法。

?在現(xiàn)有目錄中初始化倉庫: 進入項目目錄運行 git init 命令,該命令將創(chuàng)建一個名為 .git 的子目錄。?從一個服務器克隆一個現(xiàn)有的 Git 倉庫: git clone [url] 自定義本地倉庫的名字: git clone [url] directoryname

記錄每次更新到倉庫

?檢測當前文件狀態(tài) : git status?提出更改(把它們添加到暫存區(qū)):git add filename (針對特定文件)、git add *(所有文件)、git add *.txt(支持通配符,所有 .txt 文件)?忽略文件.gitignore 文件?提交更新: git commit -m "代碼提交信息" (每次準備提交前,先用 git status 看下,是不是都已暫存起來了, 然后再運行提交命令 git commit)?跳過使用暫存區(qū)域更新的方式 : git commit -a -m "代碼提交信息"。 git commit 加上 -a 選項,Git 就會自動把所有已經(jīng)跟蹤過的文件暫存起來一并提交,從而跳過 git add 步驟。?移除文件git rm filename (從暫存區(qū)域移除,然后提交。)?對文件重命名git mv README.md README(這個命令相當于mv README.md README、git rm README.mdgit add README 這三條命令的集合)

推送改動到遠程倉庫

  • 如果你還沒有克隆現(xiàn)有倉庫,并欲將你的倉庫連接到某個遠程服務器,你可以使用如下命令添加:·git remote add origin <server> ,比如我們要讓本地的一個倉庫和 Github 上創(chuàng)建的一個倉庫關聯(lián)可以這樣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 會按提交時間列出所有的更新,最近的更新排在最上面。

可以添加一些參數(shù)來查看自己希望看到的內(nèi)容:

只看某個人的提交記錄:

git log --author=bob

撤銷操作

有時候我們提交完了才發(fā)現(xiàn)漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有 --amend 選項的提交命令嘗試重新提交:

git commit --amend

取消暫存的文件

git reset filename

撤消對文件的修改:

git checkout -- filename

假如你想丟棄你在本地的所有改動與提交,可以到服務器上獲取最新的版本歷史,并將你本地主分支指向它:

git fetch origin

分支

分支是用來將特性開發(fā)絕緣開來的。在你創(chuàng)建倉庫的時候,master 是“默認的”分支。在其他分支上進行開發(fā),完成后再將它們合并到主分支上。

我們通常在開發(fā)新功能、修復一個緊急 bug 等等時候會選擇創(chuàng)建分支。單分支開發(fā)好還是多分支開發(fā)好,還是要看具體場景來說。

創(chuàng)建一個名字叫做 test 的分支

git branch test

切換當前分支到 test(當你切換分支的時候,Git 會重置你的工作目錄,使其看起來像回到了你在那個分支上最后一次提交的樣子。 Git 會自動添加、刪除、修改文件以確保此時你的工作目錄和這個分支最后一次提交時的樣子一模一樣)

git checkout test
image

你也可以直接這樣創(chuàng)建分支并切換過去(上面兩條命令的合寫)

git checkout -b test

切換到主分支

git checkout master

合并分支(可能會有沖突)

 git merge test

把新建的分支刪掉

git branch -d test

將分支推送到遠端倉庫(推送成功后其他人可見):

git push origin 

推薦閱讀

?Git - 簡明指南[1]: http://rogerdudler.github.io/git-guide/index.zh.html?圖解Git[2]:http://marklodato.github.io/visual-git-guide/index-zh-cn.html?猴子都能懂得Git入門[3]:https://backlog.com/git-tutorial/cn/intro/intro1_1.html?https://git-scm.com/book/en/v2[4]

References

[1] Git - 簡明指南: http://rogerdudler.github.io/git-guide/index.zh.html
[2]: https://git-scm.com/book/en/v2

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

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

  • 準備工作 git簡介: ??Git是目前世界上最先進的分布式版本控制系統(tǒng)(沒有之一,如果不認可,那就最流行的)。 ...
    Carl_TSNE閱讀 364評論 0 1
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,848評論 9 163
  • 我們做畢業(yè)設計一般包含代碼部分和論文,為了保存論文每次更改記錄,會復制重命名,對于代碼部分一般也會復制文件夾記錄版...
    langkong閱讀 707評論 0 0
  • 1、注冊 如果用微信直接注冊,用戶名會自動分配,不建議。 2、新建項目 3、Git 代碼托管 3.1 安裝設置Gi...
    wangbu2閱讀 3,101評論 0 5
  • Git入門教程 1. 基本原理 概述 Git是分布式版本控制系統(tǒng)(Distributed Version Cont...
    東方月初灬閱讀 200評論 0 1

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