溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

發(fā)布時間:2020-06-05 11:20:15 來源:網(wǎng)絡(luò) 閱讀:1462 作者:2012hjtwyf 欄目:web開發(fā)



什么是Git  

Git是一種非常流行的分布式版本控制系統(tǒng),它和其他版本控制系統(tǒng)的主要差別在于Git只關(guān)心文件數(shù)據(jù)的整體是否發(fā)生變化,而大多數(shù)版本其他系統(tǒng)只關(guān)心文件內(nèi)容的具體差異,這類系統(tǒng)(CVS,Subversion,Perforce,Bazaar 等等)

每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內(nèi)容


Git另一個比較好的地方在于絕大多數(shù)操作都可以在本地執(zhí)行,而每個本地都可以從服務(wù)器獲取一份完整的倉庫代碼

而且在沒網(wǎng)時仍然可以修改和使用大部分命令,在方便時再跟服務(wù)器進(jìn)行同步,這樣可以更好的實(shí)現(xiàn)多人聯(lián)合編程


另外個人感覺Git系統(tǒng)的強(qiáng)大在于它創(chuàng)建了一個個類似于快照的東西

記憶我們每一次的提交并且可以在未來的任何時候回到這里,對于大型項目的管理非常有效


最原始的版本控制是純手工的版本控制:修改文件,保存文件副本。有時候偷懶省事,保存副本時命名比較隨意

時間長了就不知道哪個是新的,哪個是老的了,即使知道新舊,可能也不知道每個版本是什么內(nèi)容

相對上一版作了什么修改了,當(dāng)幾個版本過去后,很可能就是下面這個老土的樣子了:



一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記


Git特點(diǎn)

分布式相比于集中式的最大區(qū)別在于開發(fā)者可以提交到本地

每個開發(fā)者通過克隆(git clone),在本地機(jī)器上拷貝一個完整的Git倉庫


直接記錄快照,而非差異比較 : Git 更像是把變化的文件作快照后,記錄在一個微型的文件系統(tǒng)中

近乎所有操作都是本地執(zhí)行 :在 Git 中的絕大多數(shù)操作都只需要訪問本地文件和資源,不用連網(wǎng)

時刻保持?jǐn)?shù)據(jù)完整性 :在保存到 Git 之前,所有數(shù)據(jù)都要進(jìn)行內(nèi)容的校驗(yàn)和(checksum)計算

                                        并將此結(jié)果作為數(shù)據(jù)的唯一標(biāo)識和索引

多數(shù)操作僅添加數(shù)據(jù) :常用的 Git 操作大多僅僅是把數(shù)據(jù)添加到數(shù)據(jù)庫


開發(fā)流程示意圖:

一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記


1、基本概念

Stage:暫存區(qū),緩存區(qū)

Repository:倉庫(本地倉庫).git目錄

Remote:遠(yuǎn)程倉庫

Track: 將一個新文件加入到git

Unstage:取消放入暫存區(qū)

 

Git存儲原理

Git 保存的不是文件差異或者變化量,而只是一系列文件快照。

快照管理:(微型文件系統(tǒng),文件指紋驗(yàn)證是否變化,不便的直接鏈接)

 一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

三種區(qū)域

 一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

所有數(shù)據(jù)存放在本地.git目錄,可以直接拷貝。

 

2、基本操作


2.1、倉庫創(chuàng)建

Git init


2.2、倉庫復(fù)制

Git clone  url

只會復(fù)制master下來

Git clone  url dir

指定文件夾

git clone https://github.com/libgit2/libgit2 mylibgit


2.3、文件管理

2.3.1、添加文件到暫存區(qū)

Git add *

Git add file

Git add dir       

 

2.3.2、刪除文件到暫存區(qū)

Git rm


2.3.3、修改文件名(移動)到暫存區(qū)

Git mv [file-orgin]  [file-rename]

 

2.3.4、提交暫存區(qū)到倉庫

Git commit –m “注釋”

 一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

2.3.5、撤銷修改文件

修改的文件可以在git status觀察到

如果撤銷修改

可以采用git checkout -- file的方式撤銷

撤銷所有

git checkout  -- *


2.3.6        撤銷暫存區(qū)數(shù)據(jù)

一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記


2.4、分支管理

查看分支:git branch

創(chuàng)建分支:git branch <name>

 

切換分支:git checkout <name>

創(chuàng)建+切換分支:git checkout -b <name>

 

合并某分支到當(dāng)前分支:git merge <name>

 

默認(rèn)使用fast-forward模式

一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

可以禁用,合并時會生成一個新的commit

git merge --no-ff -m "merge " dev

        

刪除分支:git branch -d <name>

 一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

遠(yuǎn)程分支下載:git checkout -b <本地分支名> origin/<遠(yuǎn)程分支名>

              

 合并沖突:

 當(dāng)merge出現(xiàn)沖突的時候,git會提醒

一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

需要手動修改后進(jìn)行提交

Git add

Git commit


2.5、版本管理

每個提交都是一個版本,git提供了一些方便的命令供我們使用。


2.5.1、查看日志

Git log

當(dāng)前分支的commit歷史


有用的配置

log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

Git reflog

顯示引用變化歷史,相當(dāng)于head變化

一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記


2.5.2、版本回退:

一個git reset --hard HEAD^

倆git reset --hard HEAD^^

多個git reset --hard HEAD~數(shù)字

 

回退到指定版本

git reset --hard commit_id

commitid可以從reflog或者log中查看

--hard表示丟棄暫存區(qū)的東西

 

--soft – 暫存區(qū)和工作目錄都不會被改變,改變都放在暫存區(qū)

--mixed – 默認(rèn)選項。緩存區(qū)和你指定的提交同步,但工作目錄不受影響,改變不會放在暫存區(qū)。

--hard – 緩存區(qū)和工作目錄都同步到你指定的提交

 

Git revert

reset是指將當(dāng)前head的內(nèi)容重置,不會留任何痕跡。

revert是撤銷某一次提交,但是這次撤銷也會作為一次提交進(jìn)行保存

 

假設(shè)當(dāng)前有3個commit,git log如下:

commit3:  add test3.c 

commit2:  add test2.c 

commit1:  add test1.c 


執(zhí)行 git revert HEAD~1之后,會提示提交信息,提交后git  log如下:

commit4:  Reverts “test2.c” 

commit3:  test3.c 

commit2:  test2.c 

commit1:  test1.c 


執(zhí)行完后,test2.c被刪除了,運(yùn)行g(shù)it status,無任何變化。

執(zhí)行 git reset HEAD~1之后,再次看git log,如下:

commit2:  test2.c 

commit1:  test1.c 


執(zhí)行完后,commit3被刪除了

但是test3.c還在本地緩存區(qū),運(yùn)行g(shù)it  status,可以看見提示test3.c可以用git add包含該文件。


若執(zhí)行g(shù)it reset --soft HEAD~1,log為:

commit2:  test2.c 

commit1:  test1.c 

執(zhí)行完后,test3.c也被刪除了,查看git  status,提示可以commit以提交test3.c,test3.c在暫存區(qū)。

 

若執(zhí)行g(shù)it reset --hard HEAD~1,log為:

commit2:  test2.c 

commit1:  test1.c 

執(zhí)行完后,test3.c也被刪除了,查看git  status,無任何變化。

 

2.6、標(biāo)簽管理

                           

2.6.1、打標(biāo)簽

相當(dāng)于給某個提交取一個好記住的名字,例如v1.0.0

git tag v1.0.0 [commitid]

 

2.6.2、顯示所有標(biāo)簽

git tag

 

2.6.3、顯示標(biāo)簽信息

Git show tagname

 

2.6.4、標(biāo)簽管理

命令git push origin <tagname>可以推送一個本地標(biāo)簽;

命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽;

 

命令git tag -d <tagname>可以刪除一個本地標(biāo)簽;

命令git push origin :refs/tags/<tagname>可以刪除一個遠(yuǎn)程標(biāo)簽。


2.7、遠(yuǎn)程管理

一般都要和兩部分人提供


2.7.1、git clone

從遠(yuǎn)程主機(jī)克隆一個版本庫

git clone <版本庫的網(wǎng)址> <本地目錄名>

 一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記


2.7.2、git remote

為了便于管理,Git要求每個遠(yuǎn)程主機(jī)都必須指定一個主機(jī)名。git remote命令就用于管理主機(jī)名。


列出所有主機(jī):git remote

帶網(wǎng)址列出主機(jī):git remote –v

clone版本庫的時候,所使用的遠(yuǎn)程主機(jī)自動被Git命名為origin

如果想用其他的主機(jī)名,需要用git clone命令的-o選項指定。

git clone -o jQuery https://github.com/jquery/jquery.git

 

git remote show命令加上主機(jī)名,可以查看該主機(jī)的詳細(xì)信息。

 git remote show <主機(jī)名>

git remote add命令用于添加遠(yuǎn)程主機(jī)。

 git remote add <主機(jī)名> <網(wǎng)址>

git remote rm命令用于刪除遠(yuǎn)程主機(jī)。

 git remote rm <主機(jī)名>

git remote rename命令用于遠(yuǎn)程主機(jī)的改名。

 git remote rename <原主機(jī)名> <新主機(jī)名>

 

2.7.3、git fetch

將某個遠(yuǎn)程主機(jī)的更新,全部取回本地。

如果只想取回特定分支的更新,可以指定分支名。

git fetch <遠(yuǎn)程主機(jī)名> <分支名>


所取回的更新,在本地主機(jī)上要用"遠(yuǎn)程主機(jī)名/分支名"的形式讀取

比如origin主機(jī)的master,就要用origin/master讀取。

git branch  –r,可以用來查看遠(yuǎn)程分支,

-a選項查看所有分支。

 可以采用git checkout <遠(yuǎn)程主機(jī)名>/ <分支名>切換到該分支

但是一般用git checkout -b newBrach <遠(yuǎn)程主機(jī)名>/ <分支名>

意思是在<遠(yuǎn)程主機(jī)名>/ <分支名>的基礎(chǔ)上,創(chuàng)建一個新分支。

也可以使用merge,合并遠(yuǎn)程分支。


2.7.4、git pull

取回遠(yuǎn)程主機(jī)某個分支的更新,再與本地的指定分支合并。

git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>

等同于先做git fetch,再做git merge


2.7.5、git push

命令用于將本地分支的更新,推送到遠(yuǎn)程主機(jī)。

git push <遠(yuǎn)程主機(jī)名>  <本地分支名>:<遠(yuǎn)程分支名>

省略遠(yuǎn)程分支名,表示將本地分支推送與之存在"追蹤關(guān)系"的遠(yuǎn)程分支(通常兩者同名)

如果該遠(yuǎn)程分支不存在,則會被新建。省略本地分支名,則表示刪除指定的遠(yuǎn)程分支

如果當(dāng)前分支與遠(yuǎn)程分支之間存在追蹤關(guān)系,則本地分支和遠(yuǎn)程分支都可以省略。

如果本地版本低,那么會報錯,可以--force強(qiáng)制push,--tags表示也推送tags.

git push --force origin

 

2.7.6、將本地庫推到遠(yuǎn)程端

git push origin master

 

2.8、自定義Git


2.8.1、自定義命令

可以利用git config命令來給命令取別名。

例如

git config --global alias.co csheckout

git config --global alias.ci commit

git config --global alias.br branch

git config --global alias.unstage 'reset HEAD'


其中,global表示針對當(dāng)前用戶所有倉庫都起作用

如果不加,表示只對當(dāng)前倉庫有用,每個倉庫的Git配置文件都放在.git/config文件中:

當(dāng)前用戶的config存放在用戶主目錄下的一個隱藏文件.gitconfig中:

 

2.8.2、忽略文件

 

為了防止沒用的文件被提醒untracked,可以在git倉庫主目錄下添加.gitignore文件

(本身要放到版本庫里面),該文件可以配置git要忽略哪些文件,不添加到倉庫中。

一個很流行的版本控制系統(tǒng)Git學(xué)習(xí)筆記

 

如果發(fā)現(xiàn)不能添加文件,可以采用

git check-ignore -v file檢查被哪個規(guī)則忽略了



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI