中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

湖南長(zhǎng)沙疫情風(fēng)險(xiǎn)等級(jí)網(wǎng)站推廣優(yōu)化排名教程

湖南長(zhǎng)沙疫情風(fēng)險(xiǎn)等級(jí),網(wǎng)站推廣優(yōu)化排名教程,專賣衣服的購(gòu)物平臺(tái),單肩包自定義頁(yè)面設(shè)計(jì)模板文章目錄 前言一、創(chuàng)建 Git 本地倉(cāng)庫(kù)1.1 什么是倉(cāng)庫(kù)1.2 創(chuàng)建本地倉(cāng)庫(kù)1.3 .git 目錄結(jié)構(gòu) 二、配置 Git三、認(rèn)識(shí) Git 的工作區(qū)、暫存區(qū)和版本庫(kù)3.1 什么是 Git 的工作區(qū)、暫存區(qū)和版本庫(kù)3.2 工作區(qū)、暫存區(qū)和版本庫(kù)之間的關(guān)系 四、添加文件4.1 添加文件到暫存區(qū)和版本庫(kù)中的命令4…

文章目錄

  • 前言
  • 一、創(chuàng)建 Git 本地倉(cāng)庫(kù)
    • 1.1 什么是倉(cāng)庫(kù)
    • 1.2 創(chuàng)建本地倉(cāng)庫(kù)
    • 1.3 .git 目錄結(jié)構(gòu)
  • 二、配置 Git
  • 三、認(rèn)識(shí) Git 的工作區(qū)、暫存區(qū)和版本庫(kù)
    • 3.1 什么是 Git 的工作區(qū)、暫存區(qū)和版本庫(kù)
    • 3.2 工作區(qū)、暫存區(qū)和版本庫(kù)之間的關(guān)系
  • 四、添加文件
    • 4.1 添加文件到暫存區(qū)和版本庫(kù)中的命令
    • 4.2 添加文件演示
    • 4.3 添加文件后的 .git 目錄變化
  • 五、文件的修改
    • 5.1 對(duì) ReadMe 文件進(jìn)行修改
    • 5.2 查看工作區(qū)與暫存區(qū)文件內(nèi)容的差異
    • 5.3 查看工作區(qū)與版本庫(kù)文件內(nèi)容的差異
    • 5.4 提交修改后的文件
  • 六、版本回退
    • 6.1 版本回退命令
    • 6.2 演示版本回退
    • 6.3 撤銷版本回退
    • 6.4 版本回退的原理
  • 七、撤銷修改
    • 7.1 情況一:對(duì)于工作區(qū)代碼,還沒有 add
    • 7.2 情況二:已經(jīng) add,但沒有 commit
    • 7.3 情況三:已經(jīng) add 和 commit
  • 八、刪除文件
    • 8.1 rm + git add + git commit 刪除
    • 8.2 git rm + git commit 刪除


前言

在軟件開發(fā)中,版本控制是一個(gè)非常重要的概念。它允許開發(fā)者追蹤代碼的變化,協(xié)作開發(fā),以及回退到之前的版本。Git 是目前最流行的版本控制工具之一,它具有強(qiáng)大的功能,可幫助開發(fā)團(tuán)隊(duì)高效地管理代碼。

本文將介紹如何使用 Git 來管理我們的代碼項(xiàng)目。我將從創(chuàng)建本地倉(cāng)庫(kù)開始,逐步介紹配置 Git、認(rèn)識(shí) Git 的工作區(qū)、暫存區(qū)和版本庫(kù),以及如何添加文件、修改文件、版本回退、撤銷修改以及刪除文件等操作。

一、創(chuàng)建 Git 本地倉(cāng)庫(kù)

1.1 什么是倉(cāng)庫(kù)

倉(cāng)庫(kù)(Repository)是指用來存儲(chǔ)和管理代碼、文件或項(xiàng)目的地方。在軟件開發(fā)中,倉(cāng)庫(kù)通常用于存放一個(gè)或多個(gè)相關(guān)的代碼文件、文檔和資源,以便開發(fā)者或團(tuán)隊(duì)協(xié)作開發(fā)、跟蹤變更和保留項(xiàng)目的歷史記錄。

Git 倉(cāng)庫(kù)是其中一種常見類型的倉(cāng)庫(kù),用于版本控制和協(xié)同開發(fā)。它可以包含項(xiàng)目的不同版本,允許開發(fā)者記錄和追蹤每次修改,以確保代碼的可維護(hù)性和可追蹤性。

倉(cāng)庫(kù)可以分為本地倉(cāng)庫(kù)(存儲(chǔ)在個(gè)人計(jì)算機(jī)或服務(wù)器上)和遠(yuǎn)程倉(cāng)庫(kù)(存儲(chǔ)在云端或其他遠(yuǎn)程服務(wù)器上),開發(fā)者可以根據(jù)需要選擇使用哪種類型的倉(cāng)庫(kù)來管理他們的項(xiàng)目。

1.2 創(chuàng)建本地倉(cāng)庫(kù)

創(chuàng)建一個(gè) Git 本地倉(cāng)庫(kù)需要兩個(gè)步驟:

  1. 首先創(chuàng)建一個(gè)目錄;
  2. 在該目錄下使用命令 git init 進(jìn)行初始化。

例如,我創(chuàng)建了一個(gè) gitcode 目錄:


此時(shí),該目錄下面沒有任何文件。

切換至該目錄下,使用 git init 命令進(jìn)行初始化:

再次查看該目錄下的文件:


發(fā)現(xiàn)多了一個(gè) .git 的目錄。

1.3 .git 目錄結(jié)構(gòu)

可以使用 tree 命令查看目錄的結(jié)構(gòu):

[root@VM-16-9-ubuntu gitcode]# tree .git/
.git/
├── branches
├── 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
│   ├── push-to-checkout.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs├── heads└── tags

這是 .git 的目錄結(jié)構(gòu),它是 Git 版本控制系統(tǒng)的核心部分,用于存儲(chǔ)項(xiàng)目的版本歷史和元數(shù)據(jù)。

以下是每個(gè)目錄的功能說明:

  1. branches: 這個(gè)目錄用于存儲(chǔ)分支的引用,每個(gè)分支都可以在這里找到一個(gè)文件,該文件包含了分支的引用信息。

  2. config: Git 配置文件,包含項(xiàng)目特定的配置選項(xiàng),如用戶名、郵箱、合并策略等。

  3. description: 一個(gè)簡(jiǎn)短的描述文件,通常包含了項(xiàng)目的簡(jiǎn)要描述信息。

  4. HEAD: 這是一個(gè)特殊的文件,指向當(dāng)前所在的分支或者是直接指向某個(gè)提交(commit)的引用。

  5. hooks: 這個(gè)目錄包含了 Git 鉤子(hooks)的示例腳本。Git 鉤子是在特定事件發(fā)生時(shí)自動(dòng)觸發(fā)的腳本,可以用于自定義 Git 的行為,比如在提交前運(yùn)行測(cè)試。

  6. info: 包含一些項(xiàng)目的信息文件,其中exclude文件用于指定 Git 應(yīng)該忽略的文件和目錄。

  7. objects: 這是 Git 的核心數(shù)據(jù)存儲(chǔ)目錄,包含了所有的對(duì)象(如提交、樹、文件等)的實(shí)際內(nèi)容。info子目錄包含一些對(duì)象的額外信息,pack子目錄包含了壓縮的對(duì)象數(shù)據(jù)。

  8. refs: 這個(gè)目錄用于存儲(chǔ)引用(refs),包括分支(heads)和標(biāo)簽(tags)。heads子目錄包含了各個(gè)分支的引用,tags子目錄包含了各個(gè)標(biāo)簽的引用。

這些目錄和文件組合在一起構(gòu)成了 Git 倉(cāng)庫(kù)的核心結(jié)構(gòu),允許 Git 跟蹤和管理項(xiàng)目的版本歷史和元數(shù)據(jù)。通過這些文件和目錄,Git 可以實(shí)現(xiàn)分支管理、提交歷史記錄、合并、回滾等版本控制功能。

二、配置 Git

當(dāng)創(chuàng)建好 Git 的本地倉(cāng)庫(kù)后首先要做的事情是設(shè)置自己的 用戶名稱e-mail 地址,這是非常重要的一件事。

配置命令為:

git config [--global] user.name "Your Name"
git config [--global] user.email "email@example.com"# 把 Your Name 改成自己的用戶名
# 把 email@example.com 改成郵箱的格式,只要格式正確即可。

其中 --global 是?個(gè)可選項(xiàng)。如果使用了該選項(xiàng),表示這臺(tái)機(jī)器上所有的 Git 倉(cāng)庫(kù)都會(huì)使用這個(gè)配置。如果希望在不同倉(cāng)庫(kù)中使用不同的namee-mail ,可以不加 --global 選項(xiàng),但要注意的是,執(zhí)行命令時(shí)必須要在倉(cāng)庫(kù)目錄下執(zhí)行。

查看配置命令為:

git config -l 

刪除對(duì)應(yīng)的配置命令為:

git config [--global] --unset user.name
git config [--global] --unset user.email

三、認(rèn)識(shí) Git 的工作區(qū)、暫存區(qū)和版本庫(kù)

3.1 什么是 Git 的工作區(qū)、暫存區(qū)和版本庫(kù)

Git的 工作區(qū)(Working Directory)、暫存區(qū)(Staging Area)和版本庫(kù)(Repository)是 Git 版本控制系統(tǒng)中的三個(gè)關(guān)鍵概念,它們協(xié)同工作來管理和跟蹤項(xiàng)目的版本歷史。以下是它們的定義:

  1. 工作區(qū)(Working Directory):工作區(qū)是當(dāng)前正在操作的項(xiàng)目目錄,包含項(xiàng)目的所有文件和子目錄。這是對(duì)項(xiàng)目進(jìn)行修改和編輯的地方

  2. 暫存區(qū)(Staging Area):暫存區(qū)是一個(gè)中間區(qū)域,一般存放在 .git 目錄下的 index 文件(.git/index)中,因此暫存區(qū)有時(shí)也叫作索引(index)。它是用于存放已經(jīng)修改但尚未提交的文件。在工作區(qū)做出的更改需要明確添加到暫存區(qū),這個(gè)過程通常通過 git add 命令完成。暫存區(qū)的作用是讓我們能夠選擇性地提交文件,而不是一次性提交所有更改。

  3. 版本庫(kù)(Repository):版本庫(kù)是 Git 中存儲(chǔ)項(xiàng)目的所有版本歷史的地方。它包括了所有已提交的文件快照以及提交的記錄信息。這個(gè)過程通常通過 git commit 命令完成。版本庫(kù)通常包含了三個(gè)部分:

    • 工作目錄中的 .git 目錄,其中存儲(chǔ)了 Git 的配置和元數(shù)據(jù);
    • 對(duì)象數(shù)據(jù)庫(kù),存儲(chǔ)了項(xiàng)目的所有歷史版本和文件;
    • 引用,包括分支和標(biāo)簽,用于標(biāo)識(shí)不同的提交點(diǎn)。

3.2 工作區(qū)、暫存區(qū)和版本庫(kù)之間的關(guān)系

下面這張圖形象地展示了工作區(qū)、暫存區(qū)和版本庫(kù)之間的關(guān)系:

工作區(qū)、暫存區(qū)和版本庫(kù)關(guān)系

在圖中,可以看到以下要點(diǎn):

  • 圖中左側(cè)為工作區(qū),右側(cè)為版本庫(kù)。Git 的版本庫(kù)里存了很多東西,其中最重要的就是暫存區(qū)。
  • 在創(chuàng)建 Git 版本庫(kù)時(shí),Git 會(huì)為我們自動(dòng)創(chuàng)建?個(gè)唯?的 master 分支,以及指向 master 的一個(gè)指針 HEAD
  • 當(dāng)對(duì)工作區(qū)修改(或新增)的文件執(zhí)行 git add 命令時(shí),暫存區(qū)目錄樹的文件索引(index)會(huì)被更新。
  • 當(dāng)執(zhí)行提交操作 git commit 時(shí),master 分支會(huì)做相應(yīng)的更新,可以簡(jiǎn)單理解為暫存區(qū)的目錄樹才會(huì)被真正寫到版本庫(kù)中。

由上述描述我們便能得知:通過新建或粘貼進(jìn)工作目錄的文件件,并不能稱之為向倉(cāng)庫(kù)中新增文件,而只是在工作區(qū)新增了文件。必須要通過使用 git addgit commit 命令才能將文件添加到倉(cāng)庫(kù)中進(jìn)行管理!

四、添加文件

4.1 添加文件到暫存區(qū)和版本庫(kù)中的命令

添加文件到暫存區(qū)的命令:

  • 添加一個(gè)或多個(gè)文件到暫存區(qū):git add [file1] [file2] ...
  • 添加指定目錄到暫存區(qū),包括子目錄:git add [dir]
  • 添加當(dāng)前目錄下的所有改動(dòng)文件到暫存區(qū): git add .

將暫存區(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)容不能省略,并要仔細(xì)描述,以用來記錄提交細(xì)節(jié),方便向其他人展示。

4.2 添加文件演示

在包含 .git 的目錄下新建?個(gè) ReadMe 文件,然后可以使用 git add 命令可以將這個(gè)文件添加到暫存區(qū):

再使用 git commit 命令將暫存區(qū)內(nèi)容添加到本地倉(cāng)庫(kù)中:

當(dāng) git commit 命令執(zhí)行成功后會(huì)告訴我們,1個(gè)文件被改動(dòng)(就是我們新添加的ReadMe?件),插了0 行內(nèi)容(ReadMe 文件中沒有內(nèi)容)。

我們還可以多次使用 git add 命令添加不同的文件,而只 commit ?次便可以提交所有文件,是因?yàn)樾枰峤坏奈募?br /> 通通被添加到暫存區(qū)中,然后一次性t提交暫存區(qū)的所有修改。例如下面的例子:

截至目前為止,我們已經(jīng)更夠?qū)⒋a直接提交至本地倉(cāng)庫(kù)了。然后可以使用 git log 命令,來查看歷史提交記錄:

該命令顯示從最近到最遠(yuǎn)的提交日志,并且可以看到我們commit時(shí)的日志消息。如果嫌輸出信息太多,看得眼花繚亂的,可以加上--pretty=oneline 參數(shù):

需要說明的是,我們看到的一大串類似 df5e5bd…91c3abde 的十六進(jìn)制數(shù),其實(shí)是每次提交的 commit id(版本號(hào)),Git 的 commit id 并不是 1,2,3…… 這樣遞增的數(shù)字,而是一個(gè)經(jīng)過 SHA-1 計(jì)算出來的一個(gè)非常大的數(shù)字,用十六進(jìn)制表示。

4.3 添加文件后的 .git 目錄變化

再次查看 .git 目錄:

a)可以發(fā)現(xiàn)增加了一個(gè) index 目錄(原來沒有的原因是剛創(chuàng)建的本地倉(cāng)庫(kù)還是新的,里面沒有任何暫存內(nèi)容),這就是暫存區(qū),add 之后的內(nèi)容都是添加到里面的。

b)HEAD 就是默認(rèn)指向 master 分支的指針:

而默認(rèn)的 master 分支,其實(shí)就是:

這段數(shù)字:df5e5bd917bf598056d4dc443387138891c3abde 表示的就是當(dāng)前最新的 commit id,可通過上文中的 git log 命令輸出的結(jié)果進(jìn)行對(duì)比。

c) objects 是 Git 的對(duì)象庫(kù),里面包含了創(chuàng)建的各種版本庫(kù)對(duì)象及內(nèi)容。當(dāng)執(zhí)行 git add 命令時(shí),暫存區(qū)的目錄樹被更新,同時(shí)工作區(qū)修改或新增的文件內(nèi)容會(huì)被寫入到對(duì)象庫(kù)中的?個(gè)新的對(duì)象中,即位于 .git/objects 目錄下,讓我們來看看這些對(duì)象有何用處:

查找 object 時(shí)要將 commit id 分成兩部分,其前兩位是文件夾名稱,后 38 位是文件名稱。

找到這個(gè)文件之后,一般不能直接看到里面是什么,該類文件是經(jīng)過 SHA-1(安全哈希算法)加密過的文件,好在我們可以使用 git cat-file 命令來查看版本庫(kù)對(duì)象的內(nèi)容:


此時(shí)查看的就是最近一次提交的信息。其中,-p 選項(xiàng)的含義是 pretty,也就是將結(jié)果顯示得更漂亮,parent 表示的是上一次提交內(nèi)容的 commit id。

另外,還有一行 tree 15a37e9ef171cca4a5d985fccd1fcf9414b2c7cf,我們使用同樣的方法,看看結(jié)果:

其實(shí),這些就是 Git 記錄的每個(gè)文件的修改記錄??梢圆榭?ReadMe 文件對(duì)應(yīng)的 8d0e41234f24b6da002d962a26c2495ea16a425f

這是我們對(duì) ReadMe 文件做的修改,其修改的內(nèi)容被 Git 記錄了下來。

d)總結(jié)一下,在本地的 Git 倉(cāng)庫(kù)中,有幾個(gè)文件或者目錄非常特殊:

  • index:暫存區(qū), 執(zhí)行 git add 后會(huì)更新該內(nèi)容。
  • HEAD:默認(rèn)指向 master 分支的一個(gè)指針。
  • refs/heads/master:這個(gè)文件里保存當(dāng)前 master 分支的最新 commit id
  • objects:包含了創(chuàng)建的各種版本庫(kù)對(duì)象及內(nèi)容,可以簡(jiǎn)單理解為存放了 Git 維護(hù)的所有修改。

五、文件的修改

Git 比其他版本控制系統(tǒng)設(shè)計(jì)得更加優(yōu)秀,是因?yàn)?Git 跟蹤并管理的是修改內(nèi)容,而非文件。

那么什么是修改呢?比如在某個(gè)文件中新增了一行,這就是一個(gè)修改;刪除了一會(huì),這也是一個(gè)修改;更改了某些字符、刪了一些又增加了一些、甚至創(chuàng)建一個(gè)新文件,同樣也算一個(gè)修改。

下面我將演示對(duì)一個(gè)文件進(jìn)行了修改,觀察 Git 倉(cāng)庫(kù)會(huì)發(fā)生怎樣變化。

5.1 對(duì) ReadMe 文件進(jìn)行修改

使用 vim 編輯器,在 ReadMe 文件在新增一行 hello world


此時(shí),Git 倉(cāng)庫(kù)中的 ReadMe 和工作區(qū)的 ReadMe 的內(nèi)容是不同的??梢允褂?git status 命令來查看當(dāng)前工作區(qū)的內(nèi)容相較于 Git 倉(cāng)庫(kù)中的內(nèi)容是否發(fā)生了修改:


可以發(fā)現(xiàn),ReadMe 文件已經(jīng)被修改了,但還沒有完成添加與提交操作。

5.2 查看工作區(qū)與暫存區(qū)文件內(nèi)容的差異

如果要查看工作區(qū)與暫存區(qū)文件內(nèi)容的差異,則可以使用 git diff [file] 命令,這個(gè)命令用來顯示暫存區(qū)和工作區(qū)文件的差異,顯示的格式是 Unix 通用的 diff 格式。例如查看 ReadMe 文件:

說明:

  • --- a/ReadMe 表示修改前,而 +++ b/ReadMe 表示修改后;
  • -1 表示修改前文件的第一行的內(nèi)容,+1, 2 表示修改后的第一行,兩行的內(nèi)容。
  • +hello world 表示的是新增的內(nèi)容,即帶了一個(gè) + 號(hào)。

5.3 查看工作區(qū)與版本庫(kù)文件內(nèi)容的差異

如果要查看工作區(qū)與版本庫(kù)文件內(nèi)容的差異,則可以使用 git diff HEAD [file] 命令,其顯示的格式和上文一樣,例如查看 ReadMe 文件:

5.4 提交修改后的文件

當(dāng)前面使用 git status 命令查看倉(cāng)庫(kù)狀態(tài)的時(shí)候,就已經(jīng)提示了我們可以使用 git add <file> 命令來更新暫存區(qū),然后 commit 提交到版本庫(kù)中。

更新文件到暫存區(qū):

更新暫存區(qū)內(nèi)容到版本庫(kù):

此時(shí),再次使用兩個(gè) git diff 命令,則沒有輸出任何內(nèi)容,則說明已經(jīng)更新文件內(nèi)容到版本庫(kù)成功了:

六、版本回退

我們都知道,Git 能夠管理文件的歷史版本,這也是版本控制器重要的能力。如果有一天發(fā)現(xiàn)目前做的工作做的出現(xiàn)了很大的問題,需要在某個(gè)特定的歷史版本重新開始,這個(gè)時(shí)候就需要版本回退的功能了。

6.1 版本回退命令

當(dāng)使用 Git 進(jìn)行版本控制時(shí),經(jīng)常需要回退到之前的某個(gè)提交版本。這可以通過 git reset 命令來實(shí)現(xiàn),該命令可以將版本庫(kù)中的內(nèi)容回退到指定的提交點(diǎn)。值得注意的是,Git 中的 “回退” 涉及到版本庫(kù)、工作區(qū)和暫存區(qū)三個(gè)重要的部分。

回退命令語法:

git reset [--soft | --mixed | --hard] [commit]

說明:

  • --mixed:這是默認(rèn)選項(xiàng),它會(huì)將版本庫(kù)和暫存區(qū)的內(nèi)容回退到指定提交版本,但工作區(qū)的文件保持不變。這意味著文件內(nèi)容在工作區(qū)仍然保持最新的狀態(tài),但暫存區(qū)的更改會(huì)被取消。

  • --soft:使用這個(gè)參數(shù)時(shí),版本庫(kù)會(huì)回退到指定版本,但工作區(qū)和暫存區(qū)的內(nèi)容都不會(huì)發(fā)生改變。這個(gè)選項(xiàng)允許重新提交當(dāng)前工作目錄中的更改,而不會(huì)影響之前的提交歷史。

  • --hard:這個(gè)參數(shù)將版本庫(kù)、暫存區(qū)和工作區(qū)都回退到指定的提交版本。使用這個(gè)選項(xiàng)時(shí)要格外小心,因?yàn)樗鼤?huì)刪除工作區(qū)中未提交的更改,這些更改將不可恢復(fù)。

commit 參數(shù):

  • commit 參數(shù)表示的是要回退到的目標(biāo)提交版本??梢灾苯邮褂?commit 的哈希值來指定特定的提交版本。例如,git reset abc123 將會(huì)回退到哈希值為 abc123 的提交版本。

  • HEAD 表示當(dāng)前的提交版本。

  • HEAD^ 表示上一個(gè)提交版本,HEAD^^ 表示上上一個(gè)提交版本,以此類推。另外,可以使用 HEAD~n 來表示向前回退 n 個(gè)提交版本。

注意事項(xiàng):

  • 使用 git reset --hard 時(shí)要格外小心,因?yàn)樗鼤?huì)刪除工作區(qū)中未提交的更改,這些更改將不可恢復(fù)。請(qǐng)確保在執(zhí)行前備份重要的更改。

  • 如果你只是想取消之前的提交并創(chuàng)建一個(gè)新的提交來覆蓋它,可以使用 git revert 命令,它會(huì)創(chuàng)建一個(gè)新的提交來撤銷指定提交的更改,而不會(huì)刪除歷史記錄。

  • 在執(zhí)行 git reset 命令之前,建議使用 git log 來查看提交歷史,以確保你選擇了正確的提交點(diǎn)進(jìn)行回退。

6.2 演示版本回退

首先,使用 git log 命令查看提交的歷史:

如果我們想要回退到 “提交 Read 文件” 時(shí)的版本,回退的命令為:

git reset --hard 9ad6baf71d5b6769c2823d6ebe47e363675a24b8

此時(shí)發(fā)現(xiàn)回退成功了,ReadMe 文件的內(nèi)容和其他文件也都沒有了,并且再次使用 git log 查看日志,發(fā)現(xiàn)只有當(dāng)前一條記錄了。

6.3 撤銷版本回退

到這里一般的回退功能就演示完了,但現(xiàn)在如果我后悔了,想再回到回退前的版本該怎么辦呢?非常簡(jiǎn)單,我們可以繼續(xù)使用 git reset 命令,回退到回退前的版本。但我們必須要拿到目標(biāo)版本的的 commit id 去指定回退的版本。

幸運(yùn)的是,在當(dāng)前的終端中,存在有目標(biāo)版本的 commit id

此時(shí),只需要執(zhí)行下面的命令,就可以撤銷回退了:

git reset --hard 4feb4570eb6921f92455b7944cd0724e09f040c3

但是,如果終端關(guān)閉了,那么之間的 git log 記錄也就消失了,又該如何回退呢,此時(shí)可以使用 git reflog 來查看每一次的 執(zhí)行 commit 的記錄:


此時(shí)同樣可以根據(jù) 4feb457 回退到回退前的版本:

6.4 版本回退的原理

Git 的版本回退原理是 Git 在內(nèi)部使用指針來管理分支和提交歷史,這使得版本回退操作非常高效。在 Git 中,每個(gè)分支都有一個(gè)指向當(dāng)前提交的指針,而這個(gè)指針通常稱為 HEAD當(dāng)執(zhí)行版本回退操作時(shí),實(shí)際上只是在移動(dòng)這個(gè)指針,而不是修改實(shí)際文件內(nèi)容,這就使得版本回退變得非??焖?/code>。

下面詳細(xì)解釋一下版本回退的原理:

  1. Git 的分支指針:在 Git 中,每個(gè)分支都有一個(gè)指針,指向該分支的最新提交。例如,如果你當(dāng)前在 master 分支上,master 分支的指針就指向 master 分支的最新提交。這個(gè)指針通常被稱為 HEAD。

  2. 版本庫(kù)中的提交對(duì)象:Git 的版本庫(kù)中包含了一系列提交對(duì)象,每個(gè)提交對(duì)象都代表了一個(gè)快照,包括文件的狀態(tài)、提交者信息、時(shí)間戳等。提交對(duì)象之間通過父子關(guān)系形成提交歷史鏈。

  3. 版本回退操作:當(dāng)執(zhí)行版本回退操作,比如使用 git reset 命令,Git 實(shí)際上會(huì)移動(dòng)分支的指針(包括 HEAD)來指向不同的提交對(duì)象。這個(gè)操作不會(huì)刪除或修改提交歷史中的提交對(duì)象,而只是改變了分支指針的位置。

  4. 工作區(qū)、暫存區(qū)和版本庫(kù)的關(guān)系:工作區(qū)中的文件表示當(dāng)前文件狀態(tài),暫存區(qū)是一個(gè)中間區(qū)域,用于準(zhǔn)備提交的更改,而版本庫(kù)存儲(chǔ)了所有提交的歷史記錄。版本回退操作只影響了分支指針的位置,不會(huì)直接修改工作區(qū)或暫存區(qū)的內(nèi)容??梢愿鶕?jù)需要將工作區(qū)和暫存區(qū)的內(nèi)容重新配置以匹配新的分支指針位置。

下圖展示了版本回退的原理:

版本回退原理

從圖中可以看出,版本回退操作實(shí)際上只是改變了 master 分支指針的位置,不涉及對(duì)文件內(nèi)容的修改。這種指針操作使得 Git 的版本回退非常迅速,因?yàn)樗簧婕霸獢?shù)據(jù)的移動(dòng),而不需要修改大量文件。

總結(jié)來說,Git 的版本回退原理基于分支指針的移動(dòng),它只影響分支的指向,不會(huì)直接修改文件內(nèi)容,因此非常高效。理解這個(gè)原理可以幫助我們更好地使用 Git 進(jìn)行版本控制,并理解版本回退操作的本質(zhì)。

七、撤銷修改

如果我們?cè)谖覀兊墓ぷ鲄^(qū)寫了很長(zhǎng)時(shí)間代碼,越寫越寫不下去,覺得自己寫的實(shí)在是垃圾,想恢復(fù)到上一個(gè)版本,此時(shí)就可以考慮撤銷修改了。對(duì)于撤銷修改來說,存在三種情況,分別是:

  • 對(duì)于工作區(qū)代碼,還沒有 add;
  • 已經(jīng) add,但沒有 commit;
  • 已經(jīng) add 和 commit 了。

下面將針對(duì)不同的情況,展示如何進(jìn)行撤銷修改。

7.1 情況一:對(duì)于工作區(qū)代碼,還沒有 add

對(duì)于工作區(qū)代碼,還沒有 add 操作,我們一般想到的做法就是,使用 git diff 命令,將存在差異的代碼刪除掉:

顯然,這個(gè)方法行得通,但是如果以及編寫了大量的代碼,那還能夠一點(diǎn)點(diǎn)的刪除嗎。如果手動(dòng)修改的話,也可能錯(cuò)誤的刪除,造成代碼無法正常運(yùn)行。此時(shí),就需要使用 git checkout -- [file] 命令。注意,命令中的 -- 很重要,切記不要省略,一旦省略,該命令就變?yōu)槠渌馑肌?br />
此時(shí)發(fā)現(xiàn),成功撤銷了工作區(qū)中代碼的修改。

7.2 情況二:已經(jīng) add,但沒有 commit

當(dāng)進(jìn)行了 add 操作之后,暫存區(qū)中也存在了修改的內(nèi)容,如果使用 git status 命令就可以發(fā)現(xiàn)這個(gè)修改:


此時(shí)要想撤銷修改,也非常的簡(jiǎn)單,因?yàn)檫€未執(zhí)行 commit ,也就是說版本庫(kù)中的內(nèi)容還是修改前的內(nèi)容,因此直接使用 git reset 命令回退到當(dāng)前版本即可。

注意,回退暫存區(qū)的代碼可以使用 --mixed 選項(xiàng),由于其是默認(rèn)選項(xiàng),因此可省略不寫。

回退了暫存區(qū)中的修改之后,發(fā)現(xiàn)還有工作區(qū)中的修改沒有撤銷,此時(shí)就變成了情況一

此時(shí),直接使用git checkout -- [file] 命令進(jìn)行撤銷即可。

當(dāng)然,還可以直接使用命令 git reset --hard HEAD 同時(shí)回退工作區(qū)和暫存區(qū)中的修改。

7.3 情況三:已經(jīng) add 和 commit

如果已經(jīng)執(zhí)行了 addcommit 兩個(gè)操作,那么版本庫(kù)中也更新了修改的內(nèi)容了:

此時(shí)要想撤銷修改,那就更簡(jiǎn)單了,只有使用命令 git reset --hard HEAD^ 回退至上一個(gè)版本即可。

需要注意的使用,這樣的回退方法僅僅是在還未使用 git push 提交至遠(yuǎn)程倉(cāng)庫(kù)之前使用,如果執(zhí)行了 push 則需要使用其他方法,具體方法將在我后續(xù)關(guān)于 Git 遠(yuǎn)程操作 的文章給出答案。

八、刪除文件

對(duì)應(yīng)刪除文件操作,如果只刪除工作區(qū)中的文件,那么就會(huì)和暫存區(qū)和版本庫(kù)中的內(nèi)容不匹配了,因此需要同時(shí)刪除這三個(gè)地方的內(nèi)容。下面演示了兩種刪除方法。

8.1 rm + git add + git commit 刪除

在 Git 中,刪除也是一個(gè)修改操作,因此可以使用 rm + git add + git commit 的方法進(jìn)行刪除,例如刪除 file3 文件:

8.2 git rm + git commit 刪除

針對(duì)于刪除操作,Git 也提供了一個(gè) rm 命令,其作用是刪除工作區(qū)文件,并提交至?xí)捍鎱^(qū),相當(dāng)于上面的 rm + git add 操作,例如刪除 file2 文件:

http://www.risenshineclean.com/news/5465.html

相關(guān)文章:

  • 天津餐飲網(wǎng)站建設(shè)網(wǎng)絡(luò)廣告聯(lián)盟
  • 做美食介紹的網(wǎng)站淘寶推廣費(fèi)用多少錢一天
  • 網(wǎng)站與微網(wǎng)站區(qū)別市場(chǎng)推廣是做什么的
  • 網(wǎng)站建設(shè)流程圖片優(yōu)化大師app
  • 鞏義網(wǎng)站建設(shè)托管seo詞庫(kù)排行
  • vs 2008網(wǎng)站做安裝包怎么找推廣渠道
  • 日本做受視頻網(wǎng)站鄭州百度推廣開戶
  • 哪個(gè)網(wǎng)站可以領(lǐng)單做效果圖制作一個(gè)app軟件需要多少錢
  • 北京創(chuàng)意網(wǎng)站建設(shè)搜索引擎關(guān)鍵詞怎么優(yōu)化
  • 網(wǎng)站訪問代理在線南寧推廣軟件
  • 在58同城做網(wǎng)站怎么樣哪個(gè)杭州seo好
  • pc網(wǎng)站自動(dòng)跳轉(zhuǎn)wap內(nèi)蒙古網(wǎng)站seo
  • 門戶網(wǎng)站建設(shè)工作方案蘭州疫情最新情況
  • 做五金批發(fā)的適合在哪些網(wǎng)站杭州seo薪資水平
  • 上海專業(yè)網(wǎng)站建設(shè)公司電話商丘網(wǎng)站seo
  • 抽獎(jiǎng)的網(wǎng)站怎么做廣告網(wǎng)站留電話
  • 溫州本地網(wǎng)站鄭州網(wǎng)站推廣排名公司
  • 深圳建筑企業(yè)排名線下課程seo
  • wordpress旅游公司主題百度seo營(yíng)銷推廣
  • 我想帶貨怎么找貨源青島優(yōu)化網(wǎng)站關(guān)鍵詞
  • 網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)案例汕頭網(wǎng)站建設(shè)開發(fā)
  • 幫朋友做網(wǎng)站志鴻優(yōu)化設(shè)計(jì)答案網(wǎng)
  • 做emc的有哪些網(wǎng)站阿里指數(shù)查詢
  • 網(wǎng)站如何做3d產(chǎn)品百度賬號(hào)登陸
  • wordpress 小說主題結(jié)構(gòu)優(yōu)化
  • 中國(guó)招標(biāo)信息網(wǎng)惠州seo推廣優(yōu)化
  • python 網(wǎng)站開發(fā)小項(xiàng)目怎樣制作網(wǎng)站
  • 電子商務(wù)主要學(xué)什么就業(yè)工資seo是什么工作內(nèi)容
  • 網(wǎng)站開發(fā)與服務(wù)合同范本建立網(wǎng)站平臺(tái)
  • 長(zhǎng)沙門戶網(wǎng)站地推拉新app推廣平臺(tái)有哪些