簡介
本文是面向零基礎(chǔ)者的Git入門教程,內(nèi)容較為基礎(chǔ)簡單,主要來源于各種資料整合以及個人使用經(jīng)驗,僅作基本了解性介紹。內(nèi)容基本涵蓋Git常用操作,以各種命令為中心,逐一解釋其用法和注意事項。另附在VScode利用其輔助功能使用Git的介紹。
基本概念
關(guān)于Git
Git是一個開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項目。Git在全球范圍被廣泛使用,主要用于代碼開發(fā)過程中的版本管理,Git每個版本所儲存的是不同版本文件的修改內(nèi)容,因此相比于備份保存各個版本可以節(jié)省很多空間,尤其是版本數(shù)量極多的情況下。自然地,作為版本控制系統(tǒng),Git也可以方便地回退到之前的版本。Git基于修改內(nèi)容的存儲方法也使得Git可以顯示出不同版本間內(nèi)容的差異,快速找到團隊中其他人修改的部分。
空間
Git管理的空間可以分為三部分,工作區(qū)、暫存區(qū)和版本庫。
- 工作區(qū):即在電腦里能看到的目錄,能夠直接進行操作編輯修改的部分。若不使用Git相當于只有這部分空間,此部分空間與無Git時無異。
- 暫存區(qū):英文叫stage或index。一般存放在.git目錄下的index文件(.git/index)中,所以我們把暫存區(qū)有時也叫作索引(index)。暫存區(qū)是工作區(qū)到版本庫之間的過渡,將文件加到暫存區(qū)的過程相當于是選擇需要放入版本庫的文件,在執(zhí)行提交命令時所有暫存區(qū)中的文件都會被移至版本庫。
- 版本庫:工作區(qū)有一個隱藏目錄 .git,這個就是Git的版本庫。在文件管理器中選擇顯示隱藏文件可以看到.git文件夾。這里存儲了之前提交的各個版本的文件,是Git最核心的空間。它也被稱為資源庫、倉庫。
一個完整的Git上傳過程是文件從工作區(qū)進入暫存區(qū)保存到版本庫的過程,通常文件不會在暫存區(qū)停留很久,一般在將所需文件都加入到暫存區(qū)后會立刻接著提交到版本庫。
版本樹
每個版本(也稱快照)都被使用哈希值標記,并且附有每次提交都強制要求填寫的注解??梢允褂妹罨蜉o助軟件查看其中存儲的內(nèi)容,版本間的相對關(guān)系被稱為版本樹,可以通過圖形化工具看到版本樹的圖形表示,在命令行中則顯示每個版本的父版本。某些操作會使版本從版本樹上消失,但總是可以通過哈希值訪問到相應版本。
分支
在不使用分支等命令時,版本樹是按時間先后排列的線性結(jié)構(gòu),而分支則使版本樹出現(xiàn)分叉,成為真正的樹形。分支可以允許用戶在某個特定版本的基礎(chǔ)上做出不同修改,并可以將這些分支合并,可以創(chuàng)建多個分支,分別由不同人負責開發(fā)各個功能模塊,并在完成后合并各分支修改,實現(xiàn)并行開發(fā)。
HEAD指針
HEAD指針指向目前所操作的Git版本,改變HEAD指針的位置的過程就是回退、恢復、切換分支的過程。在默認情況下HEAD指針指向最新的版本,可以使用命令切換HEAD指針指向,實現(xiàn)在不同版本間的切換。在切換所操作的分支時需要將HEAD指針指向目標分支,分支本身實際上也是一個指向它所在分叉上最新版本的指針。
遠程倉庫
Git可以在本地建立一個版本管理倉庫,也可以將這個倉庫共享到遠程服務器上,如Github、Gitee等平臺,在云端保存代碼或是將代碼共享給更多人。Github是最大最熱門的平臺,但國內(nèi)連接時可能會有一定的困難,而Gitee連接相對更為穩(wěn)定。在云端保存代碼時要注意不要使用amend、undo、redo之類修改歷史記錄的命令,防止同一版本不同人獲取到的內(nèi)容不一致,應當提交新一版以代替此類行為。
相關(guān)資料
以下列出了一些介紹Git的資料鏈接,僅供參考,根據(jù)個人情況選擇。
菜鳥教程:列出了Git中常用的命令,并對于必要的概念做出了清晰解釋??上却笾聻g覽以對Git有一個基本了解,也可在使用中隨時查閱所需內(nèi)容。若要查看所有命令可至Git官網(wǎng)。
Git闖關(guān)式學習:熟悉Git操作,強化對版本樹的概念理解。每關(guān)前都有帶動畫演示的說明,并且在關(guān)卡內(nèi)練習指定操作,此教程對版本樹變更做了可視化處理以便理解。教程內(nèi)容覆蓋除配置Git外的幾乎所有常用命令。
約定式提交:使你的提交信息更規(guī)范更具可讀性,若僅為個人備份文件而使用Git可隨意。
Git 各平臺安裝包下載地址(Git官網(wǎng)):http://git-scm.com/downloads
以下分別選取了通過Git Bash、Vscode終端、GitKraken圖形化界面等三種方式使用Git的介紹視頻各一,可大致了解其異同。Git Bash、Vscode終端都使用Git命令行,操作基本一致,圖形化界面對操作方式有較大改變,不同軟件的操作也有所區(qū)別,目前有多種Git圖像化界面,可自行選擇感興趣的進行深入了解。
Git介紹視頻:
Git Bash(Git自帶的命令行方式):git、github 保姆級教程入門,工作和協(xié)作必備技術(shù),github提交pr - pull request
使用Vscode終端:『教程』簡單明了的Git入門
GitKraken圖形化界面:Git + GitHub 10分鐘完全入門、Git + GitHub 10分鐘完全入門 (進階)
全過程指南
創(chuàng)建倉庫
建立本地倉庫(git init)
git init #建立本地倉庫
使用Git首先要在本地創(chuàng)建一個代碼倉庫,選擇文件夾目錄后執(zhí)行$ git init
即可,完成后會創(chuàng)建一個名為".git"的文件夾(以.開頭為隱藏文件夾,在文件管理器中顯示選項卡下勾選顯示隱藏的項目可見),無需關(guān)注此文件夾中內(nèi)容,無法直接打開讀取其中文件內(nèi)容。
輸入以下兩條指令以設(shè)置用戶名和郵箱,替換引號內(nèi)文本為個人信息,Git不會檢查信息的有效性,僅作為提交時的附帶信息以便其他人聯(lián)系修改者。若無--global
則只對當前倉庫有效。必須填寫此信息否則無法提交。
$ git config --global user.name "your name"
$ git config --global user.email "your_email@youremail.com"
克隆遠程倉庫(git clone)
git clone [遠程倉庫地址] #將遠程倉庫克隆到本地
當遠程倉庫已存在時,不需在本地執(zhí)行$ git init
,而需要使用$ git clone
命令。如其名,此命令的功能是將遠程倉庫的內(nèi)容克隆到本地。當團隊共同開發(fā)一個項目時,除了項目的創(chuàng)建者,其他人需要以此命令克隆項目,否則可能會因為本地和遠程文件不一致而無法正常同步,不能執(zhí)行git fetch
、git pull
、git push
等命令,產(chǎn)生不必要的麻煩。
使用此命令下載Github、Gitee等網(wǎng)站上的項目時會下載“.git”文件夾從而保留版本修改信息,而下載zip壓縮包時因不會下載“.git”文件夾,會丟失此部分信息,則若下載后要使用Git需要執(zhí)行$ git init
以創(chuàng)建“.git”文件夾。
提交文件
加入暫存區(qū)(git add、git status)
$ git add [文件名] #添加指定文件更改到暫存區(qū)
$ git add . #添加文件夾下所有文件更改到暫存區(qū)
當對一個文件執(zhí)行$ git add [文件名]
命令時,此文件更改將被加入暫存區(qū),$ git add .
可以將所有文件更改加入暫存區(qū)(未修改的無法加入)。使用$ git status
命令可以查看暫存區(qū)中所有文件更改。
提交(git commit)
$ git commit #通過vim編輯注解信息
$ git commit -m "注解信息" #以消息方式快速提交
git commit命令可以將暫存區(qū)中文件移入版本庫,并在當前分支下增加一條版本記錄,每次提交都必須填寫注解消息。
命令行中直接輸入$ git commit
會打開一個vim編輯器頁面,在vim中按a或i打開編輯模式,以“#”開頭行的內(nèi)容會被忽略,其余的為本次提交的注解信息(不能為空,否則不能提交),esc鍵退出編輯,按:輸入保存方式,輸入wq(保存并退出),回車確認完成提交?;蛘呤褂?code>$ git commit -m "注解信息"以快速提交,m是message的縮寫。
查看記錄(git log、gitk)
$ git log #查看所有提交記錄
$ gitk #打開圖形化的查看窗口
可以通過$ git log
命令查看所有記錄,可以添加修飾以使得記錄更簡潔易懂或是翻轉(zhuǎn),具體參考Git 查看提交歷史 | 菜鳥教程 (runoob.com),在命令行中黃字commit后長串的十六進制數(shù)字即為此版本的哈希值,可以唯一代表此版本,當需要操作此版本時可以使用此值代表,只需前四五位即可,無需全部完整數(shù)值。
當$ git log
需顯示的內(nèi)容過多,無法在一屏內(nèi)完全顯示時可能會看到在底部有冒號出現(xiàn),如下圖所示。此時按回車可向下滾動一行,q退出,h顯示幫助查看更多按鍵功能。此時若改變終端顯示區(qū)域大小可能會出現(xiàn)故障無法正常響應,請避免此操作。
若不喜歡命令行的顯示方式也可以通過$ gitk
打開圖形化的查看窗口,也可以考慮使用 SourceTree、Github Desktop、TortoiseGit 等Git圖形化工具。此窗口中選中版本的哈希值顯示在SHA1 ID框內(nèi)。
版本樹管理
標簽(git tag)
$ git tag [標簽名] #為當前HEAD指向的提交記錄打上標簽
$ git tag [標簽名] [哈希值] #為指定版本補打標簽
在任何時候輸入$ git tag [標簽名]
將為最新提交記錄打上標簽(實際上是HEAD指針所指位置,通常指向當前分支最新版本),此后可以使用該標簽名指代這一版本而不需使用哈希值,$ git tag [標簽名] [哈希值]
則可以為之前的某一版本補打標簽,可以在git log中查看所需值,不需要輸入完整的哈希值,只需輸入一部分即可自動識別。添加“-a”修飾符可以為標簽加注解,和$ git commit
提交時一致。一個版本可以有不止一個標簽。
分支(git branch、git checkout/git switch、git merge)
$ git branch [分支名] #創(chuàng)建分支
$ git branch -d [分支名] #刪除分支
使用$ git branch [分支名]
可以創(chuàng)建一個新分支,使用$ git branch -d [分支名]
可以刪除指定分支,Git 分支實際上是指向更改快照的指針。分支創(chuàng)建的位置為HEAD指針位置,在$ git log
中可以看到HEAD指針的位置,一般會跟隨最新版本,通過一些命令操作可以使HEAD指針與最新版本分離,進入分離HEAD模式,Git此時也會發(fā)出提示。HEAD指針是git操作默認的參考位置,在使用操作對象為某一特定版本的命令(如git tag)時若缺省指定版本的參數(shù),則對HEAD指針所指的版本進行操作。
$ git checkout [分支名] #切換分支
$ git switch [分支名] #同上,建議使用這個
$ git merge [分支名] #合并分支
切換分支命令:$ git checkout [分支名]
,新版本git中可以使用git switch代替git checkout,checkout 命令具有分支的管理和文件的恢復兩個核心功能,功能較多、不夠準確。在 git 2.23 版本中新增了 switch 和 restore命令,用于替代 checkout 命令,進而分化 checkout 命令的職責。
此命令實際是改變HEAD指針所指位置,分支名可以用任一版本位置代替。當指向某一分支時,HEAD指針會和該分支合并,指向隨著此分支變化而變化;當指向某一特定版本時則會進入分離HEAD模式,即使此版本是當前分支指向的位置。
利用分支可以實現(xiàn)多條路線同時開發(fā),互不干擾,當分支開發(fā)完成時可以使用$ git merge [分支名]
合并分支到當前分支上。
編輯版本樹(git rebase、git cherry-pick)
$ git rebase [目標分支名] #將當前分支移動到目標分支上
$ git rebase [目標分支名] [源分支名] #將源分支移動到目標分支上
$ git cherry-pick [提交1] [提交2] [提交3] ... #可填寫更多提交,將指定提交按命令中順序排列移動到當前分支下
這兩個命令會改變版本數(shù)的形狀,可能會導致提交到遠程倉庫時出現(xiàn)問題,可在本地使用,若涉及遠程倉庫需謹慎。
git rebase和git merge實現(xiàn)的功能相同,但會使兩個分支合并成一條,改變已有的版本數(shù)。
git cherry-pick如其名,會像摘櫻桃一樣把提交從原有分支上摘下,按命令中順序排列成串后連接在當前分支后。
可以在Git闖關(guān)式學習中嘗試這兩個命令,觀察版本樹的變化。
文件更改
刪除文件(git rm)
$ git rm [文件名]
在Git工作區(qū)中若要刪除文件可以使用git rm命令。
Git添加了暫存區(qū),要完成刪除文件操作需要將此更改加入暫存區(qū)并提交到版本庫。在文件夾中直接刪除文件后刪除文件的操作不會進入暫存區(qū),此時使用$ git status
會看到
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted:(被刪除的文件)
此時可以按提示使用git add將刪除文件加入暫存區(qū),而使用git rm命令刪除文件,此更改將直接進入暫存區(qū),可根據(jù)習慣和便利程度選擇刪除文件的方式。
移動或重命名文件(git mv)
$ git mv [文件名] [新文件名]
在Git工作區(qū)中若要移動或重命名文件可以使用git mv命令,文件名中帶路徑即可指定文件位置。
git mv和git rm類似,操作完成后更改直接進入暫存區(qū),不需額外使用git add。使用這兩個命令可以避免在刪除或移動文件后因文件夾列表發(fā)生變化而忽視了這一更改的情況發(fā)生,不過借助輔助工具,例如VScode的“源代碼管理”頁面可以直觀地看到這些變化(后面有相關(guān)使用說明),只需在每次提交前記得將所需提交的更改都加入暫存區(qū)即可。
遠程倉庫
添加遠程倉庫(git remote add)
$ git remote add [遠程倉庫名] [地址] #添加遠程倉庫
$ git remote #查看已有的遠程倉庫,僅顯示名字
$ git remote -v #查看已有的遠程倉庫,帶地址
使用git remote add可以添加遠程倉庫,倉庫名默認origin,地址在Github、Gitee的倉庫網(wǎng)頁上獲取。git remote可以查看已有的遠程倉庫,添加“-v”顯示帶地址的詳細信息,v是verbose的縮寫。添加遠程倉庫后可以將本地倉庫同步到遠程倉庫。若是使用git clone創(chuàng)建的本地倉庫則不需要此步,遠程倉庫默認為git clone來源倉庫。
更改遠程倉庫(git remote rm、git remote rename)
$ git remote rm [遠程倉庫名] # 刪除遠程倉庫
$ git remote rename [原遠程倉庫名] [新遠程倉庫名] # 修改倉庫名
若輸入錯誤或是想要修改倉庫名可以使用以上兩條指令。
從遠程倉庫同步(git fetch、git pull)
$ git fetch #獲取遠程倉庫更新
$ git pull #git fetch + git merge
git fetch則是從遠程倉庫同步到本地版本庫,通常是在多人協(xié)同使用此操作,當其他人向遠程倉庫提交更新之后,遠程倉庫和本地倉庫不一致,則需要使用此指令獲取更新,需要注意的是此命令不會改動本地分支指向,需要另行手動更新。若在上次同步后本地和遠程倉庫都有改動,則執(zhí)行此命令后版本樹會在上次同步的位置后分叉。
在使用$ git fetch
命令后通常會接著使用$ git merge
命令將遠程倉庫的改動合并到當前分支,$ git pull
命令可以代替這兩個命令,與$ git fetch;$ git merge
等價。
進行遠程倉庫相關(guān)操作時版本樹較為復雜多變,push、pull也有更靈活的使用方法,具體可參考Git闖關(guān)式教程遠程倉庫相關(guān)內(nèi)容。
提交到遠程倉庫(git push)
$ git push
$ git push [遠程倉庫名] [分支名] #將指定分支提交到遠程倉庫
git push可以將本地版本庫同步到遠程倉庫,同時會在本地更新origin/main分支(默認,可更改,也可能為origin/master),此分支即代表遠程倉庫同步的進度。在倉庫中初次使用git push時,Git可能會給出如下提示,意為當前分支沒有與遠程分支關(guān)聯(lián),使用所給代碼即可將當前分支(此處為master)與遠程分支(此處為origin)關(guān)聯(lián),之后直接輸入git push
即可。
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
當首次連接到遠程倉庫平臺時需要進行賬號驗證,按提示操作完成登錄才能進行提交。
當版本樹存在沖突時無法提交,故一般先從遠程倉庫同步后再執(zhí)行提交,具體可參考Git闖關(guān)式教程遠程倉庫相關(guān)內(nèi)容。
遠程倉庫間的操作(fork、pull request)
fork可以將一個倉庫復制到自己的賬號下,這樣做的原因是自己賬號下的倉庫具有完整的修改權(quán)限,而出于防止篡改的原因,通常不能直接修改其他人或是團隊共有的倉庫,若要進行修改需要先在目標倉庫頁面下將倉庫fork到自己賬號下再進行修改。
修改完成后想要提交修改到原倉庫則需要提交pull request,類似于從本地提交到遠程倉庫時的git push,版本出現(xiàn)沖突時也需要先完成同步,但不同的是pull request是讓目標倉庫執(zhí)行pull,一般此操作需要管理員審核通過,具體根據(jù)倉庫設(shè)置而定。此操作使用較頻繁,簡稱pr。
版本回退
本地倉庫(git reset)
$ git reset [指定版本]
若想要回退到之前的版本,可以使用git reset命令。指定版本的方式可以是HEAD指針、分支名、哈希值、標簽名、相對引用。
相對引用方式中可以使用其他幾種方式指定一個參考位置,并加上“^”代表上一個版本或“~”加數(shù)字表示前進幾個版本(如 “~2”,代表前兩個版本),要注意“^”加數(shù)字表示版本數(shù)存在多個分支時選中第幾個父節(jié)點而非前幾個版本(如“^2”,表示第二個父節(jié)點),當使用合并分支后就會出現(xiàn)一個節(jié)點存在多個父節(jié)點的情況。
當使用git reset后,所回退版本之后的版本會消失,導致版本樹發(fā)生變化。
git reset有mix、soft、hard三種模式,不輸入?yún)?shù)默認mix,具體可參考Git Reset 三種模式。
遠程倉庫(git revert)
$ git revert [指定版本]
對于遠程倉庫則不能使用git reset命令,因為它會改動已有的版本樹,導致同步問題。應使用git revert代替,使用方法與git reset一致,但它會在最后追加一個新的提交代替git reset直接修改版本樹的操作,這樣這一修改也能推送給其它人。
在VScode中使用Git
實時顯示修改
對于進行了Git初始化的文件夾,VScode會實時顯示當前工作區(qū)中文件較版本庫中最新版本的變化,無需ctrl+s保存即可顯示,跟隨編輯實時更新,類似git diff功能,但更加直觀。下圖中標記依次為刪除行、修改行、新行。當更改加入暫存區(qū)后不再顯示。
自動標記已修改文件
當前打開文件夾下的所有文件的修改狀態(tài)也會在“資源管理器”中以文件名顏色和字母符號進行標記。但需注意必須按ctrl+s保存后才會在“資源管理器”中顯示標記,并出現(xiàn)在“源代碼管理”頁面中。U代表未跟蹤,即版本庫中和暫存區(qū)中都沒有任何此文件的記錄,A表示添加,版本庫中沒有但在暫存區(qū)中,M代表修改,D代表刪除(顯然無法“資源管理器”中出現(xiàn),只出現(xiàn)在“源代碼管理”中)。
源代碼管理頁面
“源代碼管理”是VScode對于Git提交提供的圖形化操作界面,可以方便地管理在暫存區(qū)中的文件,所有更改過的文件都會出現(xiàn)在此界面中的“更改”欄下,在此頁面可以快捷地將文件加入或拉出暫存區(qū),“暫存的更改”欄下即為暫存區(qū)中的內(nèi)容,可以使用$ git status
進行驗證。此頁面點擊提交相當于$ git commit
但注意會在右側(cè)文本編輯區(qū)打開一個文本文件而非在終端以vim方式顯示,同樣不能為空,輸入注解文本并保存后關(guān)閉此頁面完成提交。也可以在“提交”上方的“消息”框中先填入文本再點擊“提交”,相當于$ git commit -m "注解信息"
。點擊“提交”右側(cè)下拉箭頭,除“提交”外還有“提交和推送”“提交和同步”,相當于$ git commit
之后執(zhí)行$ git push
或$ git pull
。此外也需注意此方式默認連接遠程倉庫origin/main(遠程倉庫默認名),若修改了名字或要提交到其他倉庫其他分支則要另外進行設(shè)置。文章來源:http://www.zghlxwxcb.cn/news/detail-758652.html
若本地所有修改都已提交且設(shè)置了遠程服務器Git倉庫,“提交”按鈕會變?yōu)椤巴礁摹?,并顯示推送和同步的數(shù)量,若提示存在沖突可選擇進入此時提供的“合并編輯器”選項手動解決沖突,修改文件為所需的樣子。文章來源地址http://www.zghlxwxcb.cn/news/detail-758652.html
到了這里,關(guān)于Git入門使用到遠程倉庫全指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!