真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Git使用方法有哪些

本文小編為大家詳細(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)用合理。

Git 體系介紹

Git 區(qū)域理解

  • 遠(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)行代碼編輯的地方。

stash

除此之外,還有一個(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 簡(jiǎn)單工作流理解

日常工作中,我們可能在 Git 使用上頻繁交互的流程大致會(huì)是這樣的(不同規(guī)范下會(huì)有一些區(qū)別,但是大差不大):

  1. 來(lái)了一個(gè)新需求,我們會(huì)從 master checkout 一個(gè)新的 feature 分支出來(lái)進(jìn)行開(kāi)發(fā)。

  2. 開(kāi)發(fā)完某個(gè)功能點(diǎn),我們會(huì)執(zhí)行 git add 將代碼提交到暫存區(qū)。

  3. 執(zhí)行 git commit 將代碼提交到本地倉(cāng)庫(kù)

  4. 執(zhí)行 git push 將代碼提交到遠(yuǎn)端分支

  5. 當(dāng)我們開(kāi)發(fā)完所有需求之后,可能會(huì)設(shè)立一個(gè)專門(mén)的測(cè)試分支比如名叫 dev 的分支,那么我們就把代碼合并到這個(gè)測(cè)試分支上,發(fā)布測(cè)試環(huán)境進(jìn)行測(cè)試。

  6. 測(cè)試完畢之后,我們就需要合代碼了,這個(gè)時(shí)候,我們可以發(fā)起一個(gè) merge request,將我們的代碼走 CR 流程合并到 master 分支。

  7. 在提交 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 命令了。

git stash(臨時(shí)插進(jìn)來(lái)快速介紹一下)

上面也有初步介紹這個(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 里。

git clone

最基礎(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ù)的初始化的流程。

git init

除了我們從遠(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 命令了。

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):

  1. git remote add origin xxx.git先添加到本地倉(cāng)庫(kù)

  2. 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)行操作了。

git branch

在拿到一個(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 也是可以的。

git checkout

如果我們想以當(dāng)前分支為基準(zhǔn),創(chuàng)建一個(gè)新的分支并切換過(guò)去,可以使用如下命令。

  • 創(chuàng)建并切換到指定新分支:git checkout -b branch2

git add

我們?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)有,那大概率是忘了。

git commit

文件添加到暫存區(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,方便又快捷。

git rm

這個(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ù)就好了。

git push

接下來(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è)分支名咋整?

這里就分兩種:

  1. 一種就是你本地的代碼和遠(yuǎn)端代碼沒(méi)有沖突的情況下,并且你本地有新增提交,那么你可以仍然執(zhí)行上述命令,這樣就會(huì)直接將當(dāng)前本地分支合遠(yuǎn)程分支關(guān)聯(lián)上,同時(shí)把你的改動(dòng)提交上去。

  2. 另一種就是本地分支和遠(yuǎn)端分支存在沖突,這個(gè)時(shí)候你執(zhí)行上述命令就會(huì)出現(xiàn)提示沖突,那么接下來(lái)就需要你先把遠(yuǎn)端當(dāng)前分支的代碼拉下來(lái),解決一下沖突了,就需要用到 git pull 命令了。

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 fetch

了解完上面描述的 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)端的分支前綴)即可。

git merge

合并指定分支代碼到當(dāng)前分支。一般來(lái)說(shuō),我們用的比較多的場(chǎng)景可能是,遠(yuǎn)端倉(cāng)庫(kù) master 分支有變更了,同時(shí)這個(gè)時(shí)候我們準(zhǔn)備提 MR 了,那么就需要先合一下 master 的代碼,有沖突就解決下沖突,那這個(gè)時(shí)候我們可以做以下操作:

  1. 切到 master 分支,git pull 拉一下最新代碼

  2. 切回開(kāi)發(fā)分支,執(zhí)行 git merge master 合并一下 master 代碼

同理,上面介紹的 git merge origin/xxx 也是一樣的用法。

git log

顧名思義,就是日志的意思,執(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

  • git reset [--soft | --mixed | --hard] [HEAD]

關(guān)于 HEAD:
  • HEAD 表示當(dāng)前版本

  • HEAD^ 上一個(gè)版本

  • HEAD^^ 上上一個(gè)版本

  • HEAD^^^ 上上上一個(gè)版本

  • HEAD~n 回撤 n 個(gè)版本,這種也是更加方便的

參數(shù)解析

以下解析均基于后接參數(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è)栗子理解下:

比如:

  1. 我改動(dòng)了我的 README 文件,在我們的工作區(qū)就產(chǎn)生了一次改動(dòng),但是這個(gè)時(shí)候還沒(méi)有提交到暫存區(qū),在 vscode 里會(huì)顯示為工作區(qū)修改的標(biāo)記

  2. 接著我們執(zhí)行 git add,這個(gè)時(shí)候你查看暫存區(qū),會(huì)發(fā)現(xiàn)這次改動(dòng)被提交進(jìn)去了,同時(shí)被 vscode 標(biāo)記為已被提交至?xí)捍鎱^(qū)

  3. 然后再執(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í)候用到呢?

場(chǎng)景一(撤銷 git add)

可能大部分情況下,比如 vscode 其實(shí)大家更習(xí)慣于使用可視化的撤銷能力,但是呢,這里我們其實(shí)也可以稍微了解下這其中的奧秘,其實(shí)也很簡(jiǎn)單:

  • 方式一:git reset

  • 方式二:git reset HEAD

其實(shí)一二都是一樣,如果 reset 后面不跟東西就是默認(rèn) HEAD。

場(chǎng)景二 (撤銷 git commit)

當(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ǔ)用法,我們還可以配合其他命令操作一下。

場(chǎng)景三

某一天你老板跟你說(shuō),昨天新加的功能不要了,給我切回之前的版本看看效果,那么這個(gè)時(shí)候,你可能就需要將工作區(qū)的代碼回滾到上一個(gè) commit 版本了,操作也十分簡(jiǎn)單:

  • git log 查看上一個(gè) commit 記錄,并復(fù)制 commitId

  • git reset --hard commitId 直接回滾。

場(chǎng)景四

如果某一個(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.lin 
Date:   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
  1. 搶救第一步 git log 找到有你這個(gè)代碼的那個(gè) commitId(也就是 36577ea21d79350845f104eee8ae3e740f19e038)

  2. 搶救第二步 git reset --hard commitId

  3. 第三步: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)就完成了。

git reflog

介紹:用來(lái)查看你的所有操作記錄。

既然 git log 看不到我之前 commitId 了,那么就回到 reset 之前的狀態(tài)吧!

git revert

當(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)行更安全的回滾操作。

git cherry-pick

其實(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ù)到正常的提交上去。

git tag

顧名思義,也就是打標(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)簽。

輕量標(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 -c 

Or undo this operation with:

  git switch -

大致意思就是你可以選擇丟棄或者保留當(dāng)前更改,如果需要保留的話直接使用下面的 git switch 命令創(chuàng)建一個(gè)新分支即可。

附注標(biāo)簽
  • 創(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ě)。

對(duì)比標(biāo)簽信息

打完標(biāo)簽之后,我們可以使用 git show 命令來(lái)看看這兩種標(biāo)簽最終體現(xiàn)的信息有哪些。

輕量標(biāo)簽
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
附注標(biāo)簽
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ì)更多。

推送標(biāo)簽
  • 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è)資訊頻道。


本文題目:Git使用方法有哪些
文章地址:http://weahome.cn/article/jsggjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部