偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Git 中上下文切換的 4 種方式

系統(tǒng) Linux
比較 Git 中四種切換分支的方法的優(yōu)缺點(diǎn)。所有大量使用 Git 的人都會(huì)用到某種形式的上下文切換。有時(shí)這只會(huì)給你的工作流程增加少量的開(kāi)銷,但有時(shí),這可能是一段痛苦的經(jīng)歷。

[[401434]]

比較 Git 中四種切換分支的方法的優(yōu)缺點(diǎn)。

所有大量使用 Git 的人都會(huì)用到某種形式的上下文切換。有時(shí)這只會(huì)給你的工作流程增加少量的開(kāi)銷,但有時(shí),這可能是一段痛苦的經(jīng)歷。

讓我們用以下這個(gè)例子來(lái)討論一些常見(jiàn)的上下文切換策略的優(yōu)缺點(diǎn):

假設(shè)你在一個(gè)名為 feature-X 的分支中工作。你剛剛發(fā)現(xiàn)你需要解決一個(gè)無(wú)關(guān)的問(wèn)題。這不能在 feature-X 分支中完成。你需要在一個(gè)新的分支 feature-Y 中完成這項(xiàng)工作。

方案 1:暫存 + 分支

解決此問(wèn)題最常見(jiàn)的工作流程可能如下所示:

  1. 停止分支 feature-X 上的工作
  2. git stash
  3. git checkout -b feature-Y origin/main
  4. 一頓鼓搗,解決 feature-Y 的問(wèn)題
  5. git checkout feature-X 或 git switch -
  6. git stash pop
  7. 繼續(xù)在 feature-X 中工作

優(yōu)點(diǎn): 這種方法的優(yōu)點(diǎn)在于,對(duì)于簡(jiǎn)單的更改,這是一個(gè)相當(dāng)簡(jiǎn)單的工作流程。它可以很好地工作,特別是對(duì)于小型倉(cāng)庫(kù)。

缺點(diǎn): 使用此工作流程時(shí),一次只能有一個(gè)工作區(qū)。另外,根據(jù)你的倉(cāng)庫(kù)的狀態(tài),使用暫存是一個(gè)麻煩的環(huán)節(jié)。

方案 2:WIP 提交 + 分支

這個(gè)解決方案和前一個(gè)非常相似,但是它使用 WIP(正在進(jìn)行的工作Work in Progress)提交而不是暫存。當(dāng)你準(zhǔn)備好切換回來(lái),而不是彈出暫存時(shí),git reset HEAD~1 會(huì)展開(kāi) WIP 提交,你可以自由地繼續(xù),就像之前的方案一樣,但不會(huì)觸及暫存。

  1. 停止分支 feature-X 上的工作
  2. git add -u(僅僅添加修改和刪除的文件)
  3. git commit -m "WIP"
  4. git checkout -b feature-Y origin/master
  5. 一頓鼓搗,解決 feature-Y 的問(wèn)題
  6. git checkout feature-X 或 git switch -
  7. git reset HEAD~1

優(yōu)點(diǎn): 對(duì)于簡(jiǎn)單的更改,這是一個(gè)簡(jiǎn)單的工作流,也適合于小型倉(cāng)庫(kù)。你不需要使用暫存。

缺點(diǎn): 任何時(shí)候都只能有一個(gè)工作區(qū)。此外,如果你或你的代碼審閱者不夠謹(jǐn)慎,WIP 提交可能會(huì)合并到最終產(chǎn)品。

使用此工作流時(shí),你永遠(yuǎn)不要想著將 --hard 添加到 git reset。如果你不小心這樣做了,你應(yīng)該能夠使用 git reflog 恢復(fù)提交,但是你最好完全避免這種情況發(fā)生,否則你會(huì)聽(tīng)到心碎的聲音。

方案 3:克隆一個(gè)新倉(cāng)庫(kù)

在這個(gè)解決方案中,不是創(chuàng)建新的分支,而是為每個(gè)新的功能分支創(chuàng)建存儲(chǔ)庫(kù)的新克隆。

優(yōu)點(diǎn): 你可以同時(shí)在多個(gè)工作區(qū)中工作。你不需要 git stash 或者是 WIP 提交。

缺點(diǎn): 需要考慮倉(cāng)庫(kù)的大小,因?yàn)檫@可能會(huì)占用大量磁盤空間(淺層克隆可以幫助解決這種情況,但它們可能并不總是很合適。)此外,你的倉(cāng)庫(kù)克隆將互不可知。因?yàn)樗麄儾荒芑ハ嘧粉櫍阅惚仨毷謩?dòng)追蹤你的克隆的源倉(cāng)庫(kù)。如果需要 git 鉤子,則需要為每個(gè)新克隆設(shè)置它們。

方案 4:git 工作樹(shù)

要使用此解決方案,你可能需要了解 git add worktree。如果你不熟悉 Git 中的工作樹(shù),請(qǐng)不要難過(guò)。許多人多年來(lái)都對(duì)這個(gè)概念一無(wú)所知。

什么是工作樹(shù)?

將工作樹(shù)視為倉(cāng)庫(kù)中屬于項(xiàng)目的文件。本質(zhì)上,這是一種工作區(qū)。你可能沒(méi)有意識(shí)到你已經(jīng)在使用工作樹(shù)了。開(kāi)始使用 Git 時(shí),你將自動(dòng)獲得第一個(gè)工作樹(shù)。

  1. $ mkdir /tmp/foo && cd /tmp/foo
  2. $ git init
  3. $ git worktree list
  4. /tmp  0000000 [master]

你可以在以上代碼看到,甚至在第一次提交前你就有了一個(gè)工作樹(shù)。接下來(lái)去嘗試再添加一個(gè)工作樹(shù)到你的項(xiàng)目中吧。

添加一個(gè)工作樹(shù)

想要添加一個(gè)新的工作樹(shù)你需要提供:

  1. 硬盤上的一個(gè)位置
  2. 一個(gè)分支名
  3. 添加哪些分支
  1. $ git clone https://github.com/oalders/http-browserdetect.git
  2. $ cd http-browserdetect/
  3. $ git worktree list
  4. /Users/olaf/http-browserdetect 90772ae [master]
  5.  
  6. $ git worktree add ~/trees/oalders/feature-X -b oalders/feature-X origin/master
  7. $ git worktree add ~/trees/oalders/feature-Y -b oalders/feature-Y e9df3c555e96b3f1
  8.  
  9. $ git worktree list
  10. /Users/olaf/http-browserdetect 90772ae [master]
  11. /Users/olaf/trees/oalders/feature-X 90772ae [oalders/feature-X]
  12. /Users/olaf/trees/oalders/feature-Y e9df3c5 [oalders/feature-Y]

與大多數(shù)其他 Git 命令一樣,你需要在倉(cāng)庫(kù)路徑下使用此命令。一旦創(chuàng)建了工作樹(shù),就有了隔離的工作環(huán)境。Git 倉(cāng)庫(kù)會(huì)跟蹤工作樹(shù)在磁盤上的位置。如果 Git 鉤子已經(jīng)在父?jìng)}庫(kù)中設(shè)置好了,那么它們也可以在工作樹(shù)中使用。

請(qǐng)注意到,每個(gè)工作樹(shù)只使用父?jìng)}庫(kù)磁盤空間的一小部分。在這種情況下,工作樹(shù)需要只大約三分之一的原始磁盤空間。這這非常適合進(jìn)行擴(kuò)展。如果你的倉(cāng)庫(kù)達(dá)到了千兆字節(jié)的級(jí)別,你就會(huì)真正體會(huì)到工作樹(shù)對(duì)硬盤空間的節(jié)省。

  1. $ du -sh /Users/olaf/http-browserdetect
  2. 2.9M
  3.  
  4. $ du -sh /Users/olaf/trees/oalders/feature-X
  5. 1.0M

優(yōu)點(diǎn): 你可以同時(shí)在多個(gè)工作區(qū)中工作。你不需要使用暫存。Git 會(huì)跟蹤所有的工作樹(shù)。你不需要設(shè)置 Git 鉤子。這也比 git clone 更快,并且可以節(jié)省網(wǎng)絡(luò)流量,因?yàn)槟憧梢栽陲w行模式下執(zhí)行此操作。你還可以更高效地使用磁盤空間,而無(wú)需借助于淺層克隆。

缺點(diǎn): 這是個(gè)需要你額外學(xué)習(xí)和記憶的新東西,但是如果你能養(yǎng)成使用這個(gè)功能的習(xí)慣,它會(huì)給你豐厚的回報(bào)。

額外的小技巧

有很多方式可以清除工作樹(shù),最受歡迎的方式是使用 Git 來(lái)移除工作樹(shù):

  1. git worktree remove /Users/olaf/trees/oalders/feature-X

如果你喜歡 RM 大法,你也可以用 rm -rf 來(lái)刪除工作樹(shù)。

  1. rm -rf /Users/olaf/trees/oalders/feature-X

但是,如果執(zhí)行此操作,則可能需要使用 git worktree prune 清理所有剩余的文件?;蛘吣悻F(xiàn)在可以跳過(guò)清理,這將在將來(lái)的某個(gè)時(shí)候通過(guò) git gc 自行完成。

注意事項(xiàng)

如果你準(zhǔn)備嘗試 git worktree,請(qǐng)記住以下幾點(diǎn):

  • 刪除工作樹(shù)并不會(huì)刪除該分支。
  • 可以在工作樹(shù)中切換分支。
  • 你不能在多個(gè)工作樹(shù)中同時(shí)簽出同一個(gè)分支。
  • 像其他命令一樣,git worktree 需要從倉(cāng)庫(kù)內(nèi)運(yùn)行。
  • 你可以同時(shí)擁有許多工作樹(shù)。
  • 要從同一個(gè)本地倉(cāng)庫(kù)簽出創(chuàng)建工作樹(shù),否則它們將互不可知。

git rev-parse

最后一點(diǎn)注意:在使用 git worktree 時(shí),倉(cāng)庫(kù)根所在的位置可能取決于上下文。幸運(yùn)的是,git rev parse 可以讓你區(qū)分這兩者。

  • 要查找父?jìng)}庫(kù)的根目錄,請(qǐng)執(zhí)行以下操作:
    1. git rev-parse --git-common-dir
  • 要查找你當(dāng)前所在倉(cāng)庫(kù)的根目錄,請(qǐng)執(zhí)行:
    1. git rev-parse --show-toplevel

根據(jù)你的需要選擇最好的方法

就像很多事情一樣,TIMTOWDI(條條大道通羅馬there's more than one way to do it)。重要的是你要找到一個(gè)適合你需要的工作流程。你的需求可能因手頭的問(wèn)題而異。也許你偶爾會(huì)發(fā)現(xiàn)自己將 git worktree 作為版本控制工具箱中的一個(gè)方便工具。

 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2022-04-24 15:37:26

LinuxCPU

2019-05-06 14:36:48

CPULinux寄存器

2022-04-25 11:27:34

LinuxCPU

2022-09-26 23:36:33

Linux系統(tǒng)CPU

2024-08-27 09:46:39

Go協(xié)程效率

2022-09-05 08:02:10

上下文切換服務(wù)器

2020-09-28 08:44:17

Linux內(nèi)核

2024-11-06 12:59:42

多線程銷毀線程切換

2024-03-19 09:15:12

服務(wù)器CPUI/O

2023-11-24 16:18:15

操作系統(tǒng)Linux

2025-05-12 00:00:15

2020-02-21 10:09:06

調(diào)度進(jìn)程線程

2017-05-11 14:00:02

Flask請(qǐng)求上下文應(yīng)用上下文

2012-12-31 10:01:34

SELinuxSELinux安全

2022-09-14 13:13:51

JavaScript上下文

2025-04-08 00:22:00

C#異步編程

2024-01-09 18:09:43

模型方式DMA

2023-07-11 10:02:23

2022-09-15 08:01:14

繼承基礎(chǔ)設(shè)施基礎(chǔ)服務(wù)

2025-04-07 01:02:00

GoAPI語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)