1. 程式人生 > >Git本地版本管理

Git本地版本管理

一些基本概念

分散式版本控制系統

Git 是一種分散式版本控制系統 (Distributed Version Control System DVCS) 。這種系統下,客戶端不只是簡單地拉取某個版本的檔案,而是把整個記錄檔案版本的資料庫(即整個程式碼倉庫)都克隆到本地系統上。這樣以來,任何一處協同工作用的伺服器發生故障,事後都可以用任何一個映象出來的本地倉庫恢復。因為每一次的克隆工作,實際上都是一次對程式碼倉庫的完整備份。

這裡寫圖片描述

儲存方式

Git 中所有資料在儲存前都會計算校驗和,然後以校驗和來引用某個版本的檔案,該校驗和是根據檔案的內容或目錄結構使用 SHA-1 雜湊演算法計算出來的,比如:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 資料庫中儲存的資訊都是以檔案內容的雜湊值來索引,而不是檔名。

三種狀態

Git 最重要的地方是有三個區:

  • Git 倉庫:這個就是儲存各種檔案版本的資料庫,可以向這個資料庫中拉取各個檔案版本或把更新後的檔案推入資料庫進行記錄。這是 Git 用來儲存專案的元資料和物件資料庫的地方,是 Git 最重要的部分,從其他計算機克隆倉庫時,拷貝的就是這裡的資料。已經推入到這個資料庫中的檔案對應的狀態是 已提交 (commited)
  • 暫存區域:這個區域用來儲存對當前已修改過並且作了版本標記的檔案,在同一段時間內位於暫存區尚未提交的所有檔案都屬於同一個當前的版本,這些標記使得對應檔案被包含在下次提交的快照中。這個區域是一個檔案,儲存了下次將提交的檔案列表
    資訊,一般位於 Git 倉庫目錄中。在這個區域的檔案狀態是 已暫存 (staged)
  • 工作目錄:這個區域就是開發人員寫程式碼的地方,對於已經修改並儲存的檔案,都會儲存在這個區域,等待轉移到暫存區並提交。它是對專案的某個版本獨立提取出來的內容。那些從 Git 倉庫的壓縮資料庫中提取出來的檔案,就是放在這個區域所在的磁碟上供你使用或修改。在這個區域的檔案狀態是 已修改 (modified)

這裡寫圖片描述

Git 工作三部曲

  1. 在工作目錄修改檔案;
  2. 將修改的檔案對應的檔案快照上傳到暫存區。
  3. 提交更新,找到暫存區域的檔案,將快照永久性儲存到 Git 倉庫目錄。

常用命令

配置使用者名稱和密碼

$ git config --global user.name "Jack Cheng"
$ git config --global user.email "[email protected]"

如果使用了 --global 選項,則該命令只需要提交一次,無論你以後在系統中執行何種操作,Git 都會使用這種配置。如果你想針對某個特定的專案使用不同的使用者名稱稱和郵箱,可以在那個專案目錄下執行沒有 --global 選項的命令來配置。

檢查配置資訊

$ git config --list

檢查具體某一項的配置

$ git config user.name

獲取幫助

$ git help config
$ git help push

建立倉庫

$ git init

這個命令將建立一個名為 .git 的子目錄,這個字目錄含有你初始化的 Git 倉庫中所有的必須檔案,這些檔案是 Git 倉庫的骨幹。但是這只是做了一個初始化操作,在當地資料夾的專案裡的檔案還沒有被跟蹤。使用 git add 命令來跟蹤檔案,使用 git commit 命令來提交檔案到本地的 Git 倉庫中。

檢查狀態

$ git status

可以檢視當前倉庫哪些檔案處於未跟蹤狀態,哪些檔案已經放入暫存區等待提交。

這裡寫圖片描述

可以看到 .DS_Store 檔案位於 Untracked files 標題下,表示這個檔案是新建立的未被跟蹤的檔案,Git 倉庫中不存在這個檔案的資訊。

這裡寫圖片描述

可以看到這個時候 .gitignore 檔案位於 Changes to be commited 這個標題下面,說明這個檔案已經被移入暫存區了,處於已暫存的狀態。

把已修改或未跟蹤的檔案放入暫存區

$ git add 檔名

git add 不僅可以跟蹤新檔案並放到暫存區,還能把已修改的檔案也放到暫存區,這是一個多功能命令。放到暫存區的這些檔案在下次提交時將會一併提交到 Git 倉庫中。因此對於 git add 命令的最好翻譯是 “新增內容到下一次的提交中”。

$ git add 檔案目錄

此時 git add 命令將遞迴地跟蹤該目錄下的所有檔案,並把目錄下的所有檔案都放入暫存區。

檢視已暫存的檔案和當前工作目錄中檔案的差異

$ git diff

git diff 命令可以檢視當前工作目錄中已修改的檔案和暫存區的檔案的差異(注意只是和暫存區的差異,不是和上次提交以來的差異,因此如果你把所有已經修改的檔案都新增到暫存區後,git diff 將不會返回任何東西)

檢視已暫存的檔案和上一次提交後的檔案的變化

$ git diff --staged 或者
$ git diff --cached

提交處於暫存區的所有檔案

$ git commit -m "說明當前做了什麼,以後版本回退時可以輕易找到"

注意提交的都是放在暫存區的檔案,每一次的提交的版本都會在歷史記錄中記錄下來,以後都可以回到這個版本。(只有 commit 以後的版本可以回退)

回到過去

$ git log

使用 git log 命令檢視歷史提交記錄:

這裡寫圖片描述

$ git log --pretty=oneline

為了簡化檢視,可以使用 git log --pretty=oneline 引數:

這裡寫圖片描述

$ git reset --hard commit_id 

找到要回退的版本的前面的 commit_id,然後使用 git reset --hard commit_id 命令來回退到想要的版本,只需要打出 commit_id 的前幾個字母即可,Git 會自動查詢對應的 id

這裡寫圖片描述

可以看到此時專案的最新版本已經回退到了 3950d 的版本。

從過去回到現在

$ git reflog

回退以後,會發現之前的最新版本 9fd77 已經不在 git log 的目錄中了,此時假如我們又想回到之前的最新的版本怎麼辦?首先使用 git reflog 命令來查詢提交 9fd77 時的記錄:

這裡寫圖片描述

git reset --hard commit_id

可以看到我們在回退前最新一次提交的 commit_id9fd77b1 ,因此我們再用 git reset --hard 9fd77b1 來進入到回退前的最新版本:

這裡寫圖片描述

因此,我們也就從過去回到現在了。

一些 trick

忽略檔案

有時候我們會有一些檔案不需要納入 Git 的管理,比如上面的 .DS_Store ,此時就應該編寫 .gitignore 檔案來列出要 Git 倉庫忽略的檔案模式。該檔案的格式規範如下:

  • # 開頭的行為 Git 的註釋。

  • 使用 / 放在檔名的開頭可以防止遞迴地忽略所有非當前目錄中的該檔案。比如

    TODO

    會忽略 Git 倉庫中所有目錄下的 TODO 檔案,但如果只希望 Git 忽略當前目錄下的 TODO 檔案,而不要忽略其它目錄下的 TODO 檔案,則應該寫成這樣:

    /TODO
  • 使用 / 放在檔名的末尾表明這個檔案是一個目錄,Git 將會忽略這個目錄下的所有檔案。

  • 如果希望 Git 只記錄某一個特定的檔案,而忽略除了這個檔案以外的所有檔案,可以在這個檔名前面使用 ! 取反。但是這種功能一般是用於以下情況:

    
    # 忽略所有的 .a 檔案
    
    *.a
    
    
    # 但是所有的 lib.a 檔案不能被忽略
    
    !lib.a
  • 指定檔案的格式一般要使用正則表示式:

    • * 匹配 0 個或多個任意字元;
    • [abc] 可以匹配任何一個在方框號中的字元(在這個例子中是要麼匹配一個a,要麼匹配一個b,要麼匹配一個c);
    • ? 只匹配一個任意字元;
    • [0-9] 表示匹配在 0 到 9 範圍內的所有數字。
    • 使用兩個星號 ** 表示匹配任意的中間目錄,比如 learn/**/git 可以匹配 learn/gitlearn/no/git 或者 learn/no/python/git

看一個 .gitignore 檔案的例子:

# 忽略所有以 .a 結尾的檔案
*.a

# 不能忽略所有 lib.a 檔案
!lib.a

# 僅僅忽略當前目錄下的 TODO 檔案
/TODO

# 忽略 build 目錄下的所有檔案
build/

# 僅僅忽略 doc 一個目錄下的所有 .txt 檔案
doc/*.txt

# 忽略 doc 目錄下(包括子目錄)的所有 .pdf 檔案
doc/**/*.pdf

移除檔案

最常見的情況是,在 .gitignore 檔案中未列出對應的檔案,有時為了貪求效率,使用 git add . 把所有檔案都放到暫存區域,包括把一些不希望加入 Git 版本管理的日誌檔案等也放進去了,這個時候我們希望可以從暫存區域中刪除這些不希望被管理的檔案,但是使這些檔案仍然被存放在工作目錄上,而不被 Git 繼續跟蹤。此時可以使用 git rm --cached filename 命令:

這裡寫圖片描述

這樣就可以把誤新增的檔案從暫存區中移除,而防止下一次 commit 時加入到 Git 倉庫中去。

還有一種情況就是,我希望刪除的檔案已經 commit 或者 add 了,即已經被跟蹤了,但我希望完全刪除這個檔案,即把工作目錄中的這個檔案也刪了,這時我們就可以先在本地專案目錄中刪除這個檔案,然後再使用 git rm filename 命令把該檔案從已跟蹤的檔案清單中一併刪除:

這裡寫圖片描述

這個是檔案已經 add 但沒有 commit 的情況,使用 git rm 命令就直接清空了,如果檔案之前有過 commit ,而你又把想刪除的檔案從工作目錄中刪除了:

這裡寫圖片描述

可以看到刪除檔案的操作記錄在 Changes not staged for commit 標題下, 意味著你需要把這個刪除的操作再提交一遍,使得 Git 倉庫知道這個檔案已經刪除了,不應該再被跟蹤了。

移動檔案

如果要在 Git 中對某些檔案進行重新命名,可以使用 git mv original_name target_name 命令:

這裡寫圖片描述

執行這個命令後,可以看到在工作目錄中的 test.cpp 也被重新命名為 main.cpp 了,這個時候只要提交這次重新命名操作就可以了。

參考資料

相關推薦

Git本地版本管理

一些基本概念 分散式版本控制系統 Git 是一種分散式版本控制系統 (Distributed Version Control System DVCS) 。這種系統下,客戶端不只是簡單地拉取某個版本的檔案,而是把整個記錄檔案版本的資料庫(即整個程式碼倉庫)

git本地分支管理

master diff mas 命名 創建 out git diff 創建分支 合並 查看分支:git branch創建分支:git branch dev重命名分支:git branch -m dev dev1刪除分支:git branch -d dev切換分支:git c

【書摘】一種基於Git版本管理方案

功能 前端 需要 bug evel 熱修復 per person feature 本篇摘錄自《前端工程化體系設計與實踐》一書,筆者認為是一套相對合理的方案,建議團隊可以根據實際情況進行調整並增加協作命名規範。 master分支——主分支 存儲已發布版本的源碼,不能在此

git--分散式版本管理系統

參考部落格:廖雪峰的官方網站 一、window安裝git Git官網直接下載安裝程式,預設選項安裝即可。 1、設定自己的git(cmd命令或者git bash進入) git config --global user.name "myname" git config --global user.e

Git程式碼版本管理工具

Git Git 是分散式版本控制系統,原始碼管理工具。 作用:   方便協同開發、方便版本控制 分散式管理:伺服器和客戶端都有版本控制能力,都能進行程式碼的提交、合併、… Git會在根目錄下建立一個.git隱藏資料夾,作為原生代碼倉庫 Git伺服器 -

使用git進行版本管理

1.master分支  存放的應該是隨時可供在生產環境中部署的程式碼  當開發活動告一段落,產生了一份新的可供部署的程式碼時,master分支上的程式碼會被更新。同時,每一次更新,都有對應的版本號標籤(TAG)。  分支命名:master  該分支,由管理員負

微信小程式如何使用Git實現版本管理

在微信小程式開發的過程中,程式碼版本管理往往需要使用第三方工具進行管理。雖然微信Web開發工具提供了對Git檔案版本狀態的提示,但實際的使用體驗依然不盡人意。 隨著微信Web開發工具的更新,最新的內測版本已經支援Git的直接管理,本文將就在微信Web開發工具中使用Git做版

git分散式版本管理工具學習筆記

綜述:來了新的公司,以前用的是svn,現在是git,在這裡總結學習下,提高自己的認識。 1.git介紹       svn、vcss系統等都是集中式的版本控制系統,git是分散式的。兩者的區別是: git 適合分散式開發,強調個體。 公共伺服器壓力和資料量都不會

git 分散式版本管理

git 分散式版本管理工具學習筆記 Git 誕生 配置 建立版本倉庫 把檔案新增到版本庫 常用commit提交註釋規範 檢視倉庫的當前狀態 檢視提交的歷史記錄 時光穿梭機 工作區和暫存區

關於git程式碼版本管理

什麼時候合程式碼,預發,線上環境 搜尋到兩篇文章 master,develop,feature,release https://www.cnblogs.com/amwuau/p/8021638.html https://www.cnblogs.com/amwuau/p/8021638

Git分散式版本管理系統

Git分散式版本管理系統CVS及SVN集中式版本管理系統原文:總結整理如下:*集中式vs分散式集中式版本控制系統的版本庫是集中存放在中央伺服器的,要先從中央伺服器取得最新的版本,再用自己的電腦幹活,幹完活再推送給中央伺服器。最大缺點就是必須聯網才能工作,若在網際網路上,網速慢

git版本管理使用(三)-拉取分支程式碼

git系列文章 參考文章 *之前2篇是在github上操作的git版本管理,這篇是在開源中國·碼雲 上面的git版本管理。使用下來都差不多,暫時沒有發現不一樣的內容。 關於分支內程式碼的拉取的問題: 問題詳述:看下圖,我們一般都是

Git 本地倉庫管理

目錄 基本概念 工作區(Working Directory): 就是你在電腦裡能看到的目錄 版本庫(Repository): 工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。 暫存區 : Git 的版本庫裡存了很多東西,其中最重要

git本地版本回退與遠端版本回退(回滾)

預備知識: 一個commit對應這一個版本,有一個commit id,40位的16進位制數字,通過SHA1計算得到,不同的檔案計算出來的SHA1值不同(有很小的機率相同,可忽略),這樣每一個提交都有其獨特的id。每提交一個新版本,實際上Git就會把它們自

Mac 系統使用Git進行版本管理

關於Git的介紹,網上一大堆,基本上來就是撕逼SVN的。我想說SVN你都用過它的幾個命令啊?被噴的一文不值似的。近幾年幾乎一直是 一個人開發,所以,神馬衝突之類的幾本沒遇到,SVN用的挺好,很有可能就是因為我幾乎只用幾個命令就完成我的需求了:更新,提交,做分支,就完事兒了。

Git 程式碼版本管理的基本使用命令和步驟

相信現在很多人做開發不再是一個人單打獨鬥了,而是跟隨一個小團隊或者帶領一個小團隊多人同步開發,那麼我們就需要一個程式碼版本管理器來協助我們。這個時候Git程式碼版本管理就是我們的不二選擇,下面介紹一下

軟工 實驗一 Git程式碼版本管理

實驗目的: 1)瞭解分散式版本控制系統的核心機理; 2)   熟練掌握git的基本指令和分支管理指令; 實驗內容: 1)安裝git 2)初始配置git ,git init git status指令 3)掌握git log ,git add ,git diff 指令 4) 掌握git tag

Git 版本管理 經驗:本地登入SSH認證

轉載地址:http://jingyan.baidu.com/article/6d704a13171c7428db51cacd.html; 注:可以不用在git bash中進行認證,因為如果是本地git伺服器的話,會要求提供git伺服器所在伺服器的密碼;不在git bash

linux運維、架構之路-git版本管理

nbsp font 同步 class ges 之路 blog git服務器 工作目錄 一、常見版本管理系統 1、SVN 集中式的版本控制系統,只有一個中央數據倉庫,如果中央數據倉庫掛了或者不能訪問,所有的使用者無法使用svn,無法進行提交或者備份文件 2、Gi

版本管理(一)之Git和GitHub的區別(優點和缺點)

機制 最大 客戶 內核 文件 敏捷 star 一定的 sch Git 簡介 https://www.yiibai.com/git/getting-started-git-basics.html Git 是一個開源的分布式版本控制系統,用於敏捷高效地處理任何或小或大的