這個(gè)博客系列,分享的Git操作,這不是簡(jiǎn)單的指令羅列,小編通過畫圖和問題回答的方式對(duì)Git指令使用原理的總結(jié),希望能夠幫助到大家!有錯(cuò)誤的地方也請(qǐng)大家多多指正!有幫助到您,也請(qǐng)點(diǎn)贊支持!
1.為什么用Git
當(dāng)我們?cè)趯W(xué)習(xí)過程中,需要完成老師交給我們的任務(wù):
在這里插入圖片描述
這時(shí)候?yàn)榱吮苊馐謩?dòng)管理我們需要版本控制器,而Git就是一個(gè)版本控制器,它是目前主流的!
Git 是一個(gè)免費(fèi)的、開源的分布式版本控制系統(tǒng),可以快速高效地處理從小型到大型的各種項(xiàng)目,它 可以控制電腦上所有格式的?件。但是對(duì)于程序猿來說更多的是管理我們?cè)创a。
2.安裝Git
2.1.CentOS下安裝
查看 Git 安裝的版本:
[xiyan@hecs-34711 ~]$ git --version
CentOS安裝Git :
[xiyan@hecs-34711 ~]$ sudo yum install git -y
2.2.ubuntu下安裝
查看 Git 安裝的版本:
xiyan@ubuntu:~$ git --version
安裝Git :
xiyan@ubuntu:~$ sudo apt-get install git -y
3.基本操作
3.1.創(chuàng)建并初始化倉庫
**倉庫是進(jìn)?版本控制的?個(gè)?件?錄。**所以使用Git版本控制,首先要?jiǎng)?chuàng)建一個(gè)目錄,但是mkdir創(chuàng)建出來的只是普通的目錄,我們需要初始化倉庫。
- 創(chuàng)建普通目錄并進(jìn)入目錄:
[xiyan@hecs-34711 ~]$ mkdir git_space
[xiyan@hecs-34711 ~]$ cd git_space
[xiyan@hecs-34711 git_space]$ pwd
/home/xiyan/git_space
- 使用git init命令就初始化了一個(gè)Git倉庫:
[xiyan@hecs-34711 git_space]$ git init
- 查看剛初始化的.git的文件結(jié)構(gòu):
[xiyan@hecs-34711 git_space]$ ls -a
[xiyan@hecs-34711 git_space]$ tree .git
.git
├── branches
├── 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
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
3.2.工作區(qū)、暫存區(qū)、版本庫
配置Git:
當(dāng)初始化一個(gè)倉庫后先要設(shè)置你的 ??名稱 和 e-mail 地址,使用–global參數(shù)表?這臺(tái)機(jī)器上所有的 Git 倉庫都會(huì)使?這個(gè)配置。
git config [--global] user.name "Your Name"
git config [--global] user.email "email@example.com"
查看配置命令為:
git config -l
刪除對(duì)應(yīng)的配置命令為:
git config [--global] --unset user.name
git config [--global] --unset user.email
當(dāng)我們初始化git_sapce目錄,并在其下創(chuàng)建一個(gè)read文件,那么這個(gè)read文件能否別Git管理?
[xiyan@hecs-34711 git_space]$ touch read
[xiyan@hecs-34711 git_space]$ ls -a
. .. .git read
答案是不能!
如果需要理解為什么那么我們需要弄清楚工作區(qū)、暫存區(qū)、版本庫這三個(gè)概念,注意理解這些概念能更加清晰的使用指令!
在上面我們通過指令ls -a將git_space目錄下的文件都列舉出來。其中隱藏目錄**.git稱之為版本庫(倉庫);把git_space目錄下除.git目錄,我們都稱之為工作區(qū);而暫存區(qū)(stage或 index),一般存放在(.git/index)路徑下。**對(duì)于一個(gè)剛初始化的倉庫,我們是用tree .git并不能找到對(duì)應(yīng)的index文件,但是通過命令:
[xiyan@hecs-34711 git_space]$ git add read
[xiyan@hecs-34711 git_space]$ git commit -m "the first commit of read" # 這里為了能統(tǒng)一些,可以先commit,不用commit,add就能生成index文件。
[xiyan@hecs-34711 git_space]$ tree .git
將工作區(qū)的內(nèi)容添加到暫存區(qū)我們tree命令就能查看到二進(jìn)制文件index。
我們通過一張?jiān)韴D快速的理解三者的關(guān)系:
-
在創(chuàng)建 Git 版本庫時(shí),Git 會(huì)為我們?動(dòng)創(chuàng)建?個(gè)唯?的 master 分?,以及指向 master 的?個(gè)指針叫 HEAD。
-
想要讓Git管理文件,必須要通過使? git add 和 git commit 命令才能將?件添加到倉庫中!在版本庫(倉庫)中的文件?件被 Git 管理起來,可以對(duì)每個(gè)?件的修改、刪除進(jìn)行跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來某個(gè)時(shí)刻可以“還原”。
我們wirte新建一個(gè)文件并寫入 “絕知此事要躬行!”:
[xiyan@hecs-34711 git_space]$ git status # 查看當(dāng)前倉庫狀態(tài) [xiyan@hecs-34711 git_space]$ vim wirte [xiyan@hecs-34711 git_space]$ git add write # 添加write [xiyan@hecs-34711 git_space]$ git status [xiyan@hecs-34711 git_space]$ git commit -m "the wirte file commit" 1 file changed, 1 insertion(+) create mode 100644 write 說明:一個(gè)文件改變,插入一行內(nèi)容
至此我們就將工作區(qū)中的write文件添加到了版本庫中,并讓git進(jìn)行管理。
-
使用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)容添加到本地倉庫中:
? 提交暫存區(qū)全部?jī)?nèi)容到本地倉庫中: git commit -m "message" ? 提交暫存區(qū)的指定?件到倉庫區(qū): git commit [file1] [file2] ... -m "message"
注意:必須要帶上-m選項(xiàng),并好好的描述你提交內(nèi)容的信息! 如果你忘記帶-m選項(xiàng),那么也會(huì)跳出一個(gè)窗口讓你提交描述細(xì)節(jié)
3.3.查看日志和.git
上面我們已經(jīng)知道如何將工作區(qū)中的文件上傳到倉庫中,交給git管理,在上傳的過程中也適當(dāng)?shù)耐ㄟ^git status來驗(yàn)證是否上傳成功了,但:
你說將文件傳到了.git倉庫中,具體存放在哪里?能不能看得到?請(qǐng)往下看!
先來看看,我們上傳文件的日志
[xiyan@hecs-34711 git_space]$ git log
commit 2f6e2d2cf3b01c2e7e6320415d35b3610a69aee0
Author: xiyan <3219576710@qq.com>
Date: Sun Dec 24 10:52:53 2023 +0800
the wirte file commit # commit填寫的描述信息
顯?從最近到最遠(yuǎn)的提交?志,這里截取了最新的日志。如果你覺得這樣輸出詳細(xì)的日志太凌亂,那么你可以帶上參數(shù):
[xiyan@hecs-34711 git_space]$ git log --pretty=oneline
2f6e2d2cf3b01c2e7e6320415d35b3610a69aee0 the wirte file commit
39f72af92b306f0fc6e3c653d4e85ef0b56d671a the first commit of read
這樣就比較清爽。但:
2f6e2d2cf3b01c2e7e6320415d35b3610a69aee0這一長(zhǎng)串是什么?
每次提交的 commit id (版本號(hào)),Git 的 commit id 不是1,2,3……遞增的數(shù)字,?是?個(gè) 哈希 計(jì)算出來的?個(gè)?常?的數(shù)字,??六進(jìn)制表?。
我們通過git log查看到了commit id,那么這長(zhǎng)串的數(shù)字有什么用?
我們可用通過它,進(jìn)行版本的回退,查找到對(duì)應(yīng)的objects對(duì)象!
上面的圖我們通過對(duì)比.git文件,發(fā)現(xiàn)了很多不同,接下來我們來看看.git一些重要的文件:
index: 暫存區(qū), git add 后會(huì)更新該內(nèi)容。
HEAD: 默認(rèn)指向 master 分?的?個(gè)指針。
[xiyan@hecs-34711 git_space]$ cat .git/HEAD
ref: refs/heads/master
[xiyan@hecs-34711 git_space]$ cat .git/refs/heads/master
2f6e2d2cf3b01c2e7e6320415d35b3610a69aee0
而master就保存當(dāng)前最新的commit id。
objects 為 Git 的對(duì)象庫,??包含了創(chuàng)建的各種版本庫對(duì)象及內(nèi)容。當(dāng)執(zhí)? git add 命令時(shí),暫存區(qū)的?錄樹被更新,同時(shí)?作區(qū)修改的?件內(nèi)容被寫?到對(duì)象庫中的?個(gè)新的對(duì)象中。
[xiyan@hecs-34711 git_space]$ ls .git/objects/
0e 2f 39 61 9c e6 info pack
查找 object 時(shí)要將 commit id 分成2部分,其前2位是?件夾名稱,后38位是?件名稱。
[xiyan@hecs-34711 git_space]$ cat .git/objects/0e/*
x+)JMU06b040031Q(JMLax6??ˉ9{wk?+oq爏??)[xiyan@hecs-34711 git_space]$
我們不同直接用cat命令看到??是什么,該類?件是經(jīng)過 安全哈希算法加密過的?件,打印出來回亂碼,我們要使用git cat-file 命令(可以使用使用man命令來查看詳細(xì)用法)來查看版本庫對(duì)象的內(nèi)容,-p選項(xiàng)——pretty-print object’s content。
[xiyan@hecs-34711 git_space]$ cat .git/refs/heads/master
2f6e2d2cf3b01c2e7e6320415d35b3610a69aee0
[xiyan@hecs-34711 git_space]$ git cat-file -p 2f6e2d2c...35b3610a69aee0 #注意使用用自己機(jī)器上的commit id,這里省略了
tree 9cffb16f8c6fcfce13583b17334580260e1f21d6
parent 39f72af92b306f0fc6e3c653d4e85ef0b56d671a
author xiyan <3219576710@qq.com> 1703386373 +0800
committer xiyan <3219576710@qq.com> 1703386373 +0800
the wirte file commit
[xiyan@hecs-34711 git_space]$ git cat-file -p 9cffb16f8c...260e1f21d6
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 read
100644 blob 61823625adb7093c12c41a0f937850e7a493ade4 write
[xiyan@hecs-34711 git_space]$ git cat-file -p 61823625...a493ade4
絕知此事要躬行!
暫存區(qū),master分支這些都只存放的一個(gè)指向?qū)ο髱斓囊粋€(gè)索引。
3.5.修改文件
**Git 跟蹤并管理的是修改,???件。**新增和刪除都稱之為修改。我們?cè)趙irte添加一行內(nèi)容,“勸君惜取少年時(shí)!”
[xiyan@hecs-34711 git_space]$ vim write
[xiyan@hecs-34711 git_space]$ 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: write
#
no changes added to commit (use "git add" and/or "git commit -a")
我們使用git status也能反映,對(duì)應(yīng)的文件被修改,但是看不著哪些被修改很慌,如果想要知道更加詳細(xì)哪一行別修改怎么辦。
**git diff [file] 命令?來顯?暫存區(qū)和?作區(qū)?件的差異,**顯?的格式正是Unix通?的diff格式。也可以使? git diff HEAD – [file] 命令來查看版本庫和?作區(qū)?件的區(qū)別。
[xiyan@hecs-34711 git_space]$ git diff write
diff --git a/write b/write
index 6182362..ec7fd22 100644
--- a/write
+++ b/write
@@ -1 +1,2 @@
絕知此事要躬行!
+勸君惜取少年時(shí)!
這樣使用diff查看到具體的信息,我們就可以放心的將內(nèi)容提交。
[xiyan@hecs-34711 git_space]$ git add .
[xiyan@hecs-34711 git_space]$ git commit -m "change line in wirte"
[master 56f2997] change line in wirte
1 file changed, 1 insertion(+)
[xiyan@hecs-34711 git_space]$ git status
# On branch master
nothing to commit, working directory clean
3.6.版本回退
比如我們吭哧吭哧寫了三天的代碼,發(fā)現(xiàn)我們代碼有很大的問題,這時(shí)候我們想要回到三天前的代碼版本,重新開始可以嗎?
當(dāng)然是可以的,這也是版本控制器重要的能?,Git 能夠管理?件的歷史版本。
[xiyan@hecs-34711 git_space]$ git diff write # 沒有輸出內(nèi)容
[xiyan@hecs-34711 git_space]$ git diff HEAD -- write # 沒有輸出內(nèi)容
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
勸君惜取少年時(shí)!
上面查看了當(dāng)前,暫存區(qū)和本版庫與工作區(qū)中的內(nèi)容,說明三個(gè)內(nèi)容都是一樣的?,F(xiàn)在只在工作區(qū)中添加一行內(nèi)容 “知行合一!”,當(dāng)然可以再用git diff,查看內(nèi)容的差別,圖示:
回退版本的方式:
git reset 命令語法格式為: git reset [–soft | --mixed | --hard] [HEAD]
- 可直接寫成 commit id,表?指定退回的版本
- HEAD 表?當(dāng)前版本、HEAD^ 上?個(gè)版本、HEAD^^ 上上?個(gè)版本,以此類推
- 可以使? ?數(shù)字表?:HEAD~0 表?當(dāng)前版本、HEAD~1 上?個(gè)版本、HEAD~2 上上?個(gè)版本
這里進(jìn)行版本的回退,那么commit是-m的描述就顯得很重要了,這能讓我們知道要回退到那個(gè)版本。所以提交細(xì)節(jié)要好好寫!
# 使用--soft參數(shù)
[xiyan@hecs-34711 git_space]$ git log --pretty=oneline
56f2997314a012b1755b56b84efbef138578826a change line in wirte
2f6e2d2cf3b01c2e7e6320415d35b3610a69aee0 the wirte file commit
39f72af92b306f0fc6e3c653d4e85ef0b56d671a the first commit of read
[xiyan@hecs-34711 git_space]$ git reset --soft 2f6e2d2cf3b0..5b3610a69aee0
[xiyan@hecs-34711 git_space]$ git diff HEAD write
diff --git a/write b/write
index 6182362..898a60c 100644
--- a/write
+++ b/write
@@ -1 +1,3 @@
絕知此事要躬行!
+勸君惜取少年時(shí)!
+知行合一!
# 使用--mixed參數(shù)
[xiyan@hecs-34711 git_space]$ git diff write
diff --git a/write b/write
index ec7fd22..898a60c 100644
--- a/write
+++ b/write
@@ -1,2 +1,3 @@
絕知此事要躬行!
勸君惜取少年時(shí)!
+知行合一!
[xiyan@hecs-34711 git_space]$ git reset --mixed HEAD
Unstaged changes after reset:
M write
[xiyan@hecs-34711 git_space]$ git diff write
diff --git a/write b/write
index 6182362..898a60c 100644
--- a/write
+++ b/write
@@ -1 +1,3 @@
絕知此事要躬行!
+勸君惜取少年時(shí)!
+知行合一!
#使用--hard參數(shù)
[xiyan@hecs-34711 git_space]$ git reset --hard HEAD
HEAD is now at 2f6e2d2 the wirte file commit
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
至此我們就完成了上圖版本回退的操作。
但是我現(xiàn)在后悔了,怎么辦,我要恢復(fù)原來的狀態(tài)?當(dāng)然Git提供了后悔藥吃,可以使用最開是的git log查看到的殘留的commit id來恢復(fù),當(dāng)然它也提供了來搶救,
[xiyan@hecs-34711 git_space]$ git reflog
2f6e2d2 HEAD@{0}: reset: moving to 2f6e2d2cf3b01c2e7e6320415d35b3610a69aee0
56f2997 HEAD@{1}: reset: moving to 56f2997314a012b1755b56b84efbef138578826a
39f72af HEAD@{2}: reset: moving to HEAD~2
56f2997 HEAD@{3}: reset: moving to 56f2997
2f6e2d2 HEAD@{4}: reset: moving to HEAD^
56f2997 HEAD@{5}: commit: change line in wirte
2f6e2d2 HEAD@{6}: commit: the wirte file commit
39f72af HEAD@{7}: commit (initial): the first commit of read
[xiyan@hecs-34711 git_space]$ git reset --hard 56f2997
HEAD is now at 56f2997 change line in wirte
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
勸君惜取少年時(shí)!
雖然我們這里恢復(fù)了版本,但是對(duì)于添加的"知行合一",這行沒有提交所以找不回來了,所以版本回退是–hard參數(shù)要慎用!
對(duì)于56f2997也是commit id的一部分,我們也可以通過它來就行版本回退,注意雖然git reflog命令能查看所有操作記錄,但是隨著版本快速迭代commit id有可能找不回來!所以后悔了快速的做出改變。
Git 的版本回退速度???欤?yàn)?Git 在內(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(commit id ),圖示:
3.7.撤銷修改與文件刪除
當(dāng)我們寫了很久的代碼,但是發(fā)現(xiàn)自己的代碼很low,想撤銷修改,有三種情況:
如果代碼只存在工作區(qū),是不推薦用手動(dòng)修改的:手動(dòng)修改思路就是將git diff [file]對(duì)比之后一行一行刪除,這樣很容易改出bug。
# 情況一:
[xiyan@hecs-34711 git_space]$ vim write
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
勸君惜取少年時(shí)!
知行合一!
[xiyan@hecs-34711 git_space]$ git checkout -- write # 注意--不能少!?。?/span>
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
勸君惜取少年時(shí)!
# 情況二:
[xiyan@hecs-34711 git_space]$ vim write
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
勸君惜取少年時(shí)!
知行合一!
[xiyan@hecs-34711 git_space]$ git add write
[xiyan@hecs-34711 git_space]$ git reset --hard HEAD
HEAD is now at 56f2997 change line in wirte
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
勸君惜取少年時(shí)!
[xiyan@hecs-34711 git_space]$ git status
# On branch master
nothing to commit, working directory clean
# 情況三:有個(gè)前提沒有將代碼push到遠(yuǎn)程倉庫(請(qǐng)往后看),而是在本地倉庫操作。
[xiyan@hecs-34711 git_space]$ vim write
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
勸君惜取少年時(shí)!
知行合一!
[xiyan@hecs-34711 git_space]$ git add .
[xiyan@hecs-34711 git_space]$ git commit -m "the add one line in wirte"
[master 42006b8] the add one line in wirte
1 file changed, 1 insertion(+)
[xiyan@hecs-34711 git_space]$ git reset --hard HEAD^
HEAD is now at 56f2997 change line in wirte
[xiyan@hecs-34711 git_space]$ cat write
絕知此事要躬行!
勸君惜取少年時(shí)!
當(dāng)我們有一個(gè)Git管理著文件被誤刪,或者就是要?jiǎng)h除該文件,怎么辦?
我們快速新建一個(gè)文件:
[xiyan@hecs-34711 git_space]$ touch input
[xiyan@hecs-34711 git_space]$ ll
total 4
-rw-rw-r-- 1 xiyan xiyan 0 Dec 25 14:52 input
-rw-rw-r-- 1 xiyan xiyan 0 Dec 23 21:12 read
-rw-rw-r-- 1 xiyan xiyan 50 Dec 25 14:45 write
[xiyan@hecs-34711 git_space]$ git add input
[xiyan@hecs-34711 git_space]$ git commit -m "add file input"
[master 44a65f7] add file input
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 input
假設(shè)我們使用rm誤刪了工作區(qū)中的input文件,怎么恢復(fù):文章來源:http://www.zghlxwxcb.cn/news/detail-768525.html
[xiyan@hecs-34711 git_space]$ rm input
[xiyan@hecs-34711 git_space]$ 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: input
#
no changes added to commit (use "git add" and/or "git commit -a")
[xiyan@hecs-34711 git_space]$ git checkout -- input
[xiyan@hecs-34711 git_space]$ ll
total 4
-rw-rw-r-- 1 xiyan xiyan 0 Dec 25 14:55 input
-rw-rw-r-- 1 xiyan xiyan 0 Dec 23 21:12 read
-rw-rw-r-- 1 xiyan xiyan 50 Dec 25 14:45 write
我們就是要?jiǎng)h除input文件,要將Git管理的工作區(qū)和本地庫文件都要?jiǎng)h除,使用git rm [file]命令并且 commit操作!文章來源地址http://www.zghlxwxcb.cn/news/detail-768525.html
[xiyan@hecs-34711 git_space]$ git rm input
rm 'input'
[xiyan@hecs-34711 git_space]$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: input
#
[xiyan@hecs-34711 git_space]$ git commit -m "delete input"
[master 7e919ad] delete input
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 input
[xiyan@hecs-34711 git_space]$ git status
# On branch master
nothing to commit, working directory clean
[xiyan@hecs-34711 git_space]$ ll
total 4
-rw-rw-r-- 1 xiyan xiyan 0 Dec 23 21:12 read
-rw-rw-r-- 1 xiyan xiyan 50 Dec 25 14:45 write
master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: input
#
[xiyan@hecs-34711 git_space]$ git commit -m "delete input"
[master 7e919ad] delete input
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 input
[xiyan@hecs-34711 git_space]$ git status
# On branch master
nothing to commit, working directory clean
[xiyan@hecs-34711 git_space]$ ll
total 4
-rw-rw-r-- 1 xiyan xiyan 0 Dec 23 21:12 read
-rw-rw-r-- 1 xiyan xiyan 50 Dec 25 14:45 write
到了這里,關(guān)于Git圖解:安裝與基本操作(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!