柳州建站免費(fèi)seo視頻教程
🎯添加?件–場(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é),是給我們?看的
🎯例如:
[root@VM-4-7-centos ~]# cat ReadMe
#include<stdio.h>
int main()
{printf("hello git");return 0;
}
[root@VM-4-7-centos ~]# git add ReadMe
[root@VM-4-7-centos ~]# git commit -m "add first file"
[master (root-commit) a358dce] add first file1 file changed, 6 insertions(+)create mode 100644 ReadMe
[root@VM-4-7-centos ~]# cat ReadMe
#include<stdio.h>
int main()
{printf("hello git");return 0;
}
[root@VM-4-7-centos ~]# git add ReadMe
[root@VM-4-7-centos ~]# git commit -m "add first file"
[master (root-commit) a358dce] add first file1 file changed, 6 insertions(+)create mode 100644 ReadMe
[root@VM-4-7-centos ~]#
hyb@139-159-150-152:~/gitcode$ vim ReadMe
hyb@139-159-150-152:~/gitcode$ cat ReadMe
hello bit
hello bit
hyb@139-159-150-152:~/gitcode$ git add ReadMe
hyb@139-159-150-152:~/gitcode$ git commit -m "commit my first file"
[master (root-commit) c614289] commit my first file
1 file changed, 2 insertions(+)
create mode 100644 ReadMe
git commit 命令執(zhí)?成功后會(huì)告訴我們,1個(gè)?件被改動(dòng)(就是我們新添加的ReadMe?件),插?了兩?內(nèi)容(ReadMe有兩?內(nèi)容)
我們還可以多次add不同的?件,?只commit?次便可以提交所有?件,是因?yàn)樾枰峤坏?件是通通被add到暫存區(qū)中,然后?次性commit暫存區(qū)的所有修改。如:
hyb@139-159-150-152:~/gitcode$ touch file1 file2 file3
hyb@139-159-150-152:~/gitcode$ git add file1
hyb@139-159-150-152:~/gitcode$ git add file2
hyb@139-159-150-152:~/gitcode$ git add file3
hyb@139-159-150-152:~/gitcode$ git commit -m "add 3 files"
[master 23807c5] add 3 files
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)查看下歷史提交記錄:
[root@VM-4-7-centos ~]# git add ReadMe
[root@VM-4-7-centos ~]# git commit -m "add first file"
[master (root-commit) a358dce] add first file1 file changed, 6 insertions(+)create mode 100644 ReadMe
[root@VM-4-7-centos ~]# ^C
[root@VM-4-7-centos ~]# clear
[root@VM-4-7-centos ~]# git log
commit a358dceff752b9fb00a7ad0f047e0edf3e6fb6d2
Author: FJJ <2397194209@qq.com>
Date: Wed Nov 8 18:53:26 2023 +0800add first file
[root@VM-4-7-centos ~]# git log
commit a358dceff752b9fb00a7ad0f047e0edf3e6fb6d2
Author: FJJ <2397194209@qq.com>
Date: Wed Nov 8 18:53:26 2023 +0800
該命令顯?從最近到最遠(yuǎn)的提交?志,并且可以看到我們commit時(shí)的?志消息
如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上 --pretty=oneline 參數(shù):
[root@VM-4-7-centos ~]# git log --pretty=oneline
需要說(shuō)明的是,我們看到的??串類似 23807c5…56eed6 的是每次提交的 commit id (版本號(hào)),Git的 commit id 不是1,2,3……遞增的數(shù)字,?是?個(gè)SHA1計(jì)算出來(lái)的?個(gè)?常?的數(shù)字,??六進(jìn)制表?(你看到的 commit id 和我的肯定不?樣,以你??的為準(zhǔn))
查看.git?件
先來(lái)看看我們的 .git 的?錄結(jié)構(gòu)
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 23
│ │ └── 807c536969cd886c4fb624b997ca575756eed6
│ ├── 83
│ │ └── 0a8c9feefbdc098bbae2cdc25e5034ce1920d7
│ ├── 8f
│ │ └── add50161b6fafa53ce7e79d278dc490240c946
│ ├── 9c
│ │ └── 9e1f0f6bff3015df71a0963004476f5e6cfd54
│ ├── c6
│ │ └── 1428926f3853d4ec6dde904415b0e6c1dabcc6
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack
└── refs
├── heads
│ └── master
└── tags
18 directories, 27 files
index 就是我們的暫存區(qū),add后的內(nèi)容都是添加到這?的
HEAD 就是我們的默認(rèn)指向master分?的指針
?默認(rèn)的 master 分?,其實(shí)就是
打印的 23807c536969cd886c4fb624b997ca575756eed6 是什么東西呢?保存的就是當(dāng)前最新的 commit id
3. 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"?錄下,讓我們來(lái)看看這些對(duì)象有何?處:
總結(jié)?下,在本地的git倉(cāng)庫(kù)中,有?個(gè)?件或者?錄很特殊
? 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ù)的所有修改
后?再學(xué)習(xí)過(guò)程中,最好能將常?的 git 操作與 .git ?錄當(dāng)中的結(jié)構(gòu)內(nèi)容變化對(duì)應(yīng)起來(lái),這樣有利于我們理解git細(xì)節(jié)流程。我們后?還會(huì)學(xué)習(xí)什么分?,標(biāo)簽什么的,那我想后?同學(xué)就應(yīng)該學(xué)習(xí)對(duì)應(yīng)著研究了!
🎯添加?件–場(chǎng)景?
學(xué)習(xí)到這?,我們已經(jīng)清楚了如何向倉(cāng)庫(kù)中添加?件,并且對(duì)于?作區(qū)、暫存區(qū)、版本庫(kù)也有了?定的認(rèn)識(shí)。那么我們?cè)僬??種添加?件的場(chǎng)景,能加深對(duì)?作區(qū)、暫存區(qū)、版本庫(kù)的理解,?例如下
~/gitcode$ touch file4 #1. 新增file4?件
~/gitcode$ git add file4 #2. 將file4添加到暫存區(qū)
~/gitcode$ touch file5 #3. 新增file5?件
~/gitcode$ git commit -m"add file" #4. 提交修改
[master 3d406c0] add file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file4
提交后發(fā)現(xiàn)打印了 1 file changed, 0 insertions(+), 0 deletions(-) ,意思是只有?個(gè)?件改變了,這時(shí)我們提出了疑問(wèn),不是新增了兩個(gè)?件嗎?
再來(lái)回憶下, 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?其他版本控制系統(tǒng)設(shè)計(jì)得優(yōu)秀,因?yàn)镚it跟蹤并管理的是修改,???件
什么是修改??如你新增了??,這就是?個(gè)修改,刪除了??,也是?個(gè)修改,更改了某些字符,也是?個(gè)修改,刪了?些?加了?些,也是?個(gè)修改,甚?創(chuàng)建?個(gè)新?件,也算?個(gè)修改
讓我們將ReadMe?件進(jìn)??次修改
~/gitcode$ cat ReadMe
hello bit
hello git
hello world
此時(shí),倉(cāng)庫(kù)中的ReadMe和我們?作區(qū)的ReadMe是不同的,如何查看當(dāng)前倉(cāng)庫(kù)的狀態(tài)呢? git status 命令?于查看在你上次提交之后是否有對(duì)?件進(jìn)?再次修改
~/gitcode$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ReadMe
no changes added to commit (use "git add" and/or "git commit -a")
上?的結(jié)果告訴我們,ReadMe被修改過(guò)了,但還沒(méi)有完成添加與提交
?前,我們只知道?件被修改了,如果能知道具體哪些地?被修改了,就更好了。有同學(xué)會(huì)說(shuō),我剛改的我知道呀!可是,你還記得你三天前寫(xiě)了什么代碼嗎?或者沒(méi)寫(xiě)?
~/gitcode$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index 9c9e1f0..4a97140 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1,2 +1,3 @@
hello bit
-hello bit
+hello git
+hello world
git diff [file] 命令?來(lái)顯?暫存區(qū)和?作區(qū)?件的差異,顯?的格式正是Unix通?的diff格式 也可以使? git diff HEAD – [file] 命令來(lái)查看版本庫(kù)和?作區(qū)?件的區(qū)別
知道了對(duì)ReadMe做了什么修改后,再把它提交到本地倉(cāng)庫(kù)就放?多了
~/gitcode$ git add ReadMe
~/gitcode$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: ReadMe
git add 之后,就沒(méi)有看到上? no changes added to commit (use "git add"and/or “git commit -a”) 的消息了。接下來(lái)讓我們繼續(xù) git commit 即可:
~/gitcode$ git commit -m "add modify ReadMe file"
[master 94da695] add modify ReadMe file
1 file changed, 2 insertions(+), 1 deletion(-)
~/gitcode$ git status
On branch master
nothing to commit, working tree clean
🎯版本回退
之前我們也提到過(guò),Git能夠管理?件的歷史版本,這也是版本控制器重要的能?。如果有?天你發(fā)現(xiàn)之前前的?作做的出現(xiàn)了很?的問(wèn)題,需要在某個(gè)特定的歷史版本重新開(kāi)始,這個(gè)時(shí)候,就需要版本回退的功能了
執(zhí)? git reset 命令?于回退版本,可以指定退回某?次提交的版本。要解釋?下“回退”本質(zhì)是要將版本庫(kù)中的內(nèi)容進(jìn)?回退,?作區(qū)或暫存區(qū)是否回退由命令參數(shù)決定:
git reset 命令語(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è)版本
? 以此類推…
? 可以使??數(shù)字表?
? HEAD~0表?當(dāng)前版本
? HEAD~1上?個(gè)版本
? HEAD^^上上?個(gè)版本
? 以此類推…
為了便于表述,?便測(cè)試回退功能,我們先做?些準(zhǔn)備?作:更新3個(gè)版本的ReadMe,并分別進(jìn)?3次提交,如下所?
第?次修改提交
~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
~/gitcode$ git add ReadMe
~/gitcode$ git commit -m"add version1"
[master cff9d1e] add version1
1 file changed, 1 insertion(+)
# 第?次修改提交
~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
~/gitcode$ git add ReadMe
~/gitcode$ git commit -m"add version2"
1 file changed, 1 insertion(+)
# 第三次修改提交
~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
~/gitcode$ git add ReadMe
~/gitcode$ git commit -m"add version3"
[master d95c13f] add version3
1 file changed, 1 insertion(+)
# 查看歷史提交記錄
~/gitcode$ git log --pretty=oneline
d95c13ffc878a55a25a3d04e22abfc7d2e3e1383 (HEAD -> master) add version3
14c12c32464d6ead7159f5c24e786ce450c899dd add version2
cff9d1e019333318156f8c7d356a78c9e49a6e7b add version1
現(xiàn)在,如果我們?cè)谔峤煌陃ersion3后,發(fā)現(xiàn)version3編寫(xiě)錯(cuò)誤,想回退到version2,重新基于 version2開(kāi)始編寫(xiě)。由于我們?cè)谶@?希望的是將?作區(qū)的內(nèi)容也回退到 version 2 版本,所以需要?到 --hard 參數(shù),?例如下
~/gitcode$ git log --pretty=oneline
d95c13ffc878a55a25a3d04e22abfc7d2e3e1383 (HEAD -> master) add version3
14c12c32464d6ead7159f5c24e786ce450c899dd add version2
cff9d1e019333318156f8c7d356a78c9e49a6e7b add version1
...
~/gitcode$ git reset --hard 14c12c32464d6ead7159f5c24e786ce4
HEAD is now at 14c12c3 add version2
~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
我們驚奇的發(fā)現(xiàn),此時(shí) ReadMe ?件的內(nèi)容,已經(jīng)回退到version2了!,當(dāng)前,我們?cè)俅? git log 查看?下提交?志,發(fā)現(xiàn) HEAD 指向了version2,如下所?
~/gitcode$ git log --pretty=oneline
14c12c32464d6ead7159f5c24e786ce450c899dd (HEAD -> master) add version2
cff9d1e019333318156f8c7d356a78c9e49a6e7b add version1
到這??般回退功能就演?完了,但現(xiàn)在如果我后悔了,想再回到version3怎么辦?我們可以繼續(xù)使? git reset 命令,回退到 version 3 版本,但我們必須要拿到 version 3 的 commitid 去指定回退的版本。
但我們看到了 git log 并不能打印出 version 3 的 commit id ,運(yùn)?好的話我們可以從終端上去找找之前的記錄,運(yùn)?不好的話 commit id 已經(jīng)被我們搞丟了
Git還提供了?個(gè) git reflog 命令能補(bǔ)救?下,該命令?來(lái)記錄本地的每?次命令
~/gitcode$ git reflog
14c12c3 (HEAD -> master) HEAD@{0}: reset: moving to 14c12c32464d6ead7159f5c24e78
d95c13f HEAD@{1}: commit: add version3
14c12c3 (HEAD -> master) HEAD@{2}: commit: add version2
cff9d1e HEAD@{3}: commit: add version1
94da695 HEAD@{4}: commit: add modify ReadMe file
23807c5 HEAD@{5}: commit: add 3 files
c614289 HEAD@{6}: commit (initial): commit my first file
這樣,你就可以很?便的找到你的所有操作記錄了,但 d95c13f 這個(gè)是啥東西?這個(gè)是 version3 的 commit id 的部分。沒(méi)錯(cuò),Git版本回退的時(shí)候,也可以使?部分 commit id 來(lái)代表?標(biāo)版本 ?例如下:
# 回退到v3
~/gitcode$ git reset --hard d95c13f
HEAD is now at d95c13f add version3
# 查看?作區(qū)
~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
# 查看log
~/gitcode$ git log --pretty=oneline
d95c13ffc878a55a25a3d04e22abfc7d2e3e1383 (HEAD -> master) add version3
14c12c32464d6ead7159f5c24e786ce450c899dd add version2
cff9d1e019333318156f8c7d356a78c9e49a6e7b add version1
94da6950d27e623c0368b22f1ffc4bff761b5b00 add modify ReadMe file
23807c536969cd886c4fb624b997ca575756eed6 add 3 files
c61428926f3853d4ec6dde904415b0e6c1dabcc6 commit my first file
可往往是理想很豐滿,現(xiàn)實(shí)很?感。在實(shí)際開(kāi)發(fā)中,由于?時(shí)間的開(kāi)發(fā)了,導(dǎo)致 commit id 早就找不到了,可突然某?天,我?想回退到version3,那該如何操作呢?貌似現(xiàn)在不可能了
值得說(shuō)的是,Git的版本回退速度????#xff0c;因?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)單理解成如下?意圖: