A. git怎麼添加文件夾
在本地新建接受遠程目錄文件夾 bbb
初始化文件夾bbb的git設置,分別設置用戶名和郵箱
git config --global user.name "wmsj100"
git config --global user.email "[email protected]"
克隆github項目組中的文件此時要注意該文件的路徑一定要是根目錄,不能是子目錄,否則就會出現文件路徑不存在的警告
點擊進去後會看到.git版本庫文件,readme.md項目說明文件,homework項目文件夾
進入homework文件夾直接創建自己的工作目錄wang_hao
在文件夾裡面創建一個readme.md的項目說明文件,當然了readme的後綴可以是任何文本格式,.txt/.html/.htm/.css/.js/……
用文本編輯器打開readme文件,輸入說明文字,對了,最好不要用記事本打開,好像是微軟的記事本會在文件頭部添加一個代碼,有時候可能會出現亂碼,推薦使用notepad++、sublime text……
此時查看git庫的狀態git status然後添加wang_hao文件夾到git庫
提交到本地git庫
推送到項目組文件夾,首先查看提交項目的名稱,默認為origin
推送到遠程gitgit push origin
雖然有警告提示,但是看到底部的文件數量和大小信息就知道是提交成功了。可以去github看看剛剛這次的提交
B. Git系列之底層原理篇
本章節是Git的核心知識點,主要是介紹Git底層原理與在使用Git過程中的幾個重要區域,弄懂Git的整個使用流程,以及數據的存儲過程。
工作區(Working Directory):
工作區就是我們平時編寫文本文件的地方
暫存區(Stage/Index):
暫存區是我們提交文本文件到本地倉庫的來源地,只有把工作區的文件添加至暫存區,才可以被提交至本地倉庫。
本地倉庫(Repository):
本地倉庫是保存每次文件更新的記錄,包括提交人,提交時間,提交的內容等詳細信息,方便追溯歷史版本。
遠程倉庫(Remote Repository):
遠程倉庫算是本地倉庫的一個副本,主要是方便合作夥伴之間的倉庫文件同步。
因此它的使用流程可以簡單的概括為:
1、在本地搭建一個目錄,用來創建git倉庫
$ git init gitDirectory
2、在倉庫目錄下創建文本文件(工作區)
$ cd gitDirectory
$ echo "first txt" > first.txt
3、把工作區的first.txt文件添加至git暫存區
$ git add first.txt
4、將暫存區中的文件first.txt提交至本地倉庫
$ git commit -m "first commit"
5、將文件保存至本地倉庫就已經可以記錄我們每次提交的歷史信息了,但是為了方便其他夥伴一起協作,還需要搭建一個遠程服務。(本次以GitHub為例)
在GitHub創建一個和本地一樣名稱的倉庫,創建成功後會生成一個倉庫地址:
https://github.com/mr-kings/gitDirectory.git
6、將本地倉庫和遠程倉庫關聯起來
$ git remote add origin https://github.com/mr-kings/gitDirectory.git
7、第一次將本地倉庫提交至遠程倉庫
$ git push -u origin master
第一次需要添加 -u 參數,即把本地的master分支和遠程倉庫的master分支對應上
8、此時本地倉庫和遠程倉庫就已經實現了同步,其他協作夥伴只需到遠程倉庫把倉庫克隆到自己的電腦即可進行協作編輯
$ git clone https://github.com/mr-kings/gitDirectory.git
9、克隆下來以後會在本地生成本地倉庫以及工作區,後續的操作和2步驟及以後步驟一致
需要注意的是:遠程倉庫有兩種連接方式https/ssh,上面的例子使用的https,其實ssh方式會比https快的多,它還可以通過添加密鑰的方式省去每次提交時都要輸入用戶名和密碼的問題,這里不做詳細介紹。https也是可以通過配置省去每次推送都需要輸入用戶名和密碼的問題。
Git安裝成功後,在本地新建一個Git倉庫,$ git init Gitstudy會生成一個.git文件夾,如果你創建的時候沒有發現.git目錄那應該是你的電腦默認隱藏了.git文件夾,有兩種方式可以查看它:
第一種方式:
命令行工具,在當前目錄下,在命令行里輸入 $ ll -a 即可查看
第二種方式:
在當前目錄下,點擊查看菜單,然後勾選上隱藏的項目即可
.git目錄就是暫存區和本地倉庫的位置,所以它的核心就在這里,下面看看它有哪些內容:
由上圖可知,初始化的時候.git目錄下有以下文件及文件夾:
config(文件):存放當前倉庫的一些配置信息,比如記住用戶名和密碼,別名等
下面是它的常用選項:
[core] ignorecase 是否忽略文件大小寫
[remote "origin"] url 配置遠程倉庫地址
[remote "origin"] fetch 遠程分支映射關系
[user] name 用戶名
[user] email 郵箱
[alias] 命令別名配置 : cmt = commit
description(文件):創建倉庫的描述文件
HEAD(文件):指示當前被檢出(所在)的分支,如當前在test分支,文件內容則為ref: refs/heads/test。
hooks/(文件夾):包含客戶端或服務端的鉤子腳本(hook scripts),如pre-commit,post-receive等
info/ (文件夾):用以存儲一些有關git倉庫的信息,如exclude
objects/ (文件夾):用以存儲git倉庫中的所有數據內容
refs/(文件夾):包含 heads 文件夾,remote文件夾。heads 記錄本地相關的各 git分支操作記錄,remote 記錄遠程倉庫相關的各git分支 操作記錄
當第一次提交的時候還會生成以下文件及文件夾:
index (文件) -- (在git add file的時候生成):是當前版本的文件索引,包含生成當前樹(唯一確定的)對象的所虛信息,可用於快速比對工作樹和其他提交樹對象的差異(各commit和HEAD之間的diff),可用於存儲單文件的多個版本以有效的解決合並沖突。可使用git ls-files 查看index文件內容
COMMIT_EDITMSG(文件) -- (在git commit -m "first commit"的時候生成):最近一次的 commit edit message
logs/ (文件夾) -- (在git commit -m "first commit"的時候生成):放置git倉庫操作記錄的文件夾,包含HEAD文件 和 refs文件夾
以上簡單介紹了.git目錄下的文件及文件夾,重點則是objects文件夾:
經過第一次提交後objects文件夾下多出了3個文件夾:44/、d0/、f6/。通過提交的日誌我們發現,commit後會生成一個40位的16進制字元串(前兩位作為文件夾名稱,後38位為內容哈希值)
官方描述:這是一個 SHA-1 哈希值——一個將待存儲的數據外加一個頭部信息(header)一起做 SHA-1 校驗運算而得的校驗和(前2位作為文件夾名稱 -- 後面38位作為內容的哈希值)
通過cat-file -t sha-1 命令查看當前哈希值所屬的類型:
由圖可知它是一個commit對象
再通過命令cat-file -p sha-1查看該commit對象包含有哪些信息
由圖知一個commit對象包含了tree對象,本地倉庫信息,提交人信息及提交時的備注信息。
再通過上述命令查看tree對象又包含又哪些信息:
由圖知tree對象又包含了blob對象,在多目錄的情況下tree對象還會包含其他tree對象。
由此得出結論:剛才提交的時候生成的那個3個文件夾分別對應的是3個對象即:44/文件夾對應的是commit對象,f6/文件夾對應的是tree對象,d0/文件夾對應的是blob對象。層級關系是:commit對象對應一個tree對象,tree對象可以包含一個或多個其他tree對象和blob對象。
下面就簡單介紹git中的幾個對象:
blob:
blob對象只跟文本文件的內容有關,和文本文件的名稱及目錄無關,只要是相同的文本文件,會指向同一個blob。
tree:
tree對象記錄文本文件內容和名稱、目錄等信息,每次提交都會生成一個頂層tree對象,它可以指向其引用的tree或blob。
commit:
commit對象記錄本次提交的所有信息,包括提交人、提交時間,本次提交包含的tree及blob。
tag:
標簽引用,它指向某一個commit。
用下面的圖可以把今天的內容概括起來:上半部分描述了git的操作流程圖,下半部分描述git底層數據存儲結構圖
Git流程及底層結構圖
下面就對圖的下半部分做個詳細說明:
1、在與.git同級目錄下新建文件夾directory,再在directory目錄下新建一個文本文件first.txt,裡面的內容為1。當執行$ git add first.txt 的時候就會在.git/objects/生成一個blob對象的文件夾(前兩位為文件夾名稱 -- 後38位為文本內容的哈希值)對應上圖的第一個d00491 -- blob對象。
2、當執行$ git commit -m "first commit" 的時候就會在.git/objects/下新生成了2個tree對象和一個commit對象的文件夾(前兩位為文件夾名稱 -- 後38位為文本內容的哈希值)對應上圖的f6589b -- tree對象,4a2e3e -- tree對象,6b18a7 -- commit對象。之所以生成兩個tree對象是因為directory目錄為一個tree對象還有與commit對象一一對應的頂層tree對象。這個時候HEAD游標指向的是當前master分支的first commit。並且在這次提交的時候打個v1.0版本的標簽。
3、在與.git同級目錄下新建一個新的文本文件second.txt,內容為2。當執行$ git add second.txt 的時候就會在.git/objects/生成一個新的blob對象的文件夾(前兩位為文件夾名稱 -- 後38位為文本內容的哈希值)對應上圖的0cfbf0 -- blob對象。
4、當執行$ git commit -m "second commit" 的時候就會在.git/objects/下新生成了1個tree對象和一個commit對象的文件夾(前兩位為文件夾名稱 -- 後38位為文本內容的哈希值)對應上圖的35e40c -- tree對象,d6dca9 -- commit對象。只生成一個與commit對象一一對應的頂層tree對象。由於本次提交directory目錄下的first.txt內容沒有變化,所以上圖的35e40c -- tree對象還會指向f6589b -- tree對象。這個時候HEAD游標指向的是當前master分支的second commit(HEAD索引向前移動),second commit 會指向上一次的提交即 parent指向first commit。
後續的操作以此類推,但需要注意的點是:
1、blob對象只對文件的內容有關,和文件名稱無關,如果不同的文件名稱,內容相同只會有一個blob對象,生成的新tree對象會指向該blob對象。例如上圖的third.txt和four.txt裡面的內容都為3。所以不會生成新的blob對象,新的tree對象只會指向同一個blob。
2、如果每次提交的時候包含的某些文件並沒有改動(更新),那麼就會直接指向它原來的索引,不會重新生成。例如上圖的directory/first.txt,second.txt
3、每次commit對象都會和頂層的tree對象一一對應。
C. git lfs 支持多大的文件
出於好意:設計來團隊開始把源他們大尺寸的圖形文件添加到你的項目倉庫當中,然而引起的結果是,你看著倉庫不斷增大直到數 GB 大小……
在 Git
中以二進制文件來運行確實是一種明智的做法,每當提交一個 100MB 的 Photoshop 文件中的細微改變,你倉庫的大小當然也會增長
100MB,這樣快速的增長會使你的倉庫因為內容太過於龐大而變得幾乎無法使用。它確實與所有」大」文件有關:如視頻,音頻記錄,數據集等的問題。
但是,如果說不使用版本控制你的設計/概念/視頻/音頻/可執行文件/工作也不能解決問題(知識庫過大)。一般來說,版本控制的好處還是存在的,而且應該用於各種各樣的項目當中去。
D. Git常用命令
1.1 配置環境
當安裝Git後首先要做的事情是設置用戶名稱和email地址。這是非常重要的,因為每次Git提交都會使用該用戶信息。該用戶信息和GitHub上注冊的遠程倉庫的相關信息沒有任何關系。
git config --global user.name "你的名字"
git config --global user.email "你的郵箱"
git config --list
配置信息保存在用戶目錄下的.giitconfig文件中
1.2 獲取Git倉庫
要使用Git對我們的代碼進行版本控制,首先需要獲得Git倉庫
獲取Git倉庫通常有兩種方式:
執行步驟如下:
1、在電腦的任意位置創建一個空目錄作為我們的本地Git倉庫
2、進入這個目錄中,點擊右鍵打開Git bash 窗口
3、執行命令git init
可以通過Git提供的命令從遠程倉庫進行克隆,將遠程倉庫克隆到本地的命令形式為:
git clone 遠程Git倉庫地址
1.3 工作目錄、暫存區以及版本庫概念
版本庫:.git隱藏文件就是版本庫,版本庫存儲了很多配置信息、日誌信息和文件版本信息等
工作目錄(工作區):包含.git文件夾的目錄就是工作目錄,主要用於存放開發的代碼
暫存區:.git文件夾中有很多文件,其中一個index文件就是暫存區,也可以叫做stage。暫存區是一個臨時保存修改文件的地方
1.4 Git工作目錄下文件的兩種狀態
Git工作目錄下的文件存在兩種狀態:
Unmodified 未修改狀態
Modified 已修改狀態
Staged 已暫存狀態
這些文件的狀態會隨著我們執行Git的命令發生變化
1.5 本地倉庫操作
git status 查看文件狀態
也可以使用git status -s使輸出信息更簡潔
git add 將未跟蹤的文件加入暫存區,將已經修改的文件加入暫存區也是通過這個命令
git reset 將暫存區文件取消暫存
git commit -m 「你的說明」 將暫存區文件提交到本地倉庫
git rm 刪除文件 說明:這種操作是直接將文件加入到暫存區裡面,直接提交到本地倉庫生效,而直接刪除的話沒有進入到暫存區,需要先把文件加入到暫存區之後,再提交到本地倉庫。
將文件添加至忽略列表
一般我們總會有些文件無需納入Git的管理,也不希望他們總出現在未跟蹤文件列表。通常這些都是自動生成的文件,比如日誌文件,或者編譯過程中創建的臨時文件等。在這種情況下,我們可以在工作目錄中創建一個名為.gitnore的文件(文件名稱固定),列出忽略的文件模式。下面是一個示例:#代表注釋
由於windows無法創建不含文件名的文件,因此我們需要在bash窗口中用如下命令創建。
git log 查看日記記錄
1.6 遠程倉庫操作
如果想查看已經配置的遠程倉庫伺服器,可以運行git remote 命令。它會列出指定的每一個遠程伺服器的簡寫。如果已經克隆了遠程倉庫,那麼至少可以看見origin,這是Git克隆的倉庫伺服器的默認名字
git remote -v 可以查看對遠程倉庫詳細一點的說明
git remote show origin 可以查看對origin更詳細的遠程倉庫的說明
運行git remote add 添加一個遠程Git倉庫,同時指定一個可以引用的簡寫
如果你想獲得一份已經存在了的Git倉庫的拷貝,這時需要用到 git clone 命令。Git克隆的是Git倉庫伺服器上的幾乎所有數據(包括日誌信息、 歷史 記錄等),而不僅僅是復制工作所需要的文件。當你執行git clone 命令的時候,默認配置下Git倉庫中的每一個文件的每一個版本都將被拉取下來。
如果因為一些原因想要移除一個遠程倉庫,可以使用git remote rm
注意:此命令只是從本地移除遠程倉庫的記錄,並不會影響到遠程倉庫
git fetch 是從遠程倉庫獲取最新版本到本地倉庫,不會自動merge
說明:如果使用fetch命令,拉取的文件會放到版本庫裡面,不會自動整合到工作區,如果需要整合到工作區,需要使用 git merge 遠程倉庫別名/遠程倉庫分支
git pull 是從遠程倉庫獲取最新版本並merge到本地倉庫
注意:如果本地倉庫不是從遠程倉庫克隆,而是本地創建的倉庫,並且倉庫中存在文件,此時再從遠程倉庫中拉取文件的時候會報錯(fatal:refusing to merge unrelated histories),解決此我呢提可以在git pull 命令後加入參數 --allow-unrelated-histories
git push
1.7 Git分支
幾乎所有的版本控制系統都是以某種形式支持分支。使用分支意味著你可以把你的工作從開發主線上分離開來,以免影響開發主線。Git的master是一個特殊分支。它跟其它分支沒有區別。之所以每一個倉庫都有mater分支,是因為git init默認創建它,並且大多數人都懶得去改動它。
# 列出所有本地分支
$ git branch
#列出所有遠程分支
$ git branch -r
#列出所有本地分支和遠程分支
$git branch -a
git branch 分支名稱
git checkout 分支名稱
git push 遠程倉庫別名 遠程倉庫分支
git merge 分支名稱 說明:在當前分支下合並其他分支
注意:如果兩個分支存在同樣的文件名且同行的內容不一樣,那麼會產生矛盾,需要自己手動修改產生矛盾後的文件,然後添加到暫存區然後提交。
git branch -d 分支名稱
如果要刪除的分支中進行了一些開發動作,此時執行上面的刪除命令並不會刪除分支,可以將命令中的-d參數改為-D
如果要刪除遠程倉庫中的分支,可以使用命令git push origin -d branchName
1.8 Git標簽
像其他版本控制系統一樣,Git可以給 歷史 中的某一給提交打上標簽,以示重要。比較有代表性的是人們會使用這個功能來標記發布結點(v1.0、v1.2等)。標簽指的是某個分支某個特定時間點的狀態。通過標簽,可以很方便地切換到標記時的狀態。
#新建一個tag
$ git tag [tagName]
$ git tag
#新建一個分支,指向某個tag
$ git checkout -b [branch] [tag]
#刪除本地tag
$git tag -d[tag]
#刪除遠程tag
$git push origin :refs/tags/[tag]