本文小編為大家詳細(xì)介紹“Git使用方法有哪些”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Git使用方法有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
在通渭等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,通渭網(wǎng)站建設(shè)費(fèi)用合理。
遠(yuǎn)程倉(cāng)庫(kù)區(qū)
:也就是我們代碼最終提交的歸宿,沒(méi)啥好說(shuō)的。
遠(yuǎn)端分支本地副本
:這個(gè)其實(shí)主要儲(chǔ)存了遠(yuǎn)程倉(cāng)庫(kù)各分支數(shù)據(jù)在本地的一個(gè)副本,你可以打開(kāi)你 Git 項(xiàng)目下的 .git 文件,里面有個(gè) refs/remotes,這里就主要存的就是遠(yuǎn)程倉(cāng)庫(kù)的分支信息,一般你執(zhí)行 push 或者 pull、fetch 都會(huì)往這里進(jìn)行更新。
本地分支
:這里就是我們經(jīng)常會(huì)打交道的區(qū)域,你在執(zhí)行 commit 之后,本質(zhì)上就是提交到了這個(gè)區(qū)域,你可以查看你的 .git 目錄下的 refs/heads 目錄,里面存的就是我們本地的分支代碼信息。
暫存區(qū)
:這個(gè)區(qū)域就是我們每次執(zhí)行 git add 之后會(huì)存到的區(qū)域,用來(lái)與本地倉(cāng)庫(kù)之間做一個(gè)緩存,同時(shí)也是 Git 底層設(shè)計(jì)上來(lái)說(shuō)也算是比較重要的一個(gè)區(qū)域,它能幫助 Git 在做 diff 的時(shí)候提高查找性能。
工作區(qū)
:這個(gè)一般就是我們寫(xiě)代碼的地方,比如你的 vscode 打開(kāi)的項(xiàng)目,你可以進(jìn)行代碼編輯的地方。
除此之外,還有一個(gè)特殊的區(qū)域,那就是本地的 git 儲(chǔ)存區(qū),它是用來(lái)干嘛的呢?一般來(lái)說(shuō)你可能在某些場(chǎng)景下會(huì)用到它,我們有的時(shí)候本地改了代碼,但是突然有個(gè)人過(guò)來(lái)問(wèn)你另一個(gè)分支的問(wèn)題,同時(shí)這個(gè)時(shí)候你在實(shí)現(xiàn)某個(gè)功能,實(shí)現(xiàn)一半,又不想提交到 Git 倉(cāng)庫(kù)中,那么你就可以考慮使用 git stash save "臨時(shí)存一下"
,這個(gè)時(shí)候它就會(huì)幫你存到這個(gè)儲(chǔ)存區(qū),你去其他分支做完事情回來(lái),再 git stash pop
就好了。
日常工作中,我們可能在 Git 使用上頻繁交互的流程大致會(huì)是這樣的(不同規(guī)范下會(huì)有一些區(qū)別,但是大差不大):
來(lái)了一個(gè)新需求,我們會(huì)從 master checkout 一個(gè)新的 feature 分支出來(lái)進(jìn)行開(kāi)發(fā)。
開(kāi)發(fā)完某個(gè)功能點(diǎn),我們會(huì)執(zhí)行 git add
將代碼提交到暫存區(qū)。
執(zhí)行 git commit
將代碼提交到本地倉(cāng)庫(kù)
執(zhí)行 git push
將代碼提交到遠(yuǎn)端分支
當(dāng)我們開(kāi)發(fā)完所有需求之后,可能會(huì)設(shè)立一個(gè)專門(mén)的測(cè)試分支比如名叫 dev 的分支,那么我們就把代碼合并到這個(gè)測(cè)試分支上,發(fā)布測(cè)試環(huán)境進(jìn)行測(cè)試。
測(cè)試完畢之后,我們就需要合代碼了,這個(gè)時(shí)候,我們可以發(fā)起一個(gè) merge request,將我們的代碼走 CR 流程合并到 master 分支。
在提交 MR 的過(guò)程中,我們一般需要先自己預(yù)先將 master 分支的代碼合并到當(dāng)前需要被合并的分支,提交并解決沖突。
以上流程大致概括了一般常規(guī)的 Git flow 流程,不同的公司可能會(huì)設(shè)計(jì)自己的規(guī)范,這里就不過(guò)多指示了。
git stash
git clone
git init
git remote
git branch
git checkout
git add
git commit
git rm
git push
git pull
git fetch
git merge
git log
git reset
git reflog
git revert
git cherry-pick
git tag
git rebase
乍一看,眼花繚亂,當(dāng)場(chǎng)決定放棄,還是用可視化工具吧。莫慌,且讓筆者為你娓娓道來(lái)。
一般來(lái)說(shuō),我們本地如果想要使用 Git 管理一些資源文件,首先我們需要有一個(gè)倉(cāng)庫(kù)才行。常用的方式莫過(guò)于,第一去 Gitlab / Github 先創(chuàng)建一個(gè)倉(cāng)庫(kù),然后再拉到本地,那這個(gè)時(shí)候我們就可以用到我們的 clone 命令了。
上面也有初步介紹這個(gè)命令的用法,就是用來(lái)臨時(shí)存一下不想被提交的代碼變更的,常用命令如下:
git stash save 'xxx'
: 儲(chǔ)存變更
git stash list
: 查看儲(chǔ)存區(qū)所有提交列表
git stash pop
: 彈出并應(yīng)用最近的一次儲(chǔ)存區(qū)的代碼提交
git stash drop stash@{n}
: 刪除某次儲(chǔ)存記錄
git stash clear
: 清楚所有 stash 信息
它的數(shù)據(jù)將被存在你倉(cāng)庫(kù) .git 文件下的 refs/stash 里。
最基礎(chǔ)也是最常用的用法莫過(guò)于直接使用
git clone xxx.git
這樣就能輕松把一個(gè)倉(cāng)庫(kù)代碼拉到本地了,但僅僅知道這一點(diǎn)似乎還不太夠。一般我們直接 clone 下來(lái)不帶參數(shù)的話,它會(huì)默認(rèn)停留在 master 分支,有的時(shí)候我們依舊需要一些其他訴求,比如怎么拉到本地之后自動(dòng)切到指定分支呢?
git clone xxx.git -b branch2
有了倉(cāng)庫(kù)之后,我們總不能一直在 master 分支搞事吧,一般是不是都需要開(kāi)個(gè)新分支改代碼,再最后完事了再合到 master,那就需要用到下面介紹 git branch 命令了,不過(guò)呢,在講到具體的分支操作之前呢,筆者還是要先補(bǔ)一下有關(guān)于本地倉(cāng)庫(kù)的初始化的流程。
除了我們從遠(yuǎn)端建倉(cāng)庫(kù),有的時(shí)候我們自己本地也是可以自己初始化一個(gè) Git 倉(cāng)庫(kù)來(lái)操作的,這個(gè)時(shí)候我們就直接使用 git init 就能輕松為當(dāng)前目錄創(chuàng)建一個(gè) git 倉(cāng)庫(kù),也就能開(kāi)始對(duì)當(dāng)前目錄的改動(dòng)納入版本管理庫(kù)了。
不過(guò)本地 init 的倉(cāng)庫(kù)沒(méi)法和遠(yuǎn)端進(jìn)行交互,所以我們還是需要去 github/gitlab 創(chuàng)建一個(gè)遠(yuǎn)端倉(cāng)庫(kù),然后關(guān)聯(lián)一下,也就是 git remote
命令了。
用于和遠(yuǎn)程倉(cāng)庫(kù)進(jìn)行關(guān)系綁定處理等等操作。
git remote add
: 添加一個(gè)遠(yuǎn)程版本庫(kù)關(guān)聯(lián)
git remote rm
: 刪除某個(gè)遠(yuǎn)程版本庫(kù)關(guān)聯(lián)
比如我們本地有個(gè)初始化好的倉(cāng)庫(kù),同時(shí)還有一個(gè)創(chuàng)建好的遠(yuǎn)程空倉(cāng)庫(kù),那么我們就可以執(zhí)行一下操作讓他們關(guān)聯(lián)起來(lái):
git remote add origin xxx.git
先添加到本地倉(cāng)庫(kù)
git push -u origin master
:表示把當(dāng)前倉(cāng)庫(kù)的 master 分支和遠(yuǎn)端倉(cāng)庫(kù)的 master 分支關(guān)聯(lián)起來(lái),后面我們執(zhí)行 push 或者 pull 都可以非常方便的進(jìn)行操作了。
在拿到一個(gè)項(xiàng)目之后,你首先還是應(yīng)該看一下當(dāng)前倉(cāng)庫(kù)現(xiàn)在有哪些分支,不要待會(huì)創(chuàng)建新分支發(fā)現(xiàn)名字重復(fù)之類的問(wèn)題,那這個(gè)時(shí)候我們就可以使用 git branch
來(lái)查看一下相關(guān)的分支了。
git branch
:查看本地所有分支信息
git branch -r
:查看遠(yuǎn)程倉(cāng)庫(kù)所有分支
git branch -a
:查看本地和遠(yuǎn)程倉(cāng)庫(kù)所有分支
一般來(lái)說(shuō)如果分支太多的話,還是建議使用可視化工具來(lái)查看分支信息,比如 vscode 或者 source tree 等軟件等等。
當(dāng)然 IDEA 也是可以的。
如果我們想以當(dāng)前分支為基準(zhǔn),創(chuàng)建一個(gè)新的分支并切換過(guò)去,可以使用如下命令。
創(chuàng)建并切換到指定新分支:git checkout -b branch2
我們?cè)谀硞€(gè)分支更改了代碼之后,想要把它提交一下,那么你第一步要做的就是,執(zhí)行 git add
git add [file1] [file2]
: 添加一個(gè)或多個(gè)文件到暫存區(qū)
一般我們平時(shí)在使用的時(shí)候,用的比較多的應(yīng)該還是:
git add .
:把當(dāng)前目錄下得所有文件改動(dòng)都添加到暫存區(qū)
git add -A
:把當(dāng)前倉(cāng)庫(kù)內(nèi)所有文件改動(dòng)都添加到暫存區(qū)
對(duì)筆者來(lái)說(shuō),用的最多的還是這個(gè) git add -A 命令,因?yàn)榇蠖鄶?shù)情況,我們都應(yīng)該把所有變更都加到暫存區(qū)里,如果沒(méi)有,那大概率是忘了。
文件添加到暫存區(qū)之后,我們就可以執(zhí)行下一步操作了。
git commit [file1] ... -m [message]
:將暫存區(qū)的內(nèi)容提交到本地 git 版本倉(cāng)庫(kù)中
-m 表示的是當(dāng)前提交的信息
-a 對(duì)于已經(jīng)被納入 git 管理的文件(該文件你之前提交過(guò) commit),那么這個(gè)命令就相當(dāng)于幫你執(zhí)行了上述 git add -A
,你就不用再 add 一下了;對(duì)于未被 git 管理過(guò)的(也就是新增的文件),那么還是需要你先執(zhí)行一下 git add -A
,才能正確被 commit 到本地 git 庫(kù)。
通常情況下,我們用的比較多得應(yīng)該是 git commit -m 'feat: do something'
,設(shè)置當(dāng)前提交的信息。當(dāng)然,如果你沒(méi)有強(qiáng)訴求需要 git add
和 git commit
一定要分開(kāi),那你大可選擇 git commit -am
,方便又快捷。
這個(gè)其實(shí)也挺有用的,比如我們項(xiàng)目中有個(gè)文件叫 .env,這個(gè)文件是一個(gè)私有的,不能被提交到遠(yuǎn)程的,但是我們不小心提交到了本地倉(cāng)庫(kù)中,這個(gè)時(shí)候我們把這個(gè)文件添加到 .gitignore 文件中,表示需要被 git 忽略提交,但是由于我們已經(jīng)提交到本地倉(cāng)庫(kù)了,所以如果不先從 git 倉(cāng)庫(kù)刪除是沒(méi)用的。
如果直接右鍵刪除,那么這個(gè)文件的記錄還是會(huì)被保存到遠(yuǎn)端倉(cāng)庫(kù),別人還是能看得到你這個(gè)信息,所以我們需要先從 git 倉(cāng)庫(kù)中刪掉這個(gè)文件才行。
git rm .env
:執(zhí)行完這個(gè)命令就表示 .env 文件從 git 倉(cāng)庫(kù)中刪除了,配合 .gitignore 就能保證以后所有的 .env 文件變更都不用擔(dān)心被提交到遠(yuǎn)程倉(cāng)庫(kù)。
git rm -r dist
:如果我們要?jiǎng)h除的是一個(gè)目錄,那么加上 -r 參數(shù)就好了。
接下來(lái)我們想要把剛創(chuàng)建好得分支推送到遠(yuǎn)端,一般來(lái)說(shuō)我們可能會(huì)需要用到 git push,但我們這是個(gè)新分支,根本沒(méi)和遠(yuǎn)端倉(cāng)庫(kù)建立任何聯(lián)系,那么我們就需要加點(diǎn)參數(shù),讓他們關(guān)聯(lián)上:
推送分支并建立關(guān)聯(lián)關(guān)系:git push --set-upstream origin branch2
完事之后我們可以再去遠(yuǎn)程倉(cāng)庫(kù)看一眼就會(huì)發(fā)現(xiàn)我們創(chuàng)建的新分支已經(jīng)推上去了。接下來(lái)可能會(huì)有小伙伴要問(wèn)了,那如果遠(yuǎn)端倉(cāng)庫(kù)已經(jīng)有了這個(gè)分支名咋整?
這里就分兩種:
一種就是你本地的代碼和遠(yuǎn)端代碼沒(méi)有沖突的情況下,并且你本地有新增提交,那么你可以仍然執(zhí)行上述命令,這樣就會(huì)直接將當(dāng)前本地分支合遠(yuǎn)程分支關(guān)聯(lián)上,同時(shí)把你的改動(dòng)提交上去。
另一種就是本地分支和遠(yuǎn)端分支存在沖突,這個(gè)時(shí)候你執(zhí)行上述命令就會(huì)出現(xiàn)提示沖突,那么接下來(lái)就需要你先把遠(yuǎn)端當(dāng)前分支的代碼拉下來(lái),解決一下沖突了,就需要用到 git pull 命令了。
通常情況下,如果當(dāng)前分支已經(jīng)和遠(yuǎn)端分支建立了聯(lián)系,那么我們想要合并一下遠(yuǎn)端分支,只需要執(zhí)行 git pull
就好了,不用帶其他參數(shù),但如果和上面提到的 git push 時(shí)產(chǎn)生了沖突,還沒(méi)有建立聯(lián)系的時(shí)候,我們就需要指定需要拉取哪個(gè)分支的代碼下來(lái)進(jìn)行合并了。
拉取指定遠(yuǎn)端分支合并到本地當(dāng)前分支:git pull origin branch2
這里的 origin 是我們對(duì)遠(yuǎn)端倉(cāng)庫(kù)的命名,想改也是可以的,不過(guò)一般都是用的 origin。
回到上面提到的沖突問(wèn)題,我們可以直接使用 git pull 然后指定合并當(dāng)前本地分支想要建立聯(lián)系的遠(yuǎn)程分支,然后本地解決一下沖突,然后提交一下改動(dòng),再執(zhí)行 git push --set-upstream origin branch2
命令就大功告成了。
了解完上面描述的 git pull
,命令之后,其實(shí)這個(gè)命令也很好理解了,特定時(shí)候,可能我們只是想把遠(yuǎn)端倉(cāng)庫(kù)對(duì)應(yīng)分支的變更拉到本地而已,并不想自動(dòng)合并到我的工作區(qū)(你當(dāng)前正在進(jìn)行代碼變更的工作區(qū)),等晚些時(shí)候我寫(xiě)完了某部分的代碼之后再考慮合并,那么你就可以先使用 git fetch
。
fetch 完畢之后,我提交了自己當(dāng)前工作去的變更到本地倉(cāng)庫(kù),然后想合并一下遠(yuǎn)端分支的更改,這個(gè)時(shí)候執(zhí)行一下 git merge origin/[當(dāng)前分支名]
(默認(rèn)一般是用 origin 表示遠(yuǎn)端的分支前綴)即可。
合并指定分支代碼到當(dāng)前分支。一般來(lái)說(shuō),我們用的比較多的場(chǎng)景可能是,遠(yuǎn)端倉(cāng)庫(kù) master 分支有變更了,同時(shí)這個(gè)時(shí)候我們準(zhǔn)備提 MR 了,那么就需要先合一下 master 的代碼,有沖突就解決下沖突,那這個(gè)時(shí)候我們可以做以下操作:
切到 master 分支,git pull 拉一下最新代碼
切回開(kāi)發(fā)分支,執(zhí)行 git merge master 合并一下 master 代碼
同理,上面介紹的 git merge origin/xxx 也是一樣的用法。
顧名思義,就是日志的意思,執(zhí)行這個(gè)命令之后,我們能看到當(dāng)前分支的提交記錄信息,比如 commitId 和提交的時(shí)間描述等等,大概長(zhǎng)下面這樣:
commit e55c4d273141edff401cbc6642fe21e14681c258 (HEAD -> branch2, origin/branch2) Author: 陌小路 <44311619+STDSuperman@users.noreply.github.com> Date: Mon Aug 1 23:16:11 2022 +0800 Initial commit
這個(gè)時(shí)候可能有讀者會(huì)問(wèn)了,這個(gè)都用來(lái)干啥的,簡(jiǎn)單的用法呢就是看看有誰(shuí)提交了啥,還有更重要的用法呢就是進(jìn)行代碼版本的回滾,或者其他有意思的操作,且聽(tīng)筆者為你微微道來(lái)。
git reset [--soft | --mixed | --hard] [HEAD]
HEAD 表示當(dāng)前版本
HEAD^ 上一個(gè)版本
HEAD^^ 上上一個(gè)版本
HEAD^^^ 上上上一個(gè)版本
HEAD~n 回撤 n 個(gè)版本,這種也是更加方便的
以下解析均基于后接參數(shù)為 HEAD^,也就是git reset HEAD^
。
--soft
: 重置你最新一次提交版本,不會(huì)修改你的暫存區(qū)和工作區(qū)。
--mixed
: 默認(rèn)參數(shù),用于重置暫存區(qū)的文件與上一次的提交(commit)保持一致,工作區(qū)文件內(nèi)容保持不變。
--hard
: 重置所有提交到上一個(gè)版本,并且修改你的工作區(qū),會(huì)徹底回到上一個(gè)提交版本,在代碼中看不到當(dāng)前提交的代碼,也就是你的工作區(qū)改動(dòng)也被干掉了。
說(shuō)了半天似乎不是很好理解,我們舉個(gè)栗子理解下:
比如:
我改動(dòng)了我的 README 文件,在我們的工作區(qū)就產(chǎn)生了一次改動(dòng),但是這個(gè)時(shí)候還沒(méi)有提交到暫存區(qū),在 vscode 里會(huì)顯示為工作區(qū)修改的標(biāo)記
接著我們執(zhí)行 git add
,這個(gè)時(shí)候你查看暫存區(qū),會(huì)發(fā)現(xiàn)這次改動(dòng)被提交進(jìn)去了,同時(shí)被 vscode 標(biāo)記為已被提交至?xí)捍鎱^(qū)
然后再執(zhí)行 git commit
,這個(gè)時(shí)候就完成了一次提交
接下來(lái)我們想撤回這次提交,以上三種參數(shù)所體現(xiàn)的表現(xiàn)會(huì)是這樣的:
--soft
:我們對(duì) README 的更改狀態(tài)現(xiàn)在變成已被提交至?xí)捍鎱^(qū),也就是上面 2 的步驟。
--mixed
: 我們對(duì) README 的更改變成還未被提交至?xí)捍鎱^(qū),也就是上面 1 的步驟。
--hard
:我們對(duì) README 的所有更改全沒(méi)了,git log 中也找不到我們對(duì) README 剛剛那次修改的痕跡。
默認(rèn)情況下我們不加參數(shù),就是 --mixed,也就是重置暫存區(qū)的文件到上一次提交的版本,文件內(nèi)容不動(dòng)。一般會(huì)在什么時(shí)候用到呢?
可能大部分情況下,比如 vscode 其實(shí)大家更習(xí)慣于使用可視化的撤銷能力,但是呢,這里我們其實(shí)也可以稍微了解下這其中的奧秘,其實(shí)也很簡(jiǎn)單:
方式一:git reset
方式二:git reset HEAD
其實(shí)一二都是一樣,如果 reset 后面不跟東西就是默認(rèn) HEAD。
當(dāng)你某個(gè)改動(dòng)提交到本地倉(cāng)庫(kù)之后,也就是 commit 之后,這個(gè)時(shí)候你想撤回來(lái),再改點(diǎn)其他的,那么就可以直接使用 git reset HEAD^
。這個(gè)時(shí)候你會(huì)驚奇的發(fā)現(xiàn),你上一版的代碼改動(dòng),全部變成了未被提交到暫存區(qū)的狀態(tài),這個(gè)時(shí)候你再改改代碼,然后再提交到暫存區(qū),然后一起再 commit 就可滿足你的需求了。
除了這種基礎(chǔ)用法,我們還可以配合其他命令操作一下。
某一天你老板跟你說(shuō),昨天新加的功能不要了,給我切回之前的版本看看效果,那么這個(gè)時(shí)候,你可能就需要將工作區(qū)的代碼回滾到上一個(gè) commit 版本了,操作也十分簡(jiǎn)單:
git log
查看上一個(gè) commit 記錄,并復(fù)制 commitId
git reset --hard commitId
直接回滾。
如果某一個(gè)你開(kāi)發(fā)需求正開(kāi)心呢,突然發(fā)現(xiàn),自己以前改的某個(gè)東西怎么不見(jiàn)了,你想起來(lái)好像是某次合并,沒(méi)注意被其他提交沖掉了,你心一想,完了,寫(xiě)了那么多,怎么辦?很簡(jiǎn)單,回到有這份代碼的那個(gè)版本就好了(前提你提交過(guò)到本地倉(cāng)庫(kù))。
假設(shè)我們有這么兩個(gè)提交記錄,我們需要下面那個(gè) 365 開(kāi)頭 commitId 的代碼:
commit e62b559633387ab3a5324ead416f09bf347d8e4a (HEAD -> master) Author: xiaohang.linDate: Sun Aug 14 18:08:56 2022 +0800 merge commit 36577ea21d79350845f104eee8ae3e740f19e038 (origin/master, origin/HEAD) Author: 陌小路 <44311619+STDSuperman@users.noreply.github.com> Date: Sun Aug 14 15:57:34 2022 +0800 Update README.md
搶救第一步 git log
找到有你這個(gè)代碼的那個(gè) commitId(也就是 36577ea21d79350845f104eee8ae3e740f19e038)
搶救第二步 git reset --hard commitId
第三步:Ctrl + c 你的目標(biāo)代碼
這個(gè)時(shí)候你想把復(fù)制好的代碼寫(xiě)回去,該怎么辦呢,你可能會(huì)再 git log 看一下我們 reset 之前的 commitId,你會(huì)發(fā)現(xiàn),完了,之前的 commitId 都沒(méi)了,只有這個(gè) 365 了。
commit 36577ea21d79350845f104eee8ae3e740f19e038 (origin/master, origin/HEAD) Author: 陌小路 <44311619+STDSuperman@users.noreply.github.com> Date: Sun Aug 14 15:57:34 2022 +0800 Update README.md
不要慌,請(qǐng)記住一句話,只要你不刪你本地的 .git 倉(cāng)庫(kù),你都能找回以前所有的提交。
git log 看不到的話,我們就可以祭出我們的絕招了:git reflog
36577ea (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to 36577ea21d79350845f104eee8ae3e740f19e038 e62b559 HEAD@{1}: reset: moving to e62b559633387ab3a5324ead416f09bf347d8e4a
這里我們可以看到兩行記錄,一個(gè)是我們執(zhí)行 reset 到 365 的記錄,另一條不知道是啥,不重要,我們想回到我們剛剛 reset 之前的狀態(tài)也很簡(jiǎn)單,直接復(fù)制它上一次的變動(dòng)也就是這個(gè) e62b559,然后執(zhí)行 git reset --hard e62b559
,然后你會(huì)驚奇的發(fā)現(xiàn),你之前的代碼又回來(lái)了。
接下來(lái)把你以前版本的代碼,再 Ctrl + v 放進(jìn)來(lái)就完成了。
介紹:用來(lái)查看你的所有操作記錄。
既然 git log 看不到我之前 commitId 了,那么就回到 reset 之前的狀態(tài)吧!
當(dāng)然了,如果是針對(duì) master 的操作,為了安全起見(jiàn),一般還是建議使用 revert 命令,他也能實(shí)現(xiàn)和 reset 一樣的效果,只不過(guò)區(qū)別來(lái)說(shuō),reset 是向后的,而 revert 是向前的,怎么理解呢?簡(jiǎn)單來(lái)說(shuō),把這個(gè)過(guò)程當(dāng)做一次時(shí)光穿梭,reset 表示你犯了一個(gè)錯(cuò),他會(huì)帶你回到?jīng)]有犯錯(cuò)之前,而 revert 會(huì)給你一個(gè)彌補(bǔ)方案,采用這個(gè)方案之后讓你得到的結(jié)果和沒(méi)犯錯(cuò)之前一樣。
舉個(gè)栗子: 假設(shè)你改了 README 的描述,新增了一行文字,提交上去了,過(guò)一會(huì)你覺(jué)得這個(gè)寫(xiě)了有問(wèn)題,想要撤銷一下,但是又不想之前那個(gè)提交消失在當(dāng)前歷史當(dāng)中,那么你就可以選擇使用 git revert [commitId],那么它就會(huì)產(chǎn)生一次新的提交,提交的內(nèi)容就是幫你刪掉你上面新增的內(nèi)容,相當(dāng)于是一個(gè)互補(bǔ)的操作。
PS D:\Code\other\git-practice> git revert 3b18a20ad39eea5264b52f0878efcb4f836931ce On branch branch3 Your branch is ahead of 'origin/branch3' by 1 commit. (use "git push" to publish your local commits)
這個(gè)時(shí)候,它會(huì)提示你可以把新的改動(dòng) push 上去了。
其實(shí)你如果在 gitlab 進(jìn)行 mr 之后,想要回滾這個(gè) mr,一般它會(huì)給你一個(gè) revert 的按鈕選項(xiàng),讓你進(jìn)行更安全的回滾操作。
其實(shí)對(duì)于我們工作中大部分場(chǎng)景下應(yīng)該用不到這個(gè)功能,但是呢有的時(shí)候這個(gè)命令又能挽救你于水火之間,那就是當(dāng)某個(gè)倒霉蛋忘記切分支,然后在 master 分支上改了代碼,并且提交到了本地倉(cāng)庫(kù)中,這個(gè)時(shí)候使用git cherry-pick
簡(jiǎn)直就是神器了。
git cherry-pick
:將執(zhí)行分支的指定提交合并到當(dāng)前分支。
一聽(tīng)介紹就來(lái)精神了,雀氏有點(diǎn)東西,比如我在 master 分支提交了某個(gè)需求的代碼,同時(shí)還沒(méi)提交到遠(yuǎn)程分支,那么你就可以先 git log
查看一下當(dāng)前的提交,找到 master 分支正常提交之后的所有 commitId,然后復(fù)制出來(lái),然后再切到你建好的開(kāi)發(fā)分支,接著執(zhí)行 git cherry-pick master commitId1 commitId2 commitId4
。
完事之后記得清理一下作案現(xiàn)場(chǎng),把你的 master 分支代碼恢復(fù)到正常的提交上去。
顧名思義,也就是打標(biāo)簽的意思。一般可能會(huì)在你發(fā)布了某個(gè)版本,需要給當(dāng)前版本打個(gè)標(biāo)簽,你可以翻閱 vite 的官方 git 倉(cāng)庫(kù),查看它的 tag 信息,它這里就標(biāo)注了各個(gè)版本發(fā)布時(shí)候的 tag 標(biāo)簽。
它有兩種標(biāo)簽形式,一種是輕量標(biāo)簽,另一種是附注標(biāo)簽。
創(chuàng)建方式:git tag v1.0.0
它有點(diǎn)像是對(duì)某個(gè)提交的引用,從表現(xiàn)上來(lái)看,它又有點(diǎn)像基于當(dāng)前分支提交給你創(chuàng)建了一個(gè)不可變的分支,它是支持你直接 checkout 到這個(gè)分支上去,但是它和普通分支還是有著本質(zhì)的區(qū)別的,如果你切換到了這個(gè) tag "分支",你去修改代碼同時(shí)產(chǎn)生了一次提交,亦或者是 reset 版本,這對(duì)于該 tag 本身不會(huì)有任何影響,而是為你生成了一個(gè)獨(dú)立的提交,但是卻在你的分支歷史中是找不到的,你只能通過(guò) commitId 來(lái)切換到本次提交。
那如果你從其他分支通過(guò) commitId 切換到這個(gè)改動(dòng)上,它會(huì)提示你以下內(nèi)容:
Note: switching to 'be276009'. changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -cOr undo this operation with: git switch -
大致意思就是你可以選擇丟棄或者保留當(dāng)前更改,如果需要保留的話直接使用下面的 git switch
命令創(chuàng)建一個(gè)新分支即可。
創(chuàng)建方式:git tag -a v1.0.1 -m "發(fā)布正式版 1.0.1"
引用官方文檔的描述:
而附注標(biāo)簽是存儲(chǔ)在 Git 數(shù)據(jù)庫(kù)中的一個(gè)完整對(duì)象, 它們是可以被校驗(yàn)的,其中包含打標(biāo)簽者的名字、電子郵件地址、日期時(shí)間, 此外還有一個(gè)標(biāo)簽信息,并且可以使用 GNU Privacy Guard (GPG)簽名并驗(yàn)證。
從概念上看,輕量標(biāo)簽更像是一個(gè)臨時(shí)的標(biāo)簽,而附注標(biāo)簽更加正式一點(diǎn),能夠保留更多的信息。它創(chuàng)建的方式和輕量標(biāo)簽區(qū)別主要是 -a 和 -m 參數(shù),如果你的 -m 參數(shù)不傳,那么編輯器會(huì)讓你手動(dòng)填寫(xiě)。
打完標(biāo)簽之后,我們可以使用 git show
命令來(lái)看看這兩種標(biāo)簽最終體現(xiàn)的信息有哪些。
commit dcbd335be87f51eaa0cc1852400e64e9f46e84d8 (HEAD -> test-branch2, tag: v1.0.2, tag: v1.0.1) Author: STDSuperman <2750556766@qq.com> Date: Tue Aug 16 22:54:36 2022 +0800 xx diff --git a/README.md b/README.md index 715766a..b4cdea6 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@-# git-practice\ No newline at end of file +# git-practice + +test tag
tag v1.0.1 Tagger: STDSuperman <2750556766@qq.com> Date: Tue Aug 16 22:58:27 2022 +0800 發(fā)布正式版 1.0.0 commit dcbd335be87f51eaa0cc1852400e64e9f46e84d8 (HEAD -> test-branch2, tag: v1.0.1) Author: STDSuperman <2750556766@qq.com> Date: Tue Aug 16 22:54:36 2022 +0800 xx diff --git a/README.md b/README.md index 715766a..b4cdea6 100644 --- a/README.md +++ b/README.md
從信息豐富度上來(lái)說(shuō),附注標(biāo)簽?zāi)鼙A舻男畔?huì)更多。
git push origin tagName
$> git push origin v1.0.1Enumerating objects: 6, done. Counting objects: 100% (6/6), done. Delta compression using up to 12 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 448 bytes | 448.00 KiB/s, done. Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 To github.com:STDSuperman/git-practice.git * [new tag] v1.0.1 -> v1.0.1
當(dāng)然,附注標(biāo)簽和輕量標(biāo)簽都是可以被推送到遠(yuǎn)端的。
查看標(biāo)簽:git tag
篩選標(biāo)簽:git tag -l v1.0.1
刪除標(biāo)簽:git tag -d v1.0.1
刪除遠(yuǎn)程標(biāo)簽:git push origin --delete v1.0.2
另一種刪除遠(yuǎn)程方式(表示將“:”前面空值替換到遠(yuǎn)程,也不失為一種方式):git push origin :refs/tags/v1.0.1
讀到這里,這篇“Git使用方法有哪些”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。