參考:
https://www.cnblogs.com/qdhxhz/p/9757390.html
https://blog.csdn.net/weixin_41282486/article/details/79734793
【Git】(1)---工作區、暫存區、版本庫、遠程倉庫
一、概念
1、四個工作區域
Git本地有四個工作區域:工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)、git倉庫(Remote Directory)。文件在這四個區域之間的轉換關系如下:
Workspace: 工作區,就是你平時存放項目代碼的地方
Index / Stage: 暫存區,用於臨時存放你的改動,事實上它只是一個文件,保存即將提交到文件列表信息
Repository: 倉庫區(或版本庫),就是安全存放數據的位置,這里面有你提交到所有版本的數據。其中HEAD指向最新放入倉庫的版本
Remote: 遠程倉庫,托管代碼的服務器,可以簡單的認為是你項目組中的一台電腦用於遠程數據交換
2、工作流程
git的工作流程一般是這樣的:
1、在工作目錄中添加、修改文件;
2、將需要進行版本管理的文件放入暫存區域;
3、將暫存區域的文件提交到git倉庫。
因此,git管理的文件有三種狀態:已修改(modified),已暫存(staged),已提交(committed)
3、文件的四種狀態
版本控制就是對文件的版本控制,要對文件進行修改、提交等操作,首先要知道文件當前在什么狀態,不然可能會提交了現在還不想提交的文件,或者要提交的文件沒提交上。
GIT不關心文件兩個版本之間的具體差別,而是關心文件的整體是否有改變,若文件被改變,在添加提交時就生成文件新版本的快照,而判斷文件整體是否改變的方法就是用
SHA-1算法計算文件的校驗和。
Untracked: 未跟蹤, 此文件在文件夾中, 但並沒有加入到git庫, 不參與版本控制. 通過git add 狀態變為Staged.
Unmodify: 文件已經入庫, 未修改, 即版本庫中的文件快照內容與文件夾中完全一致. 這種類型的文件有兩種去處, 如果它被修改, 而變為Modified.
如果使用git rm移出版本庫, 則成為Untracked文件
Modified: 文件已修改, 僅僅是修改, 並沒有進行其他的操作. 這個文件也有兩個去處, 通過git add可進入暫存staged狀態, 使用git checkout 則丟棄修改過,
返回到unmodify狀態, 這個git checkout即從庫中取出文件, 覆蓋當前修改
Staged: 暫存狀態. 執行git commit則將修改同步到庫中, 這時庫中的文件和本地文件又變為一致, 文件為Unmodify狀態. 執行git reset HEAD filename取消暫存,
文件狀態為Modified
下面的圖很好的解釋了這四種狀態的轉變:
新建文件--->Untracked
使用add命令將新建的文件加入到暫存區--->Staged
使用commit命令將暫存區的文件提交到本地倉庫--->Unmodified
如果對Unmodified狀態的文件進行修改---> modified
如果對Unmodified狀態的文件進行remove操作--->Untracked
二、四個區域常用命令
1、新建代碼庫
# 在當前目錄新建一個Git代碼庫 git init # 新建一個目錄,將其初始化為Git代碼庫 git init [project-name] # 下載一個項目和它的整個代碼歷史 git clone [url]
2、查看文件狀態
#查看指定文件狀態 git status [filename] #查看所有文件狀態 git status
3、工作區<-->暫存區
# 添加指定文件到暫存區 git add [file1] [file2] ... # 添加指定目錄到暫存區,包括子目錄 git add [dir] # 添加當前目錄的所有文件到暫存區 git add . #當我們需要刪除暫存區或分支上的文件, 同時工作區也不需要這個文件了, 可以使用(⚠️) git rm file_path #當我們需要刪除暫存區或分支上的文件, 但本地又需要使用, 這個時候直接push那邊這個文件就沒有,如果push之前重新add那么還是會有。 git rm --cached file_path #直接加文件名 從暫存區將文件恢復到工作區,如果工作區已經有該文件,則會選擇覆蓋 #加了【分支名】 +文件名 則表示從分支名為所寫的分支名中拉取文件 並覆蓋工作區里的文件 git checkout
4、工作區<-->資源庫(版本庫)
#將暫存區-->資源庫(版本庫) git commit -m '該次提交說明' #如果出現:將不必要的文件commit 或者 上次提交覺得是錯的 或者 不想改變暫存區內容,只是想調整提交的信息 #移除不必要的添加到暫存區的文件 git reset HEAD 文件名 #去掉上一次的提交(會直接變成add之前狀態) git reset HEAD^ #去掉上一次的提交(變成add之后,commit之前狀態) git reset --soft HEAD^
5、遠程操作
# 取回遠程倉庫的變化,並與本地分支合並 git pull # 上傳本地指定分支到遠程倉庫 git push
6、其它常用命令
# 顯示當前的Git配置 git config --list # 編輯Git配置文件 git config -e [--global] #初次commit之前,需要配置用戶郵箱及用戶名,使用以下命令: git config --global user.email "you@example.com" git config --global user.name "Your Name" #調出Git的幫助文檔 git --help #查看某個具體命令的幫助文檔 git +命令 --help #查看git的版本 git --version
參考
工作區、暫存區、倉庫三者關系
區分三者關系
Git最讓你迷惑的無非是它里面的各種概念了,如果是剛開始接觸Git希望看完本篇介紹之后有一個清晰的認識,筆者認識也有限這里只說說個人對使用Git的感受,說一下它里面的幾個最常用的概念的理解。
在初始化git版本庫之后會生成一個隱藏的文件 .git ,可以將該文件理解為git的版本庫 repository,而我們自己建立的項目文件夾即工作區 working directory ,在.git 文件夾里面還有很多文件,其中有一個index 文件 就是暫存區也可以叫做 stage ,git還為我們自動生成了一個分支master以及指向該分支的指針head ,如下圖
從圖中可以看出來respository包括分支master和stage, working diretory 可以理解為我們打開開發環境如eclipse,里面的內容即工作區的內容,在工作區里面有的代碼以及配置文件等我們需要提交到版本庫里面,最終是到了分支master上面,暫存區只是一個臨時保存修改文件的地方。
實例講解
平時我們使用的命令git add file1 是把文件從工作區提交到暫存區,git commit -m "prompty" file1 是把文件從暫存區提交到了分支master下面,這里因為只有一個分支master,就提交到master上了,下面讓我們再來結合具體例子來說明一下。
我們修改一下tgb.txt文件增加一行 "l love you" ,並新建一個文件 test1.txt,現在還沒有執行git add命令,這種修改都還停留在工作區內,用git status查看狀態,如圖
上圖表明修改並沒有在暫存區里面,當我們執行git add test1.txt ,git add tgb.txt后,再來看一下狀態
這兩個文件被添加到了暫存區,但是還沒有提交,當執行git commit -m "tijiao" 后文件即從暫存區到了master分支上面,如圖將看不到暫存區里面有什么內容。
Git管理的是添加到暫存區里面的修改,包括增刪改等等都算是可以跟蹤的文件變動,也可以說git只管理我們變動的部分變動的我們才往暫存區提交,這也是git比其他版本系統設計優秀的一點,以后,會詳細說一下各個版本系統管理文件是如何管理的,他們的設計思想是什么。
通過三個命令理解
下面還有一個需要注意的git diff 命令的差異:
git diff 比較的是工作區和暫存區的差別
git diff --cached 比較的是暫存區和版本庫的差別
git diff HEAD 可以查看工作區和版本庫的差別
通過一個添加文件既可以明顯看出他們之間區別,不過這里有一個前提是已經提交到暫存區的文件修改的時候才可以看出明顯區別,這也是以為啥git只能跟着提交到暫存區的文件,如果只是在工作區新建一個文件,那么輸入這三個命令都沒有結果為空白。
我們繼續修改tgb.txt,在文件末尾添加 we are good boy.
分別輸入三個命令,效果為:
從圖中可以看出,工作區與暫存區、工作區與版本庫都有變化,而版本庫與暫存區並沒有變化。進一步執行git add tgb.txt
執行git add tgb.txt之后發現git diff沒有輸出內容,表明工作區與暫存區已經同步,暫存區與版本庫、版本庫與工作區沒有同步。最后一步執行git commit
當執行完git commit后,三個命令都沒有輸出結果,表明我們修改的文件已經被同步的版本庫,已經被版本庫管理起來了。
總結:
版本庫管理文件會很方便尤其是代碼,等好多的命令熟了之后也會覺得並不是那么難用,主要使用的時候覺得git反應比較快,而且速度還可以,現在很多人都在window開發而喜歡具有界面的版本工具軟件,而不去學習git命令,學習一些git 命令還是很有用的,假如讓你去linux上面開發或者在linux系統上面管理代碼,你就會完全束手無策不懂原理也不懂命令,需要從新學習從新認識git。
可以說各種命令是git的根本,學習了命令無論哪一個界面管理工作一看也就會了,現在有好多的git可視化工具,不如學幾個命令,況且再多的界面底層也是調用這么多的命令來實現的,有了界面就讓我們變懶了,降低了開發者的水平,提高開發效率的同時也失去了更多的學習、研究機會。