柚子快報(bào)邀請(qǐng)碼778899分享:Git 時(shí)光穿梭
柚子快報(bào)邀請(qǐng)碼778899分享:Git 時(shí)光穿梭
文章目錄
一、問題引入二、前置知識(shí)三、工作區(qū)暫存區(qū)和版本庫(kù)四、版本回退1、版本回退命令2、四大常見場(chǎng)景3、刪除文件
總結(jié)
一、問題引入
假設(shè)這樣一個(gè)場(chǎng)景:有一天你的老板讓你整理一份報(bào)告,結(jié)果你很輕松的整理完了第一版,但是你的老板并不滿意,于是老板給你不斷的提出建議,你不斷的修改,于是報(bào)告就迭代出了版本1、版本2、版本3……但是老板拿到最新版本的報(bào)告之后,搖了搖頭說:“我還是覺得版本1比較好,你把版本1拿給我吧”。這個(gè)時(shí)候你可能想“殺”他的心都有了,因?yàn)槟闶窃谝粋€(gè)報(bào)告中迭代的,版本1你早就不知道長(zhǎng)什么樣了。
這次經(jīng)歷之后,你留了一個(gè)心眼,每次你在進(jìn)行修改的時(shí)候,都創(chuàng)建一個(gè)副本,結(jié)果就是一份報(bào)告分散出好多的文件,可是如果過了一周,看著這些亂起八糟的文件,你想找到修改的內(nèi)容,但是已經(jīng)記不清保存在哪個(gè)文件中了,只好一個(gè)一個(gè)文件去找,非常麻煩。并且如果你想保留最新的文件,然后把其他文件刪掉,但是你又不敢刪,怕哪天還會(huì)用到,真郁悶。
針對(duì)以上問題,難道就沒有一種完美的解決方案的嗎?于是 Git 等版本控制系統(tǒng)橫空出世。其中 Git 版本回退可以說是 Git 的殺手锏之一,注意是之一,后面還有之二、之三……這個(gè)我們之后在介紹。
二、前置知識(shí)
為了更好的理解 Git ,在講 Git 之前,我們先引入一些前置知識(shí):
git add 將文件提交到暫存區(qū)。git commit 將文件提交到本地倉(cāng)庫(kù)。git status 可以讓我們隨時(shí)掌握工作區(qū)的狀態(tài)(哪些文件被修改過)。git diff 顧名思義就是查看difference,可以查看修改內(nèi)容,顯示的格式是Unix通用的diff格式。git log 命令顯示從最近到最遠(yuǎn)的提交日志(加上--pretty=oneline會(huì)更加可觀)。
上面這些命令不作為本期重點(diǎn),大家可以自行了解。
三、工作區(qū)暫存區(qū)和版本庫(kù)
工作區(qū):就是你在電腦里能看到的目錄。暫存區(qū):英文叫 stage 或 index。一般存放在 “.git” 目錄下的 index 文件(.git/index)中,所以我們把暫存區(qū)有時(shí)也叫作索引(index)。版本庫(kù):工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是Git的版本庫(kù)。
下面這張圖就展示了 其實(shí)細(xì)心的小伙伴就發(fā)現(xiàn)了,除了工作區(qū),暫存區(qū),版本庫(kù),還有兩個(gè)就是 object 和 master
在Git中,所有的數(shù)據(jù)都以對(duì)象(objects)的形式存儲(chǔ)(文件內(nèi)容,提交信息,分支引用等等)。objects 標(biāo)識(shí)的區(qū)域?yàn)?Git 的對(duì)象庫(kù),實(shí)際位于 “.git/objects” 目錄下,里面包含了創(chuàng)建的各種對(duì)象及內(nèi)容。當(dāng)執(zhí)行提交操作(git commit)時(shí),暫存區(qū)的目錄樹寫到版本庫(kù)(對(duì)象庫(kù))中,master 分支會(huì)做相應(yīng)的更新。即 master 指向的目錄樹就是提交時(shí)暫存區(qū)的目錄樹。
注:Git 跟蹤并管理的是修改(新增、刪除、更改、新建)
四、版本回退
1、版本回退命令
git reset 命令在 Git 中被用來移動(dòng) HEAD 指針和重置當(dāng)前分支的位置。它有幾種不同的用法,主要包括以下三種模式:soft、mixed 和 hard。
1. Soft 模式:git reset --soft
2. Mixed 模式:git reset --mixed
3. Hard 模式:git reset --hard
除了以上幾種模式外,git reset 還可以結(jié)合使用一些選項(xiàng)和參數(shù)來實(shí)現(xiàn)不同的操作,如:
(1)git reset HEAD
注:
HEAD 表示當(dāng)前版本HEAD^ 上?個(gè)版本HEAD^^ 上上?個(gè)版本 以此類推…
也可以使? ?數(shù)字表示:
HEAD~0 表示當(dāng)前版本HEAD~1 上?個(gè)版本HEAD^2 上上?個(gè)版本 以此類推…
2、四大常見場(chǎng)景
(1)場(chǎng)景一:使用 --hard 將工作區(qū)、暫存區(qū)、版本庫(kù)進(jìn)行了回退,結(jié)果后悔了怎么辦
在Git中,總是有后悔藥可以吃的。例如當(dāng)你用 git reset --hard HEAD^ 回退到上一個(gè)版本時(shí),再想恢復(fù)到之前的版本,就必須找到之前版本的 commit id。Git提供了一個(gè)命令 git reflog 用來記錄你的每一次命令,你可以通過這個(gè)命令找到之前的版本 id,然后使用 git reset --hard
(2)場(chǎng)景二:對(duì)于?作區(qū)的代碼,還沒有 add
直接使用 git checkout --
(3)場(chǎng)景三:已經(jīng) add ,但沒有 commit
先使用 git reset --mixed HEAD
再使用 git checkout --
(4)場(chǎng)景四:已經(jīng) add ,并且也 commit 了
不要擔(dān)心,我們可以 git reset --hard HEAD^ 回退到上?個(gè)版本!不過,這是有條件的,就是你還沒有把??的本地版本庫(kù)推送到遠(yuǎn)程。還記得Git是分布式版本控制系統(tǒng)嗎?我們后?會(huì)講到遠(yuǎn)程版本庫(kù),?旦你推送到遠(yuǎn)程版本庫(kù),你就真的慘了……
3、刪除文件
再 Git 中刪除也是修改,也可以被 Git 管理起來。
一般情況下,你直接在工作區(qū)中把文件給刪除了,這個(gè)時(shí)候 Git 是可以知道你刪除了文件的,你可以使用 git status 命令查看哪些文件被刪除了。
其實(shí)在實(shí)際的工作中,刪除文件的操作是比較少見的,此時(shí)一般會(huì)存在兩種情況:
情況一:確實(shí)想要從版本庫(kù)中刪除文件
使用 git rm
情況二:不小心刪錯(cuò)了,屬于誤刪情況
git checkout –
總結(jié)
值得注意的是,Git 的版本回退速度非??欤?yàn)?Git 在內(nèi)部有個(gè)指向當(dāng)前版本的 HEAD 指針,當(dāng)你回退版本的時(shí)候,Git 僅僅是把 HEAD 指針指向回退的版本即可。
柚子快報(bào)邀請(qǐng)碼778899分享:Git 時(shí)光穿梭
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。