溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

git stash 命令的應(yīng)用

發(fā)布時(shí)間:2021-07-10 11:11:44 來源:億速云 閱讀:198 作者:chen 欄目:編程語言

這篇文章主要介紹“git stash 命令的應(yīng)用”,在日常操作中,相信很多人在git stash 命令的應(yīng)用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”git stash 命令的應(yīng)用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!


版本控制是軟件開發(fā)人員日常生活中不可分割的一部分。很難想象有哪個(gè)團(tuán)隊(duì)在開發(fā)軟件時(shí)不使用版本控制工具。同樣也很難想象有哪個(gè)開發(fā)者沒有使用過(或沒有聽說過)Git。在  2018 年 Stackoverflow 開發(fā)者調(diào)查中,74298 名參與者中有 87.2% 的人 使用 Git 進(jìn)行版本控制。

Linus Torvalds 在 2005 年創(chuàng)建了 Git 用于開發(fā) Linux 內(nèi)核。本文將介紹 git stash 命令,并探討一些有用的暫存變更的選項(xiàng)。本文假定你對 Git 概念 有基本的了解,并對工作樹、暫存區(qū)和相關(guān)命令有良好的理解。

為什么 git stash 很重要?

首先要明白為什么在 Git 中暫存變更很重要。假設(shè) Git 沒有暫存變更的命令。當(dāng)你正在一個(gè)有兩個(gè)分支(A 和  B)的倉庫上工作時(shí),這兩個(gè)分支已經(jīng)分叉了一段時(shí)間,并且有不同的頭。當(dāng)你正在處理 A 分支的一些文件時(shí),你的團(tuán)隊(duì)要求你修復(fù) B  分支的一個(gè)錯(cuò)誤。你迅速將你的修改保存到 A 分支(但沒有提交),并嘗試用 git checkout B 來簽出 B 分支。Git 會(huì)立即中止了這個(gè)操作,并拋出錯(cuò)誤:“你對以下文件的本地修改會(huì)被該簽出覆蓋……請?jiān)谇袚Q分支之前提交你的修改或?qū)⑺鼈儠捍嫫饋?。?/p>

在這種情況下,有幾種方法可以啟用分支切換:

  • 在分支 A 中創(chuàng)建一個(gè)提交,提交并推送你的修改,以修復(fù) B 中的錯(cuò)誤,然后再次簽出 A,并運(yùn)行 git reset HEAD^ 來恢復(fù)你的修改。

  • 手動(dòng)保留不被 Git 跟蹤的文件中的改動(dòng)。

第二種方法是個(gè)餿主意。第一種方法雖然看起來很傳統(tǒng),但卻不太靈活,因?yàn)楸4嫖赐瓿晒ぷ鞯男薷臅?huì)被當(dāng)作一個(gè)檢查點(diǎn),而不是一個(gè)仍在進(jìn)行中的補(bǔ)丁。這正是設(shè)計(jì) git stash 的場景。

git stash 將未提交的改動(dòng)保存在本地,讓你可以進(jìn)行修改、切換分支以及其他 Git 操作。然后,當(dāng)你需要的時(shí)候,你可以重新應(yīng)用這些存儲(chǔ)的改動(dòng)。暫存是本地范圍的,不會(huì)被 git push 推送到遠(yuǎn)程。

如何使用 git stash

下面是使用 git stash 時(shí)要遵循的順序:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 將修改保存到分支 A。

  3. 運(yùn)行 git stash

  4. 簽出分支 B。

  5. 修正 B 分支的錯(cuò)誤。

  6. 提交并(可選)推送到遠(yuǎn)程。

  7. 查看分支 A

  8. 運(yùn)行 git stash pop 來取回你的暫存的改動(dòng)。

git stash 將你對工作目錄的修改存儲(chǔ)在本地(在你的項(xiàng)目的 .git 目錄內(nèi),準(zhǔn)確的說是 /.git/refs/stash),并允許你在需要時(shí)檢索這些修改。當(dāng)你需要在不同的上下文之間切換時(shí),它很方便。它允許你保存以后可能需要的更改,是讓你的工作目錄干凈同時(shí)保持更改完整的最快方法。

如何創(chuàng)建一個(gè)暫存

暫存你的變化的最簡單的命令是 git stash

$ git stashSaved working directory and index state WIP on master; d7435644 Feat: configure graphql endpoint

默認(rèn)情況下,git stash 存儲(chǔ)(或稱之為“暫存”)未提交的更改(已暫存和未暫存的文件),并忽略未跟蹤和忽略的文件。通常情況下,你不需要暫存未跟蹤和忽略的文件,但有時(shí)它們可能會(huì)干擾你在代碼庫中要做的其他事情。

你可以使用附加選項(xiàng)讓 git stash 來處理未跟蹤和忽略的文件:

  • git stash -u 或 git stash --includ-untracked 儲(chǔ)存未追蹤的文件。

  • git stash -a 或 git stash --all 儲(chǔ)存未跟蹤的文件和忽略的文件。

要存儲(chǔ)特定的文件,你可以使用 git stash -p 或 git stash -patch 命令:

$ git stash --patchdiff --git a/.gitignore b/.gitignoreindex 32174593..8d81be6e 100644--- a/.gitignore+++ b/.gitignore@@ -3,6 +3,7 @@ # dependencies node_modules/ /.pnp+f,fmfm .pnp.js  # testing(1/1) Stash this hunk [y,n,q,a,d,e,?]?

列出你的暫存

你可以用 git stash list 命令查看你的暫存。暫存是后進(jìn)先出(LIFO)方式保存的:

$ git stash liststash@{0}: WIP on master: d7435644 Feat: configure graphql endpoint

默認(rèn)情況下,暫存會(huì)顯示在你創(chuàng)建它的分支和提交的頂部,被標(biāo)記為 WIP。然而,當(dāng)你有多個(gè)暫存時(shí),這種有限的信息量并沒有幫助,因?yàn)楹茈y記住或單獨(dú)檢查它們的內(nèi)容。要為暫存添加描述,可以使用命令 git stash save <description>

$ git stash save "remove semi-colon from schema"Saved working directory and index state On master: remove semi-colon from schema $ git stash liststash@{0}: On master: remove semi-colon from schemastash@{1}: WIP on master: d7435644 Feat: configure graphql endpoint

檢索暫存起來的變化

你可以用 git stash apply 和 git stash pop 這兩個(gè)命令來重新應(yīng)用暫存的變更。這兩個(gè)命令都會(huì)重新應(yīng)用最新的暫存(即 stash@{0})中的改動(dòng)。apply 會(huì)重新應(yīng)用變更;而 pop 則會(huì)將暫存的變更重新應(yīng)用到工作副本中,并從暫存中刪除。如果你不需要再次重新應(yīng)用被暫存的更改,則首選 pop

你可以通過傳遞標(biāo)識(shí)符作為最后一個(gè)參數(shù)來選擇你想要彈出或應(yīng)用的儲(chǔ)藏:

$ git stash pop stash@{1}

$ git stash apply stash@{1}

清理暫存

刪除不再需要的暫存是好的習(xí)慣。你必須用以下命令手動(dòng)完成:

  • git stash clear 通過刪除所有的暫存庫來清空該列表。

  • git stash drop <stash_id> 從暫存列表中刪除一個(gè)特定的暫存。

檢查暫存的差異

命令 git stash show <stash_id> 允許你查看一個(gè)暫存的差異:

$ git stash show stash@{1}console/console-init/ui/.graphqlrc.yml        |   4 +-console/console-init/ui/generated-frontend.ts | 742 +++++++++---------console/console-init/ui/package.json          |   2 +-

要獲得更詳細(xì)的差異,需要傳遞 --patch 或 -p 標(biāo)志:

$ git stash show stash@{0} --patchdiff --git a/console/console-init/ui/package.json b/console/console-init/ui/package.jsonindex 755912b97..5b5af1bd6 100644--- a/console/console-init/ui/package.json+++ b/console/console-init/ui/package.json@@ -1,5 +1,5 @@ {- "name": "my-usepatternfly",+ "name": "my-usepatternfly-2",  "version": "0.1.0",  "private": true,  "proxy": "http://localhost:4000"diff --git a/console/console-init/ui/src/AppNavHeader.tsx b/console/console-init/ui/src/AppNavHeader.tsxindex a4764d2f3..da72b7e2b 100644--- a/console/console-init/ui/src/AppNavHeader.tsx+++ b/console/console-init/ui/src/AppNavHeader.tsx@@ -9,8 +9,8 @@ import { css } from "@patternfly/react-styles"; interface IAppNavHeaderProps extends PageHeaderProps {- toolbar?: React.ReactNode;- avatar?: React.ReactNode;+ toolbar?: React.ReactNode;+ avatar?: React.ReactNode;} export class AppNavHeader extends React.Component&lt;IAppNavHeaderProps&gt;{  render()

簽出到新的分支

你可能會(huì)遇到這樣的情況:一個(gè)分支和你的暫存中的變更有分歧,當(dāng)你試圖重新應(yīng)用暫存時(shí),會(huì)造成沖突。一個(gè)簡單的解決方法是使用 git stash branch <new_branch_name stash_id> 命令,它將根據(jù)創(chuàng)建暫存時(shí)的提交創(chuàng)建一個(gè)新分支,并將暫存中的修改彈出:

$ git stash branch test_2 stash@{0}Switched to a new branch 'test_2'On branch test_2Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: .graphqlrc.ymlmodified: generated-frontend.tsmodified: package.jsonno changes added to commit (use "git add" and/or "git commit -a")Dropped stash@{0} (fe4bf8f79175b8fbd3df3c4558249834ecb75cd1)

在不打擾暫存參考日志的情況下進(jìn)行暫存

在極少數(shù)情況下,你可能需要?jiǎng)?chuàng)建一個(gè)暫存,同時(shí)保持暫存參考日志(reflog)的完整性。這些情況可能出現(xiàn)在你需要一個(gè)腳本作為一個(gè)實(shí)現(xiàn)細(xì)節(jié)來暫存的時(shí)候。這可以通過 git stash create 命令來實(shí)現(xiàn);它創(chuàng)建了一個(gè)暫存條目,并返回它的對象名,而不將其推送到暫存參考日志中:

$ git stash create "sample stash"63a711cd3c7f8047662007490723e26ae9d4acf9

有時(shí),你可能會(huì)決定將通過 git stash create 創(chuàng)建的暫存條目推送到暫存參考日志:

$ git stash store -m "sample stash testing.." "63a711cd3c7f8047662007490723e26ae9d4acf9"$ git stash liststash @{0}: sample stash testing..

到此,關(guān)于“git stash 命令的應(yīng)用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

git
AI