如果你只是想知道如何用Git上傳代碼至托管平臺,請看:創建碼云倉庫并完成第一次上傳(https) 及 使用ssh協議上傳代碼
如果你想了解Git本地倉庫的作業原理,歡迎閱讀本文,
文章目錄
- 一、磁區及作業流程
- 1. Git磁區
- 2. 作業流程
- 二、本地倉庫初始化
- 1. git init
- 2. .git/目錄簡單介紹
- 三、用戶資訊配置
- 1. 用戶名和郵箱配置介紹
- 2.使用git config配置用戶資訊
- 四、管理暫存區檔案
- 1. Git檔案狀態
- 2. 添加檔案到暫存區
- 3. 洗掉暫存區的檔案
- 4. 檔案修改管理
- 五、提交檔案到本地倉庫
- 六、推送到遠程倉庫
- 1. 創建遠程倉庫
- 2. 添加遠程倉庫地址
- 3. 查看遠程倉庫地址
- 4. 洗掉遠程倉庫地址
- 5. 推送到遠程倉庫
- https上傳
- ssh上傳
- 七、從遠程倉庫clone、fetch或pull
- 1. 克隆遠程倉庫到本地
- 2. 獲取遠程倉庫(fetch)
- 3. 拉取遠程倉庫(pull)
一、磁區及作業流程
1. Git磁區
Git的磁區包括作業區、暫存區、本地倉庫(本地版本庫)、遠程倉庫(遠程版本庫),
-
作業區
作業區(Workspace)即本地代碼所在的目錄,同時也是存放 .git/ (本地倉庫)的目錄, -
暫存區
暫存區(Index/Stage)是作業區和本地倉庫的快取空間,里面記錄著即將提交給本地倉庫(版本庫)的檔案修改資訊,.git/ 目錄里的index檔案就是暫存區, -
本地倉庫
本地倉庫(Repository)也稱本地庫或版本庫,存放了本地的所有版本(commit提交記錄),本地倉庫的檔案都在 .git/ 目錄中, -
遠程倉庫
遠程倉庫(Remote)在網路上,GitHub、Gitee和GitLab都能創建遠程倉庫,和本地倉庫一樣,遠程倉庫存放的也是不同的代碼版本,只是這些版本可以來自多個本地倉庫,
2. 作業流程
------------------------------------------------------下圖來源網路---------------------------------------------------------

上圖生動地描述了Git不同磁區之間的操作命令,
- 假如要實作上傳代碼功能,作業區使用add添加檔案到暫存區,暫存區再通過commit提交版本給本地倉庫,最后本地倉庫使用push將版本推送到遠程倉庫;
- 作業區修改的檔案可以通過checkout命令從本地倉庫或暫存區恢復;如果要將作業區某分支的代碼更新為遠程倉庫最新版本,可以使用pull命令;
- 對遠程倉庫使用clone可以將遠程倉庫主分支拷貝到本地倉庫,fetch命令與pull類似,只是pull會合并本地代碼,而fetch只會把最新版本抓取到本地版本庫,不考慮本地倉庫是否有新增,
二、本地倉庫初始化
1. git init
本地倉庫(版本庫)需要使用 git init 命令來創建(也可以直接從遠程倉庫克隆,后面介紹),
進入作業區(代碼存放目錄),輸入git init,git會在作業區新建一個.git/目錄:

2. .git/目錄簡單介紹

在一個新建的.git/目錄中,有3個文本檔案:
- config存放了本地倉庫的配置資訊;
- description用來描述倉庫的名字;
- HEAD為本地倉庫當前分支,默認為master,指向了refs/heads/master,可見refs/目錄主要存放一些分支資訊;
后面在對本地倉庫進行操作時,還會產生其他檔案,比如logs/——保存提交的記錄,index——暫存區,
【注意】 千萬不要手動更改.git/里的檔案,可能會破壞本地倉庫的結構,造成不良后果,
三、用戶資訊配置
1. 用戶名和郵箱配置介紹
初始化本地倉庫后的第一件事情就是給本地倉庫添加用戶配置資訊,包括用戶名和郵箱地址,這里的用戶名和郵箱地址和托管平臺(如gitee)的賬戶沒有直接關系,它唯一的作用就是讓別的用戶或托管平臺知道代碼的上傳者資訊,郵箱亂填也不會導致不能上傳代碼,
比如下面我用“張三”和“李四”上傳了代碼,郵箱地址不是真實存在的,同樣可以上傳成功:(commit資訊出了點意外)

李四的郵箱地址顯然不是真實的,

由于“張三”和“李四”的郵箱沒有在gitee系結賬戶,所以點擊它們頭像時,不會顯示用戶資訊,如果用戶配置里填寫了gitee賬號的提交郵箱,則可以在gitee上查看上傳者賬號資訊,

gitee用戶的提交郵箱,可以在gitee->個人主頁->個人設定->郵箱管理中設定和查看:

2.使用git config配置用戶資訊
講了那么多用戶名和郵箱的注意事項,其實用戶資訊配置十分簡單:
git config --global user.name "your name"
git config --global user.email "your email"
user.name 后接用戶名,任意填寫,
user.email 后接用戶郵箱,任意填寫,
–global 為配置全域屬性

提交代碼到本地倉庫時,git會先檢索本地倉庫的.git/config檔案,如果沒有user的資訊,則使用全域的組態檔(符合就近原則),
全域組態檔存放位置為 系統用戶目錄/用戶名/.gitconfig,里面只有user屬性,

不加–global時,僅設定本地倉庫的用戶配置,本地倉庫用戶配置資訊存放位置:.git/config

上圖我僅設定了本地配置的用戶名,此時如果提交修改到本地倉庫,提交記錄(下圖)中用戶名使用本地配置,因為本地沒有配置用戶郵箱,所以郵箱依然使用全域配置中指定的郵箱,

四、管理暫存區檔案
配置完用戶資訊后,我們就可以開始考慮提交代碼了,但是有時候,我們并不想把整個作業區的檔案都提交到本地倉庫(版本庫),暫存區(index/stage)的存在,替我們解決了這個困擾,我們可以先把代碼檔案添加到暫存區,如果覺得還需要改動,可以將檔案從暫存區洗掉,直到我們覺得檔案選擇得差不多了,再進行下一步(提交到本地倉庫),
1. Git檔案狀態
在管理暫存區之前,我們還需要了解作業區檔案的幾種狀態:
- Untracked 未跟蹤,作業區中沒有加入過暫存區的檔案,不參與版本控制;
- Unmodified 未修改,加入版本控制,但和版本庫中檔案快照相同;
- Modified 已修改,加入版本控制,而且和上次加入版本庫時的快照不同;
- Staged 已暫存,下一步可以提交到本地倉庫(版本庫),
------------------------------------------------------下圖來源網路---------------------------------------------------------

git status命令可以用來查看作業區檔案當前的狀態:
#查看特定檔案的狀態
git status [filename]
#查看所有檔案狀態
git status
#精簡的方式顯示檔案狀態
git status -s
2. 添加檔案到暫存區
先查看作業區所有檔案的狀態,發現還沒有任何檔案:

現在創建3個檔案,再次使用git status(-s表示精簡顯示),3個檔案的狀態為Untracked,??為精簡顯示下Untracked的標志,意思是新創的檔案沒有被本地倉庫(版本庫)跟蹤,

git add [檔案…] 可以添加一個或多個檔案到暫存區,使檔案狀態變為Staged,A表示該檔案被add到暫存區,

也可以使用 git add . 或 git add -A 將作業區所有檔案添加到暫存庫(除了.gitignore里宣告的檔案,本文暫不介紹),

3. 洗掉暫存區的檔案
既然可以向暫存區添加檔案,那么反向操作必然也不能少,git rm --cached [檔案…] 命令可以將暫存區的檔案移除,使其恢復到Untracked狀態,

4. 檔案修改管理
如果已經存入暫存區,但在檔案提交到本地倉庫前,我們對其進行了修改,那么它的狀態將變為Modified,

對于Modified狀態的檔案,我們可以使用git add將修改后的版本加入到暫存區,也可以使用git checkout – [file…] 將作業區的該檔案恢復到暫存區的版本,
git add a.c重新添加a.c到暫存區:

下圖為使用git checkout – a.c 從暫存區恢復a.c檔案,下圖中我沒有加“- -”,它的作用是讓checkout不檢測任何其他選項引數,目的是防止該命令把a.c當做一個分支(checkout 還有一個作用是切換分支),

對Modified狀態下的檔案使用 git diff 可以得出檔案修改的詳細記錄,git diff和diff命令雖然作用都是對比檔案,但git diff的作用是對比不同的狀態下的同一檔案,而diff用來對比兩個不同的檔案,

五、提交檔案到本地倉庫
檔案添加到暫存區的目的就是將其提交到本地倉庫(版本庫),提交命令為git commit -m “message”
我們可以在commit 后面添加檔案,這樣能指定提交的檔案:

通過git log 可以查看提交記錄,HEAD為本地倉庫當前分支,指向主分支master:

直接使用 git commit -m “message” 可以將整個暫存區都提交到本地倉庫:

#以一行的形式顯示所有提交版本:
git log --pretty=oneline

#一行顯示,只顯示哈希值的前7位:
git log --oneline

#顯示歷史提交版本與當前版本的間隔數:
git reflog

六、推送到遠程倉庫
代碼檔案提交到本地倉庫后,還需要推送到遠程倉庫進行托管,
1. 創建遠程倉庫
我以碼云為例,遠程倉庫的創建可以通過以下三步實作:

2. 添加遠程倉庫地址
git remote add <name> <url> 命令可以添加遠程倉庫,name為遠程倉庫地址的別名,自定義,url為倉庫網路地址,
如果要用https的方式上傳代碼,需要添加遠程倉庫https地址;用ssh上傳代碼,則url填遠程倉庫ssh地址,
先從碼云倉庫主頁將倉庫地址復制下來:

我將遠程倉庫的本地別名命名為origin:

遠程倉庫可以設定多個,只要本地別名不沖突即可,
3. 查看遠程倉庫地址
git remote -v 命令可以查看遠程倉庫地址,也可以通過git config -l查看

4. 洗掉遠程倉庫地址
git remote remove <name> 可以洗掉本地別字為name的遠程地址:

5. 推送到遠程倉庫
首先確認遠程倉庫的別名,我當前設定的遠程倉庫https協議地址對應的別名為https,ssh協議地址對應的別名為ssh,這兩個地址其實是一個倉庫,只是協議不同,

https上傳
git push name可以實作本地倉庫的上傳,name為遠程倉庫在組態檔中的別名,使用https上傳,需要輸入賬號和密碼才能完成上傳,Window系統會自動保存賬號和密碼,如果想修改Window已經保存的用戶名和密碼,可以參考修改Gitee登錄憑據,
有時第一次上傳會出現不成功的情況,可以嘗試使用git push -u name master,該命令的作用是將 name 倉庫的主分支作為上流分支,-u和–set-upstream作用相同,



ssh上傳
如果要使用ssh上傳,需要先生成SSH密匙,并將公匙保存到gitee個人設定的SSH公匙設定中,具體程序可以參考:生成SSH密匙,實作代碼上傳
有時第一次上傳會出現不成功的情況,可以嘗試使用git push -u name master,該命令的作用是將 name 倉庫的主分支作為上流分支,-u和–set-upstream作用相同,


七、從遠程倉庫clone、fetch或pull
1. 克隆遠程倉庫到本地
git的克隆可以將遠程倉庫拷貝到本地,同時自動進行本地倉庫的初始化,
在任意目錄下打開Git bash,輸入 git clone <repo> [<dir>],repo為遠程倉庫網址,dir為克隆倉庫的存放路徑(可以不用提前創建),如果不填,則默認為遠程倉庫名(不是本地別名),
[注意]:clone和push一樣需要密碼,

克隆成功,進入該倉庫目錄,和上傳時的作業區一模一樣,提交日志也相同,

2. 獲取遠程倉庫(fetch)
git fetch的作用是將遠程倉庫的分支拷貝到本地倉庫,并把最新版本保存在FETCH_HEAD分支,獲取遠程倉庫分支后,還需手動將其合并到當前分支,
命令格式: git fetch [<repository>] ,repository為遠程倉庫的網路地址,
git merge <分支名>用來合并分支

3. 拉取遠程倉庫(pull)
git pull和git fetch類似,但git pull會自動將遠程倉庫的分支合并到本地的當前分支,

由于本文旨在介紹Git的基本作業原理,所以一些復雜的情況就不在這里討論了,特別是最后一章內容,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301751.html
標籤:java
