git 提交文件_git原理与实战
一,序言
之前在工作中也接觸過git,但是沒有在現(xiàn)公司這里用的功能這么多。主要的差異體現(xiàn)在如下兩個方面:
1,之前公司使用git主要基于圖形用戶界面,這對于處理沖突非常有幫助,不太容易改錯地方;而現(xiàn)公司這里git的使用主要基于命令行
2,之前公司使用git的操作相對來說比較簡單,沒有現(xiàn)公司這里這么多稍微高級一點的功能,比如多個提交合并為一個單獨(dú)的提交,cherry-pick之類的
3,之前公司的項目開發(fā)流程也和現(xiàn)公司有點不一樣,之前公司很少有版本的概念,可能是因為互聯(lián)網(wǎng)公司發(fā)布節(jié)奏比較快,每次發(fā)布都是直接把master分支做發(fā)布,重新拉分支也都是基于master分支來拉,所以版本的概念比較弱化,但是來了現(xiàn)公司這里發(fā)現(xiàn)版本在里面占了一個很大的比重
所以我還是有必要系統(tǒng)性地學(xué)習(xí)一下git的,主要是命令行的方式。
二,git簡介
git是一個分布式版本控制系統(tǒng),這里的分布式主要體現(xiàn)在每臺服務(wù)器上都擁有一個版本庫的完整的所有的信息,包括歷史信息;所以在git中,理論上沒有一個中央服務(wù)器的概念,所有的服務(wù)器都擁有完整的信息。但是在實際工作中,我們還是會選擇一個中央服務(wù)器來方便各個版本庫信息的交互。不過我們不用擔(dān)心中央服務(wù)器宕機(jī),只要每個服務(wù)器不全部宕機(jī)就可以。
三,準(zhǔn)備git環(huán)境
怎么在服務(wù)器上安裝git,這個過程不在這里展開說明,假定個人的本機(jī)電腦上已經(jīng)安裝了git。
3.1,創(chuàng)建git版本庫
新建一個目錄,cd進(jìn)入新建的目錄,在當(dāng)前目錄下運(yùn)行指令git init,此時當(dāng)前目錄就被git版本庫管理起來了
此時就創(chuàng)建了一個git版本庫。新建的目錄就叫做工作目錄,在工作目錄下面有一個名為.git的隱藏目錄,這個隱藏目錄就是git的版本庫。所有被git管理的文件都在這個版本庫中。版本庫簡而言之就是一種具有特殊索引的數(shù)據(jù)結(jié)構(gòu),工作目錄下面的所有文件都會被該索引管理起來。
按照約定,git版本庫位于工作目錄下面,我們對源文件的所有修改都是在工作目錄下面進(jìn)行的,然后通過指令被git版本庫管理起來。
3.2,首次提交
創(chuàng)建好了版本庫之后,接下來就要修改文件并納入git版本庫管理之中了。首先介紹一下git版本庫的大概結(jié)構(gòu):
整個git的結(jié)構(gòu)可以再次細(xì)化為三個區(qū)域:工作目錄(working directory)、暫存區(qū)(stage area)、版本庫(.git repository)。我們要將工作目錄中的修改提交到版本庫中(納入到版本庫的管理體系中),需要經(jīng)過兩步:將修改先放到暫存區(qū)中,再將暫存區(qū)中的修改提交到版本庫中。
將修改放到暫存區(qū)中這一步驟可以理解為將要提交的文件放到一個地方統(tǒng)一管理起來,以便一并提交。不在暫存區(qū)中的文件是不能參與提交的。真正的提交動作是將暫存區(qū)中的修改提交到版本庫中。
將工作區(qū)中的修改暫存起來的指令是git add xxx
將暫存區(qū)中的修改提交到版本庫中的指令是git commit -m "comment"
git add 后面可以跟目錄路徑(該目錄下面的所有文件都要被暫存),可以跟文件名(或者多個文件名),后面的所有文件名都要被暫存
git commit -m "xxx"中必須有備注,否則不允許提交
3.3,檢查狀態(tài)
檢查git版本庫的狀態(tài)可以用git status指令
git status指令會顯示出自上次提交以來在暫存區(qū)中還沒有被提交的修改,在工作目錄中還沒有被暫存起來的文件(新建的文件),在工作目錄中也在暫存區(qū)中的文件但是對該文件的修改還沒有被暫存;已經(jīng)被提交的修改不會被顯示在git status指令的輸出中。
出現(xiàn)上述三種不同狀態(tài)的原因是:
如果我們在當(dāng)前工作目錄中新建一個文件,那么該文件肯定沒有被暫存,就出現(xiàn)了第三種狀態(tài)。
如果我們對已有文件進(jìn)行了修改,并暫存起來,那么就會出現(xiàn)第一種狀態(tài)。
如果我們對已有文件進(jìn)行了修改。并暫存起來,但是沒有提交;同時對該文件又進(jìn)行了修改但是沒有暫存,此時就會出現(xiàn)第二種狀態(tài)。
可以通過git add ./指令對三面三種狀態(tài)同時進(jìn)行暫存,并通過git commit統(tǒng)一提交。
3.4,提交修改
通過git commit -m "comment"將暫存區(qū)中的修改提交到git版本庫,每次提交都會產(chǎn)生一個唯一的hash值
3.5,顯示提交歷史
git log命令可以顯示出該版本庫中歷史上所有的修改,但是為了方便顯示,git log命令也提供了很多其他選項
git log命令會將所有的提交按照時間順序降序排列出來,會顯示出很詳細(xì)的提交信息。
git log --oneline選項只顯示出每次提交的hash值和提交注釋
git log --graph選項會以圖形化的方式顯示出每次提交,如果有多人同時修改一個文件,圖形化界面會顯示出交叉提交
3.6,克隆版本庫
在git中不同的開發(fā)者位于不同的服務(wù)器上面,每個開發(fā)者都有一個他自己的版本庫,開發(fā)者們通過交換各自版本庫中的提交來實現(xiàn)項目合作。
假定有一個新的開發(fā)者也位于這臺主機(jī)上,他需要在另一個工作目錄中編寫代碼。我們?yōu)樗麆?chuàng)建一個新的工作目錄:
mkdir ../first-steps-clone,cd ../first-steps-clone
在當(dāng)前目錄(../first-steps-clone)下面執(zhí)行g(shù)it clone ../first-step ./
這樣就可以擁有上次源版本庫的一個完整的副本,git會自動在當(dāng)前目錄下面創(chuàng)建一個新的版本庫,該新的版本庫完全復(fù)制原來的版本庫。
從此也可以看出,git clone指令大致具有如下形式:git clone src dest
git clone不僅僅可以從遠(yuǎn)端服務(wù)器通過SSH協(xié)議克隆版本庫到本地,也可以在本地不同的目錄之間克隆。
3.7,從另一個版本庫中獲得修改
現(xiàn)在我們已經(jīng)有了兩個版本庫(first-step和first-step-clone)了,此時我們可以模擬多人協(xié)作的過程了。在first-step中對文件做各種修改然后提交。在first-step-clone中通過git pull指令將first-step中的修改fetch、merge、commit到本地版本庫中
由于在clone的時候first-step中的路徑已經(jīng)被存儲到了first-step-clone中了,所以可以直接使用git pull指令從first-step中取回新的提交修改。
git pull指令做了如下幾件事情:
1,fetch; 將first-step中的修改抓取到本地
2,compare 將first-step中的修改和本地版本庫的修改進(jìn)行比較
3,conflict 如果有沖突,git就不能繼續(xù)進(jìn)行下去,需要人工解決沖突后自行提交
4,merge 如果沒有沖突,git會自動執(zhí)行合并操作
5,commit 如果沒有沖突,git會自動產(chǎn)生一個提交,并在終端打開一個文件供你寫入提交備注
可以看到,如果沒有沖突,那么git會自己執(zhí)行merge , commit所有操作,并在commit的時候彈出一個文件讓你寫入備注,然后自動創(chuàng)建一個提交;如果有沖突的話,git就停止進(jìn)行,讓你在本地解決了沖突之后由你手工提交
3.8,rm , git rm , git rm --cached
之前對git rm指令不太熟悉,這里一并介紹一下。
rm指令大家都很熟悉,就是將文件刪除。假如執(zhí)行如下的指令,rm foo.txt
對于git來說表示的意思是:本地文件系統(tǒng)中已經(jīng)將foo.txt刪除,但是git版本庫中依然沒有刪除。執(zhí)行g(shù)it status會顯示出如下所示:
Changes not staged for commit:
deleted: wangyuzhong
也就是對工作目錄中文件的修改沒有被暫存起來,需要執(zhí)行g(shù)it add ./將該刪除暫存起來,此時git status會顯示:
Changes to be commited:
deleted: wangyuzhong
也就是該刪除已經(jīng)被暫存起來,還沒有被提交,可以執(zhí)行g(shù)it commit將刪除提交
git rm指令是將文件從工作目錄和暫存區(qū)中同時刪除,但是還沒有將刪除提交,比如執(zhí)行g(shù)it rm foov1.txt
git status顯示如下:
Changes to be commited:
deleted: foov1.txt
也就是說git rm foov1.txt等價于 rm foov1.txt git add foov1.txt
git rm --cached foov2.txt指令相當(dāng)于將foov2.txt從暫存區(qū)中刪除,但是不從本地文件系統(tǒng)中刪除,執(zhí)行g(shù)it status后顯示如下:
Changes to be commited:
deleted: foov2.txt
Untracked files:
foov2.txt
此時我們可以選擇git commit將刪除提交,也可以選擇git add ./恢復(fù)刪除,并提交
總結(jié)
以上是生活随笔為你收集整理的git 提交文件_git原理与实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Element-plus封装配置化表
- 下一篇: Chapter7-11_Deep Lea