創(chuàng)建Git本地倉(cāng)庫(kù)
倉(cāng)庫(kù)是進(jìn)?版本控制的?個(gè)?件?錄
我們要想對(duì)?件進(jìn)?版本控制,就必須先創(chuàng)建?個(gè)倉(cāng)庫(kù)出來(lái)。
首先創(chuàng)建一個(gè)gitcode
目錄來(lái)存放git,
創(chuàng)建?個(gè)Git本地倉(cāng)庫(kù)對(duì)應(yīng)的命令為 git init
查看當(dāng)前目錄,發(fā)現(xiàn)多了個(gè)隱藏文件.git
.git
?錄是Git來(lái)跟蹤管理倉(cāng)庫(kù)的,不要?動(dòng)修改這個(gè)?錄??的?件,不然改亂了,就把Git倉(cāng)庫(kù)給破壞了
其中包含Git倉(cāng)庫(kù)的諸多細(xì)節(jié):
配置Git
當(dāng)安裝Git后?先要做的事情是設(shè)置你的用戶名稱(chēng)和e-mail地址,這是?常重要的
配置命令
git config [--global] user.name "Your Name"
git config [--global] user.email "email@example.com"
其中 --global
是?個(gè)可選項(xiàng)。如果使?了該選項(xiàng),表?這臺(tái)機(jī)器上所有的Git倉(cāng)庫(kù)都會(huì)使?這個(gè)配置。如果你希望在不同倉(cāng)庫(kù)中使?不同的 name
或e-mail
,可以不要--global
選項(xiàng),但要注意的是,執(zhí)?命令時(shí)必須要在倉(cāng)庫(kù)里。
查看是否配置成功
git config -l
重置配置
git config [--global] --unset user.name
git config [--global] --unset user.email
工作區(qū)、暫存區(qū)、版本庫(kù)
目前情況下,ReadMe
文件能夠被Git管理?
不行!
先來(lái)了解以下幾個(gè)概念:
? ?作區(qū):是在電腦上你要寫(xiě)代碼或?件的?錄。
? 暫存區(qū):英?叫stage或index。?般存放在 .git
?錄下的index?件(.git/index)中,我們把暫存區(qū)有時(shí)也叫作索引(index)。
? 版本庫(kù):?名倉(cāng)庫(kù),英?名 repository 。?作區(qū)有?個(gè)隱藏?錄 .git
,它不算?作區(qū),?是Git的版本庫(kù)。這個(gè)版本庫(kù)??的所有?件都可以被Git管理起來(lái),每個(gè)?件的修改、刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來(lái)某個(gè)時(shí)刻可以“還原”。
下?這個(gè)圖展?了?作區(qū)、暫存區(qū)和版本庫(kù)之間的關(guān)系:
當(dāng)對(duì)?作區(qū)修改(或新增)的?件執(zhí)?git add
命令時(shí),暫存區(qū)?錄樹(shù)的?件索引會(huì)被更新。
當(dāng)執(zhí)?提交操作 git commit
時(shí),master分?會(huì)做相應(yīng)的更新,可以簡(jiǎn)單理解為暫存區(qū)的?錄樹(shù)才會(huì)被真正寫(xiě)到版本庫(kù)中。
通過(guò)新建或粘貼進(jìn)?錄的?件,并不能稱(chēng)之為向倉(cāng)庫(kù)中新增?件,?只是
在?作區(qū)新增了?件。必須要通過(guò)使?git add
和git commit
命令才能將?件添加到倉(cāng)庫(kù)中進(jìn)?管理?。。?/strong>
如何進(jìn)行版本控制??
在版本庫(kù)中,還有一個(gè)對(duì)象庫(kù),稱(chēng)之為object
,被版本庫(kù)維護(hù)
當(dāng)我們?cè)?code>add操作時(shí),新增工作區(qū)修改的時(shí)候,會(huì)將修改的內(nèi)容寫(xiě)入到一個(gè)git
對(duì)象中,這個(gè)git
對(duì)象就會(huì)被維護(hù)到git
對(duì)象庫(kù)里面,這里就做到了對(duì)文件版本的管理。
添加文件–場(chǎng)景一
概述
在包含.git
的?錄下新建?個(gè)ReadMe
?件,我們可以使? git add
命令可以將?件添加到暫存區(qū):
? 添加?個(gè)或多個(gè)?件到暫存區(qū): git add [file1] [file2] ...
? 添加指定?錄到暫存區(qū),包括??錄: git add [dir]
? 添加當(dāng)前?錄下的所有?件改動(dòng)到暫存區(qū): git add .
再使? git commit 命令將暫存區(qū)內(nèi)容添加到本地倉(cāng)庫(kù)中:
? 提交暫存區(qū)全部?jī)?nèi)容到本地倉(cāng)庫(kù)中:git commit -m "message"
? 提交暫存區(qū)的指定?件到倉(cāng)庫(kù)區(qū): git commit [file1] [file2] ... -m "message"
注意 git commit
后?的 -m
選項(xiàng),要跟上描述本次提交的message
,由????完成,這部分內(nèi)容絕對(duì)不能省略,并要好好描述,是?來(lái)記錄你的提交細(xì)節(jié),是給我們?看的。
實(shí)例操作
在ReadMe
文件中輸入內(nèi)容:
add
操作:git add ReadMe
將ReadMe
文件添加git add .
將當(dāng)前目錄下的所有文件添加
此時(shí)將該文件添加到暫存區(qū)
commit
操作:
命令: git commit -m " "
," "
里面的內(nèi)容是細(xì)節(jié),需要詳細(xì)描述一下
此時(shí)將暫存區(qū)的文件添加到倉(cāng)庫(kù)中
還可以多次add
不同的?件,?只commit
?次便可以提交所有?件,是因?yàn)樾枰峤坏?件是通通被add
到暫存區(qū)中,然后?次性commit
暫存區(qū)的所有修改:
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ touch file1 file2 file3
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git add file1 file2 file3
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git commit -m "add 3files"
[master c98e197] add 3files
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1
create mode 100644 file2
create mode 100644 file3
截??前為?,我們已經(jīng)更夠?qū)⒋a直接提交?本地倉(cāng)庫(kù)了。我們可以使? git log
命令,來(lái)查看下歷史提交記錄:
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git log
commit c98e19749759f8e8c85373b8d8b643f9b2103f63
Author: gwj <2953778678@qq.com>
Date: Sun Feb 18 16:32:31 2024 +0800
add 3files
commit 4a98215b5ada82146bb128e829f356cf546b5514
Author: gwj <2953778678@qq.com>
Date: Sun Feb 18 13:22:41 2024 +0800
add first file
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$
上述顯示比較復(fù)雜,使用命令git log --pretty=oneline
,可以只顯示一行:
需要說(shuō)明的是,我們看到的??串類(lèi)似 23807c5…56eed6 的是每次提交的commit id
(版本號(hào)),Git的 commit id
不是1,2,3……遞增的數(shù)字,?是?個(gè)SHA1
計(jì)算出來(lái)的?個(gè)?常?的數(shù)字,??六進(jìn)制表?
查看.git文件
首先打開(kāi).git
目錄文件:
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│?? ├── applypatch-msg.sample
│?? ├── commit-msg.sample
│?? ├── post-update.sample
│?? ├── pre-applypatch.sample
│?? ├── pre-commit.sample
│?? ├── prepare-commit-msg.sample
│?? ├── pre-push.sample
│?? ├── pre-rebase.sample
│?? └── update.sample
├── index
├── info
│?? └── exclude
├── logs
│?? ├── HEAD
│?? └── refs
│?? └── heads
│?? └── master
├── objects
│?? ├── 36
│?? │?? └── 433addfb1f43c0e073e56442ca97184a317faa
│?? ├── 4a
│?? │?? └── 98215b5ada82146bb128e829f356cf546b5514
│?? ├── 4e
│?? │?? └── 786c2e4531dfd9c8622da069607a5e82716e19
│?? ├── c9
│?? │?? └── 8e19749759f8e8c85373b8d8b643f9b2103f63
│?? ├── e6
│?? │?? ├── 06bfbfa82fd7ffaeccd07c80ce9b10c2c0d485
│?? │?? └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│?? ├── info
│?? └── pack
└── refs
├── heads
│?? └── master
└── tags
17 directories, 24 files
-
index
就是我們的暫存區(qū),add
后的內(nèi)容都是添加到這?的。 -
HEAD
就是我們的默認(rèn)指向master
分?的指針:
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ cat .git/HEAD
ref: refs/heads/master
?默認(rèn)的master
分?,其實(shí)就是:
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ cat .git/refs/heads/master
c98e19749759f8e8c85373b8d8b643f9b2103f63
c98e19749759f8e8c85373b8d8b643f9b2103f63
保存的就是當(dāng)前最新的 commit id
-
objects
為Git的對(duì)象庫(kù),??包含了創(chuàng)建的各種版本庫(kù)對(duì)象及內(nèi)容。當(dāng)執(zhí)?git add
命令時(shí),暫存區(qū)的?錄樹(shù)被更新,同時(shí)?作區(qū)修改(或新增)的?件內(nèi)容被寫(xiě)?到對(duì)象庫(kù)中的?個(gè)新的對(duì)象中,就位于".git/objects"
?錄下。
查找object
時(shí)要將 commit id
分成2部分,其前2位是?件夾名稱(chēng),后38位是?件名稱(chēng)
找到這個(gè)?件之后,?般不能直接看到??是什么,該類(lèi)?件是經(jīng)過(guò)sha (安全哈希算法)
加密過(guò)的?件,好在我們可以使?git cat-file
命令來(lái)查看版本庫(kù)對(duì)象的內(nèi)容:
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git cat-file -p c98e19749759f8e8c85373b8d8b643f9b2103f63
tree e606bfbfa82fd7ffaeccd07c80ce9b10c2c0d485
parent 4a98215b5ada82146bb128e829f356cf546b5514
author gwj <2953778678@qq.com> 1708245151 +0800
committer gwj <2953778678@qq.com> 1708245151 +0800
add 3files
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git cat-file -p e606bfbfa82fd7ffaeccd07c80ce9b10c2c0d485
100644 blob 36433addfb1f43c0e073e56442ca97184a317faa ReadMe
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file2
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file3
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git cat-file -p 4a98215b5ada82146bb128e829f356cf546b5514
tree 4e786c2e4531dfd9c8622da069607a5e82716e19
author gwj <2953778678@qq.com> 1708233761 +0800
committer gwj <2953778678@qq.com> 1708233761 +0800
add first file
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git cat-file -p 36433addfb1f43c0e073e56442ca97184a317faa
hello gwj!!!
總結(jié)一下:
? index
:暫存區(qū), git add
后會(huì)更新該內(nèi)容。
? HEAD
:默認(rèn)指向master
分?的?個(gè)指針。
? refs/heads/master
:文件?保存當(dāng)前master
分?的最新 commit id
。
? objects
:包含了創(chuàng)建的各種版本庫(kù)對(duì)象及內(nèi)容,可以簡(jiǎn)單理解為放了git
維護(hù)的所有修改。
添加文件–場(chǎng)景二
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ touch file4
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git add file4
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ touch file5
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git commit -m "add file"
[master 86d20fb] add file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file4
新增file4
文件,將file4
文件添加到暫存區(qū),新增file5
文件,提交修改
提交后發(fā)現(xiàn)打印了 1 file changed, 0 insertions(+), 0 deletions(-)
,意思是只
有?個(gè)?件改變了,但是不是新增了兩個(gè)文件嘛?
回憶一下,git add
是將?件添加到暫存區(qū), git commit
是將暫存區(qū)的內(nèi)容添加到本地倉(cāng)庫(kù)中。由于我們并沒(méi)有使? git add file5
,file5
就不在暫存區(qū)中維護(hù),所以我們commit
的時(shí)候其實(shí)只是把已經(jīng)在暫存區(qū)的file4
提交了,?遺漏了?作區(qū)的file5
。如何提交file5
呢?很簡(jiǎn)單,再次add
, commit
即可。
修改文件
Git
跟蹤并管理的是修改,而非文件。
什么是修改??如你新增了?行,這就是?個(gè)修改,刪除了?行,也是?個(gè)修改,更改了某些字符,也是?個(gè)修改,刪了?些?加了?些,也是?個(gè)修改,甚?創(chuàng)建?個(gè)新?件,也算?個(gè)修改。
將ReadMe
?件進(jìn)??次修改:
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ vim ReadMe
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ cat ReadMe
hello gwj!!!
hello world!!!
hello HAUE!!!
hello git!!!
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
Changes not staged for commit
暫存區(qū)目前是干凈的,沒(méi)有要提交的內(nèi)容
修改是在工作區(qū)修改的
git status
可以查看哪些文件被修改,但是修改了什么看不了
git diff [file]
命令?來(lái)顯?暫存區(qū)和?作區(qū)?件的差異,顯?的格式正是Unix通?的diff
格式。也可以使? git diff HEAD -- [file]
命令來(lái)查看版本庫(kù)和?作區(qū)?件的區(qū)別。也可以使? git diff HEAD -- [file]
命令來(lái)查看版本庫(kù)和?作區(qū)?件的區(qū)別
例如:
git diff Read
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index 36433ad..df11e44 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1 +1,4 @@
hello gwj!!!
+hello world!!!
+hello HAUE!!!
+hello git!!!
格式解讀:
版本回退
Git能夠管理?件的歷史版本,這也是版本控制器重要的能?。如果有?天你發(fā)現(xiàn)之前前的?作做的出現(xiàn)了很?的問(wèn)題,需要在某個(gè)特定的歷史版本重新開(kāi)始,這個(gè)時(shí)候就需要版本回退的功能了。
回退版本命令:
git reset
git reset
本質(zhì)上是回退版本庫(kù)上的內(nèi)容
語(yǔ)法格式:
git reset [--soft | --mixed | --hard] [HEAD]
-
--mixed
為默認(rèn)選項(xiàng),使?時(shí)可以不?帶該參數(shù)。該參數(shù)將暫存區(qū)的內(nèi)容退回為指定提交版本內(nèi)容,?作區(qū)?件保持不變 -
--soft
參數(shù)對(duì)于?作區(qū)和暫存區(qū)的內(nèi)容都不變,只是將版本庫(kù)回退到某個(gè)指定版本 -
--hard
參數(shù)將暫存區(qū)與?作區(qū)都退回到指定版本。切記?作區(qū)有未提交的代碼時(shí)不要?這個(gè)命令,因?yàn)?作區(qū)會(huì)回滾,你沒(méi)有提交的代碼就再也找不回了,所以使?該參數(shù)前?定要慎重 -
HEAD
說(shuō)明:
- 可直接寫(xiě)成
commit id
,表?指定退回的版本 -
HEAD
表?當(dāng)前版本 -
HEAD^
上?個(gè)版本 -
HEAD^^
上上?個(gè)版本 - 以此類(lèi)推…
- 可以使?
?數(shù)字
表?:
-
HEAD~0
表?當(dāng)前版本 -
HEAD~1
上?個(gè)版本 -
HEAD^2
上上?個(gè)版本 - 以此類(lèi)推…
回退到添加ReadMe
文件時(shí):
此時(shí)只剩了add first file
,后面的都不見(jiàn)了
此時(shí)你又后悔了,想再回到之前的
只需要再次回退即可:
git reflog
?來(lái)記錄本地的每?次命令
Git的版本回退速度?常快,因?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前分?(此處是master)的HEAD
指針, refs/heads/master
?件?保存當(dāng)前master
分?的最新 commit id
。當(dāng)我們?cè)诨赝税姹镜臅r(shí)候,Git僅僅是給refs/heads/master
中存儲(chǔ)?個(gè)特定的version
,可以簡(jiǎn)單理解成如下?意圖:
撤銷(xiāo)修改
如果我們?cè)谖覀兊?作區(qū)寫(xiě)了很?時(shí)間代碼,越寫(xiě)越寫(xiě)不下去,覺(jué)得??寫(xiě)的實(shí)在是垃圾,想恢復(fù)到上?個(gè)版本。
撤銷(xiāo)的目的是不影響遠(yuǎn)程倉(cāng)庫(kù)的代碼!??!
情況?:對(duì)于工作區(qū)的代碼,還沒(méi)有 add
代碼還沒(méi)有add
,還在工作區(qū)中
在工作區(qū)中新增了一行代碼:add xx code
:
你完全可以vim
進(jìn)入,然后刪除add xx code
但是有時(shí)候可能已經(jīng)過(guò)了三四天了,?直都沒(méi)有提交,該怎么刪掉呢?你??都忘了??新增過(guò)哪些
可以 git diff xxx
?下,看看差別在刪啊,那你肯定?要花3天時(shí)間刪代碼了,并且很?的概率還會(huì)改出bug:
可以使? git checkout -- [file]
命令讓?作區(qū)的?件回到最近?次add
或commit
時(shí)的狀態(tài)。要注意 git checkout -- [file]
命令中的--
很重要,切記不要省略,?旦省略,該命令就變?yōu)槠渌馑剂耍纠?br>
情況?:已經(jīng) add ,但沒(méi)有 commit
新增的代碼add xxx code
已經(jīng)在暫存區(qū)
git reset
回退命令,該命令如果使?--mixed
參數(shù),可以將暫存區(qū)的內(nèi)容退回為指定的版本內(nèi)容,但?作區(qū)?件保持不變。那我們就可以回退下暫存區(qū)的內(nèi)容了!??!
Changes not staged for commit
表示暫存區(qū)沒(méi)有內(nèi)容需要被提交
此時(shí)就已經(jīng)回到情況一了,使用情況一的方法就可以撤銷(xiāo)修改
恢復(fù)了?。?!
情況三:已經(jīng) add ,并且也 commit 了
可以 git reset --hard HEAD^
回退到上?個(gè)版本!不過(guò),這是有條件的,就是你還沒(méi)有把??的本地版本庫(kù)推送到遠(yuǎn)程。?旦你推送到遠(yuǎn)程版本庫(kù),你就真的慘了……
此時(shí)工作區(qū)、存儲(chǔ)區(qū)、版本庫(kù)中都新增了代碼
撤銷(xiāo)命令:git reset --hard HEAD
這種方法的前提是: commit
之后沒(méi)有push
?。?!
刪除文件
在Git中,刪除也是?個(gè)修改操作,實(shí)戰(zhàn)一下刪除file1
:
命令:rm file1
此時(shí)只是把工作區(qū)中的file1
刪除,對(duì)于本地倉(cāng)庫(kù)file1
其實(shí)沒(méi)有被刪掉
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: file1
#
no changes added to commit (use "git add" and/or "git commit -a")
?般?到這?,有兩種可能:
1. 確實(shí)要從版本庫(kù)中刪除該?件
2. 不小心刪錯(cuò)了
對(duì)第?種情況,很明顯誤刪,需要使? git checkout -- file1
來(lái)進(jìn)?恢復(fù),很簡(jiǎn)單,我們剛學(xué)過(guò)(刪除也是修改):
對(duì)于第?種情況,很明顯是沒(méi)有刪完,我們只刪除了?作區(qū)的?件。這時(shí)就需要使?git rm
將?件從暫存區(qū)和?作區(qū)中刪除,并且commit
:
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git rm file1
rm 'file1'
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: file1
#
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git commit -m "deleted file1"
[master 969e5f4] deleted file1
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 file1
[gwj@iZf8zhv7mi2thjdxsptkb8Z gitcode]$ git status
# On branch master
nothing to commit, working directory clean
現(xiàn)在,?件就從版本庫(kù)中被刪除了文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-830941.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-830941.html
到了這里,關(guān)于Git基本操作(超詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!