當前位置:首頁 » 服務存儲 » git的存儲
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

git的存儲

發布時間: 2023-01-22 00:29:23

『壹』 【學了就忘】Git操作 — 48.Git存儲

有時當你在項目的一個分支上,已經工作一段時間後,所有東西都進入了混亂的狀態, 而這時你想要切換到另一個分支做一點別的事情。 問題是,你不想僅僅因為這點別的事,而把剛剛做了一半的工作進行一次提交。

針對這個問題,可以使用 git stash 命令來解決。(stash:貯藏)

git stash 命令會處理工作目錄的臟狀態,即:根據文件的修改與暫存的改動,然後將未完成的修改保存到一個棧上, 而你可以在任何時候重新應用這些改動(甚至在不同的分支上)。

現在本地版本庫中情況如下:

有兩分支, master 分支和 dev 分支。

此時正在開發 dev 分支中的 stash.txt 文件。

下面開始演示 git stash 命令用法。

1)從未完成工作 dev 分支,切換到 master 工作。

2)在 master 分支工作完成之後,在切換回 dev 分支。

3)刪除Git存儲棧中的內容

在工作中通常使用 git stash pop 命令,代替 git stash apply 和 git stash drop 命令。

『貳』 4、git add和git commit

git中的文件對象,最終都是存儲在.git/objects目錄中,以二進制形式存儲的。git既鬆散存儲,也進行差異化存儲。每次修改一個文件,會在.git/objects目錄中,生成一個二進制對象,當再次修改時,又生成另一個二進制對象,這即是鬆散存儲。但是當工作區的二進制對象數超過6700個時(數目可配置),git會進行一次打包行為,針對相同文件進行差異化存儲來減少文件數。

git大概總共有100多個命令,命令不是很多,但是每個命令,都可以帶很多參數,功能很強大。git命令總共分為兩類:高級命令和底層命令。

git add和git commit都屬於高級命令,高級命令是通過調用多個底層命令來完成操作,這一節希望大家能徹底搞明白git add和git commit.

舉個例子,假如我們新建一個工程,並新建了一個test.go文件,在這個文件里邊隨便寫一些內容,下面我們用底層命令來生成一個完整的git歷史記錄:

第一步:針對test.go文件生成二進制存儲對象

git hash-object命令就是針對某一個文件生成它的二進制存儲對象,並返回它的sha1簽名碼,假設返回的是""

第二步:更新索引文件

這一步是將我們上一步生成的對象以及它的路徑添加到索引中。用到了我們上一節講過的updae-index命令。

以上兩步命令和git add test.go命令完全等價。

第三步:生成目錄樹對象

調用write-tree命令之後,git會針對當前索引區的目錄結構,生成一個tree對象,並返回這個tree對象的sha1簽名碼,假設返回:d8329f

第四步:生成commit對象

echo後邊單引號里邊的內容就是我們的提交message了。第三步和第四步就是完成了一次git commit命令的操作。

大家可以試著操作一下以上四部命令,並觀察一下.git/objects目錄和工作區git狀態的變化。

『叄』 git是什麼工具

git是目前世界上最先進的分布式版本控制工具(沒有之一)。

Git認為其數據更像是一系列微型文件系統的快照。使用Git,每次提交或保存項目狀態時,Git基本上都會記錄當時所有文件的外觀,並存儲對該快照的引用。

為了提高效率,如果文件沒有改變,Git不會再次存儲文件,只是指向它已存儲的上一個相同文件的鏈接。Git認為它的數據更像是一個快照流,會將數據作為項目的快照存儲一段時間。

幾乎每一項行動都是本地的

Git中的大多數操作只需要本地文件和資源來運行 - 通常不需要來自網路上另一台計算機的信息。

當您在Git中執行操作時,幾乎所有操作都只將數據添加到Git資料庫。很難讓系統做任何不可撤銷的事情或者以任何方式擦除數據。與任何VCS一樣,您可能會丟失或搞亂尚未提交的更改,但在將快照提交到Git之後,很難丟失,尤其是在您經常將資料庫推送到另一個存儲庫時。

『肆』 Git的存儲機制

答:
git在正確的抽象層次上處理存儲空間壓縮,使得程序比上代(如svn)和同時代(如bzr)的VCS大為簡化。

之前的VCS從節省空間出發,想當然地把delta作為基礎數據結構。這樣的最大問題(遠不是唯一問題)是:delta設計時沒有考慮到的修改方式就無法表達。例如,svn早期版本及更早的VCS不能記錄文件rename/,所以只要重命名文件,列出歷史時重命名之前的歷史就顯示不出來。

git的存儲層(plumbing layer)提供的介面里,每個commit都記錄完整的目錄樹。存儲空間壓縮問題完全在存儲層內部解決:

『伍』 ideagit本地分支保存在哪裡

儲存庫。git是一個免費的、開源的分布式版本控制系統。ideagit本地分支保存在儲存庫。ideagit可以快速高效地處理從小型到大型的各種項目,易於學習,佔地面積小,性能極快。

『陸』 git的基本使用

git 採用的是分布式倉庫,本地和遠程倉庫都是一個包含完整記錄的倉庫,如果某一處被格式化了,還以從另一個倉庫獲取,並不會有大影響(只要之前進行了同步倉庫)。git 可以在斷網的情況下,提交到本地倉庫,之後聯網再推到遠程倉庫。每次提交或者保存,git都會記錄下所有文件狀態,若未改變的文件,git不會再次存儲,只會鏈接到之前已經存儲的文件。

git文件一共有四種狀態:

以下為git中存在的,並在跟蹤的

創建本地.gitignore

創建一個global .gitignore

指定倉庫排除

參考 Ignoring files

這里遇到一個問題:當我不修改系統默認的提交信息時(或者只是換行不輸入任何信息),然後關掉編輯器會出現提交不成功,並會提示
Aborting commit e to empty commit message.

解決方法 :必須輸入新的提交信息,即在原來的基礎上,至少要加入新的行數據。

git rm *~ 刪除所有以~這個結尾的文件

限定輸出

更多限定
Table 3. Options to limit the output of git log

參考至: Git Basics - Undoing Things

`eg

$ git commit -m 'initial commit'

$ git add forgotten_file

$ git commit --amend`

展示倉庫名

fetch、pull、push

(==注==:origin 是用git clone到本地之後,自動命名,如果在你push之前,有人先push了,那麼push會失敗,必須fetch下來合並,並且運行起來,才能在push)

指定一個提交(commit)點作為tag,並不保存額外的信息、

包含tagger 名字、郵箱、日期、tagging msg等信息

-m 指定標記消息,若沒有,系統會自動採用默認的編輯器

給之前提交(commit)加上tag

分享tags
默認情況下,git push 並不會將本地的tag,push到遠程伺服器上,用以下兩個命令行推到遠程倉庫上

檢出Tags
必須新建一個分支,然後將要檢出的tags,指定到這新分支上

為了是命令更簡單、更容易明白和操作,可以給命令添加別名如下:

運行的時候直接打 git ci可以

可視化命令 gitk

『柒』 Git底層數據結構和原理之三:存儲模型

git 區別與其他 vcs 系統的一個最主要原因之一是:git 對文件版本管理和其他 vcs 系統對文件版本的實現理念完成不一樣。這也就是 git 版本管理為什麼如此強大的最核心的地方。

SVN 等其他的 VCS 對文件版本的理念是以文件為水平維度,記錄每個文件在每個版本下的 delta 改變。
Git 對文件版本的管理理念卻是以每次提交為一次快照,提交時對所有文件做一次全量快照,然後存儲快照引用。

Git 在存儲層,如果文件數據沒有改變的文件,Git 只是存儲指向源文件的一個引用,並不會直接多次存儲文件,這一點可以在 pack 文件中看見。如下圖所示:

存儲隨著需求和功能的不斷復雜,git 版本的不斷更新,但是主要的存儲模型還是大致不變。如下圖所示:

『捌』 Git工作原理

按照官方文檔的描述,Git是這樣定義的

.git目錄是Git的核心,每一個變動都會存儲在.git文件夾中,Git的相關命令本質上也是讀取.git文件夾下的內容
.git目錄下有幾個重要的文件/文件夾

提交和文件是Git中的主要組成,也叫git對象,Git中的許多命令都和git對象有關
git對象分為下面3類

git對象存儲在.git目錄下的objects文件夾中,Git會將git對象壓縮成二進制文件,git對象的文件名即sha-1演算法得到的hash值,按照2/38的形式保存(前兩位是文件夾的名稱,剩下38位是文件名,這樣做可以防止文件夾的內容過多,提高查找效率)

對於commit對象,hash值也被稱為commitid

可以使用以下命令查看git對象中的內容

git cat-file -p <hash>

通過查看三種git對象的內容,不難發現如下的組織關系

其實可以吧hash看成每個對象的指針,Git通過指針將眾多git對象串聯起來,來實現對項目的版本控制

用戶通過Git命令讀寫.git文件夾,達到獲取信息或變更版本的目的

Git一開始被設計成供VCS使用的工具集合而不是一整套用戶有好的VCS,它還包含了許多的底層命令,一般被稱為plumbing命令(底層命令),而用戶日常使用Git命令被稱為porcelain命令(高層命令),porcelain命令實際是是對plumbing命令的封裝

一次完整的提交過程會包含如下過程

使用porcelain命令的話是非常簡單的

如果使用plumbing命令就會復雜很多,但是可以更好地理解其背後的工作原理

通過前文的內容不難發現,每次生成的commit對象會包含上一個commit對象的hash,即當前的commit包含上一個commit的指針,許多個commit對象串聯起來就形成了分支

所以,Git的分支本質上是指向commit對象的可變指針

而HEAD代表當前commit的指向,.git/refs/heads/<branchname>文件的內容就是該commit對象的hash