當前位置:首頁 » 硬碟大全 » git為啥有緩存區
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

git為啥有緩存區

發布時間: 2023-01-11 09:46:35

『壹』 百思不得其解,tortoisegit是把git中的暫存區概念幹掉了嗎

stage(暫存)這個概念在TortoiseGit中依然存在,只是變得不直觀了

原因:

TortoiseGit為了保持和TortoiseSVN近乎一致的使用體驗,對「暫存文件」這個步驟進行了操作上的簡化:操作者點擊提交按鈕的瞬間,TortoiseGit會立即stage(暫存)這些文件並commit(提交)它們。注意,這兩個操作幾乎是先後同時執行的

也就是說,TortoiseGit通過緊密的捆綁git add和git commit這兩個指令到一個提交按鈕中,在操作層面給人了一種暫存(stage)被幹掉了的感覺,但實際上並沒有!

在大部分情況下,這個TortoiseGit特有的優化會給帶來一些便利

但同時也會導致TortoiseGit對暫存區的表現變得非常不直觀。比如TortoiseGit根本沒有提供任何一個窗口來表現哪些文件處於暫存區

所以建議,在windows系統下,如果你不擅長通過命令行來使用git,請常備TortoiseGit和SourceTree這2個Git GUI

『貳』 git 為什麼要設立緩存

這樣在本地就可以提交代碼和回滾代碼,而不用連接伺服器的時候才能做相關操作。

『叄』 git中,文件的狀態

git中常用的一個命令便是,git status,該命令的作用是查看哪些文件處於什麼狀態.
可以用 git status 命令查看哪些文件處於什麼狀態。 如果在克隆倉庫後立即使用此命令,會看到類似這樣的輸出:
echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)

nothing added to commit but untracked files present (use "git add" to track)

在狀態報告中,可以看到,出現了一個untracked files文件,readme.未跟蹤的文件意味著在之前的快照(提交)中沒有這些文件,git不會自動的將這些文件納入可追蹤的范圍,除非需要明確的指出我要跟蹤做這些文件.此時,可以執行:
git add readme.txt
再運行git status
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README
可以看到readme文件處於被追蹤的狀態中,是被暫存的狀態.但是仍然沒有commit.

此時,如果我們做了修改,對於一個被追蹤的文件,進行了修改,如果你修改了一個CONTRIBUTING.md的已經被追蹤的文件,然後運行:
git status
則會出現以下內容:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

意思為: 名為CONTRIBUTING.md已經跟蹤的文件發生了變化.但是還沒有被放入暫存區,如需要暫存本次修改,需要運行git add命令.
git add命令是一個多命令,可以使用將其從未追蹤文件變為已追蹤文件,還可以將已追蹤文件未修改的內容,變為已追蹤文件暫存.還能用戶合並時將沖突文件標記為已解決的狀態等.
此時,運行git status輸出為:
git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

可以看到,此時輸出的意思為:兩個文件都已經暫存,在下次commit時,會一起提交到倉庫.

假設此時,需要繼續在修改CONTRIBUTING.md文件,此時再運行git status命令,會出現:
git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

此時,CONTRIBUTING.md文件同時出現在暫存區和非暫存區,是因為,git add文件只是暫存了上次執行git add命令時文件的暫存,如若繼續暫存,需要繼續運行git status
git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

如果我們需要查看當前工作區文件和暫存區文件的差異,可以使用git diff命令.若要查看已暫存的將要添加到下次提交里的內容,可以用 git diff --staged 命令。 這條命令將比對已暫存文件與最後一次提交的文件差異.

此時,可以進行commit,進行提交啦.現在的暫存區已經准備就緒,可以提交了。 在此之前,請務必確認還有什麼已修改或新建的文件還沒有 git add 過, 否則提交的時候不會記錄這些尚未暫存的變化。 這些已修改但未暫存的文件只會保留在本地磁碟。 所以,每次准備提交前,先用 git status 看下,你所需要的文件是不是都已暫存起來了, 然後再運行提交命令 git commit.

現在你已經創建了第一個提交! 可以看到,提交後它會告訴你,當前是在哪個分支(master)提交的,本次提交的完整 SHA-1 校驗和是什麼(463dc4f),以及在本次提交中,有多少文件修訂過,多少行添加和刪改過。

提交記錄的是放在暫存區域的快照.任何還未暫存的文件仍然保持已修改的狀態,可以在下次提交時納入版本管理,每次運行一次git commit都是對項目做一次快照,以後可以回到這個狀態,或者進行比較.

跳過使用暫存區域
盡管使用暫存區域的方式可以靜心准備要提交的細節,但是,有個問題就是繁瑣,git提供了一個暫存區域的方式,只要提交的時候,git commit -a,則git會將已經跟蹤過的文件暫存起來一起提交.從而省略一次git add,省略的步驟是,將那些已被追蹤的文件改為暫存.這是因為 -a 選項使本次提交包含了所有修改過的文件。 這很方便,但是要小心,有時這個選項會將不需要的文件添加到提交中。

查看git提交歷史,使用git log命令.會出現下面輸出:
$ git log
commit
Author: Scott Chacon [email protected]
Date: Mon Mar 17 21:52:11 2008 -0700

commit
Author: Scott Chacon [email protected]
Date: Sat Mar 15 16:40:33 2008 -0700

commit
Author: Scott Chacon [email protected]
Date: Sat Mar 15 10:31:28 2008 -0700

在不傳入任何參數的前提下,git log會按照時間順序列出所有的提交,按照時間順序倒排,commit之後是每次提交的SHA-1校驗和(是一個十六位的長度為四十的哈希值),以及作者信息和提交說明.

『肆』 Git清空暫存區

當前暫存區有兩個文件antzone.txt和readme.txt。

將暫存區中的內容刪除,工作區中對應的文件並不會受到影響。

所謂暫存區實質是.git目錄下的index文件,只要將此文件刪除,那麼就可以認為暫存區被清空。

『伍』 git中.gitattributes文件有什麼用

git是分為三部分,一部分是你自己的文件,另外一個是緩存區,最後一個是本地庫。當你修改了自己的文件後,你會git add xx將修改保存到緩存區,然後再用commit推送修改到本地庫中。
git push 將本地倉庫修改推送到伺服器上的倉庫中
comiit 是n將本地修改保存到本地倉庫中

『陸』 【學了就忘】Git原理 — 20.Git對象[tree對象](二)

我們可以先查看一下Git本地庫中的對象,如下

我們接下來用三個圖,描述一下三個樹對象的結構關系。

第一個樹對象結構如下圖

第二個樹對象結構如下圖

也可以換Git對象類型表示:

從上圖我們可以分析出:

這就是我前面 2-(3) 描述過的 "Git版本庫中的5個對象,即表示了項目的2個版本。"

(就先這樣理解)

暫存區的概念和相關理解:

暫存區的作用 :除非是繞過暫存區直接提交,否則Git想把修改提交上去,就必須將修改存入暫存區最後才能commit。每次提交的是暫存區所對應的文件快照。

現在有三個樹對象(因為執行了三次 write-tree 命令),分別代表了我們想要跟蹤項目的三次快照。然而問題依舊:若想重用這些快照,你必須記住這三個樹對象的 SHA-1 哈希值。

並且,你也完全不知道是誰保存了這些快照,在什麼時刻保存的,以及為什麼保存這些快照。

而以上這些,提交對象 commit object 為你保存了這些基本信息。

Git底層命令:

『柒』 git 跳過暫存區

git標準的工作流程是在工作區(也就是你當前的本地文件)對文件進行修改,然後將跟蹤的修改文件通過git add命令添加操暫存區,最後通過git commit 將暫存區的文件提交到本地倉庫。
這樣的操作有時候是略顯繁瑣的,git給提供了一個可以直接將工作區的文件提交到本地倉庫的方法git commit -a -m '備注',通過這個命令,可以直接將工作區的修改提交到本地倉庫。
但是有個需要注意的地方,這個方法只支持已經被跟蹤的文件,像下面新增的index.css文件通過這種方式是沒辦法提交的。

『捌』 工作區和暫存區的概念

工作區:就是在電腦里可以看到的目錄,這就是工作區。
比如:

之前我們說過當我們新建一個版本庫readme.txt的時候,出現了一個.git的東西,這個東西是隱藏的,不算在工作區,是GIt的版本庫。

之前說過把文件往Git版本庫里添加的時候,是分兩步進行的:
1、用git add來添加文件,實際上就是把文件轉移到stage中;
2、用git commit來提交文件,實際上就是把所有在stage中的內容提交到當前分支master中
當然可以用git add添加很多次文件,然後一次性用git commit來一次性提交。
例子如下:
我們對readme.txt做如下修改:

然後在learngit這個文件夾內添加一個LICENSE.txt的文件(內容隨便寫),
我們可以用git status來查看下目前的狀態:

可以看到目前的狀態是readme.txt是被修改了,而LICENSE.txt沒有被添加過。
現在我們使用git add來分別添加兩個文件:

現在用git commit來提交文件,並會顯示如下:

以上是我看廖雪峰老師的網站,然後做的學習摘抄,無意侵犯老師作品,如有侵犯,我會刪除。

『玖』 Git初始化 暫存區

git --version
git config --global user.name "guoxi.zhang"
git config --global user.email "[email protected]"
刪除Git配置文件中某項值
git config --unset --global user.name

如果擁有系統管理員的許可權,你希望注冊的別名能被其他用戶使用,可以執行如下命令:
sudo git config --system alias.ci commit
也可以只執行如下命令,只在本用戶的全局配置中添加Git別名
git config --global alias.ci commit
在git命令輸出中開啟顏色顯示
git config --global color.ui true
git init   命令再當前目錄完成版本庫的初始化
git init <dir> 該命令會自動創建dir目錄並在當前目錄的dir目錄下初始化版本庫,所以
mkdir demo     cd demo     git init
相等於 git init demo
運行該命令之後會在demo目錄創建一個 .git 的隱藏文件,隱藏的 .git 目錄就是Git版本庫(又叫倉庫,repository)
.git 版本庫所在的目錄為工作區
在工作區創建一個welcome.txt文件
echo "hello" > welcome.txt
然後將文件條件到版本庫中
git add welcome.txt
git commit -m "initialized"
工作區文件內容搜索命令
git grep "工作區文件內容"
在Git工作區的某個子目錄下執行操作的時候,會在工作區目錄中依次向上遞歸查找 .git 目錄,找到的 .git 目錄就是工作區對應的版本庫, .git 所在目錄就是工作區,在非 .git 工作區執行git命令時會因為找不到 .git 目錄報錯

顯示版本庫 .git 目錄所在位置
git rev-parse --git-dir
顯示工作區根目錄
git rev-parse --show-toplevel
相對於工作區根目錄的相對目錄
git rev-parse --show-prefix
顯示從當前目錄回退到工作區的根的深度
git rev-parse --show-cp

打開本項目的配置文件
git config -e
打開當前用戶的配置文件
git config -e --global
打開系統的配置文件
git config -e --system
優先順序是本項目>當前用戶>系統

讀取INI文件中某項的值
git config <section>.<key>
設置INI文件中某項的值
git config <section>.<key> value
如果對工作區的文件沒有做任何修改,Git默認不會執行提交,使用 --allow-empty 參數允許執行空白提交

git diff     工作區與提交任務(暫存區)中相比的差異
git diff HEAD     工作區和HEAD(當前分支)相比
git diff --cached 或者 git diff --staged     暫存區和版本庫文件的差異
git checkout -- welcome.txt     撤銷工作區中 welcome.txt 尚未提交的更改

git status    git diff   命令掃描工作區變動的原理:先依據 .git/index 文件中記錄的(用於跟蹤工作區文件的)時間戳,長度等信息判斷工作區文件是否改變,如果工作區的時間戳改變了,就說明工作區的文件內容可能被改變了,需要打開文件,讀取文件內容,與更改前的原始文件做比較,判斷文件內容是否改變。如果判斷文件內容沒有改變,就將該文件新的時間戳記錄到.git/index文件中
文件 .git/index 實際上就是一個包含文件索引的目錄樹,像是一個虛擬的工作區,在這個虛擬工作區的目錄樹中,記錄了文件名和文件的狀態信息(時間戳和文件長度),文件的內容並沒有存儲在其中,而是保持在Git對象庫 .git/objects 目錄中,文件索引建立了文件和對象庫中對象實體之間的對應關系。下圖展示了工作區,版本庫的暫存區和版本庫之間的關系

git ls-tree -l HEAD 查看當前HEAD指向的目錄樹

git clean -fd 清空當前工作區中沒有加入到版本庫的文件和目錄
git checkout . 用暫存區內容刷新工作區
git ls-files -s 顯示暫存區的目錄樹

-a 參數會對本地所有的變更的文件執行提交操作,包括對本地修改的文件和刪除的文件,但不包括未被版本庫跟蹤的文件。使用這個命令將失去Git暫存區帶來的巨大好處:對提交內容進行控制的能力

『拾』 git 緩存區

1.  git stash

2.  git stash list

3.  git stash apply

4.  git stash pop

5.  git stash drop

6.  git stash clear

7.  git stash show

8.  git stash diff