2025最新系統 Git 教程(七)(完結)

第4章 分布式Git

4.1 分布式 Git - 分布式工作流程

你現在擁有了一個遠程 Git 版本庫,能為所有開發者共享代碼提供服務,在一個本地工作流程下,你也已經熟悉了基本 Git 命令。你現在可以學習如何利用 Git 提供的一些分布式工作流程了。

這一章中,你將會學習如何作為貢獻者或整合者,在一個分布式協作的環境中使用 Git。 你會學習為一個項目成功地貢獻代碼,并接觸一些最佳實踐方式,讓你和項目的維護者能輕松地完成這個過程。另外,你也會學到如何管理有很多開發者提交貢獻的項目。

分布式工作流程

與傳統的集中式版本控制系統(CVCS)相反,Git 的分布式特性使得開發者間的協作變得更加靈活多樣。 在集中式系統中,每個開發者就像是連接在集線器上的節點,彼此的工作方式大體相像。 而在 Git 中,每個開發者同時扮演著節點和集線器的角色——也就是說, 每個開發者既可以將自己的代碼貢獻到其他的倉庫中,同時也能維護自己的公開倉庫, 讓其他人可以在其基礎上工作并貢獻代碼。 由此,Git 的分布式協作可以為你的項目和團隊衍生出種種不同的工作流程, 接下來的章節會介紹幾種利用了 Git 的這種靈活性的常見應用方式。 我們將討論每種方式的優點以及可能的缺點;你可以選擇使用其中的某一種,或者將它們的特性混合搭配使用。

集中式工作流

集中式系統中通常使用的是單點協作模型——集中式工作流。 一個中心集線器,或者說 倉庫,可以接受代碼,所有人將自己的工作與之同步。 若干個開發者則作為節點,即中心倉庫的消費者與中心倉庫同步。

Figure 54. 集中式工作流。

這意味著如果兩個開發者從中心倉庫克隆代碼下來,同時作了一些修改,那么只有第一個開發者可以順利地把數據推送回共享服務器。 第二個開發者在推送修改之前,必須先將第一個人的工作合并進來,這樣才不會覆蓋第一個人的修改。 這和 Subversion (或任何 CVCS)中的概念一樣,而且這個模式也可以很好地運用到 Git 中。

如果在公司或者團隊中,你已經習慣了使用這種集中式工作流程,完全可以繼續采用這種簡單的模式。 只需要搭建好一個中心倉庫,并給開發團隊中的每個人推送數據的權限,就可以開展工作了。Git 不會讓用戶覆蓋彼此的修改。

例如 John 和 Jessica 同時開始工作。 John 完成了他的修改并推送到服務器。 接著 Jessica 嘗試提交她自己的修改,卻遭到服務器拒絕。 她被告知她的修改正通過非快進式(non-fast-forward)的方式推送,只有將數據抓取下來并且合并后方能推送。 這種模式的工作流程的使用非常廣泛,因為大多數人對其很熟悉也很習慣。

當然這并不局限于小團隊。 利用 Git 的分支模型,通過同時在多個分支上工作的方式,即使是上百人的開發團隊也可以很好地在單個項目上協作。

集成管理者工作流

Git 允許多個遠程倉庫存在,使得這樣一種工作流成為可能:每個開發者擁有自己倉庫的寫權限和其他所有人倉庫的讀權限。 這種情形下通常會有個代表“官方”項目的權威的倉庫。 要為這個項目做貢獻,你需要從該項目克隆出一個自己的公開倉庫,然后將自己的修改推送上去。 接著你可以請求官方倉庫的維護者拉取更新合并到主項目。 維護者可以將你的倉庫作為遠程倉庫添加進來,在本地測試你的變更,將其合并入他們的分支并推送回官方倉庫。 這一流程的工作方式如下所示

  1. 項目維護者推送到主倉庫。

  2. 貢獻者克隆此倉庫,做出修改。

  3. 貢獻者將數據推送到自己的公開倉庫。

  4. 貢獻者給維護者發送郵件,請求拉取自己的更新。

  5. 維護者在自己本地的倉庫中,將貢獻者的倉庫加為遠程倉庫并合并修改。

  6. 維護者將合并后的修改推送到主倉庫。

Figure 55. 集成管理者工作流。

這是 GitHub 和 GitLab 等集線器式(hub-based)工具最常用的工作流程。人們可以容易地將某個項目派生成為自己的公開倉庫,向這個倉庫推送自己的修改,并為每個人所見。 這么做最主要的優點之一是你可以持續地工作,而主倉庫的維護者可以隨時拉取你的修改。 貢獻者不必等待維護者處理完提交的更新——每一方都可以按照自己的節奏工作。

主管與副主管工作流

這其實是多倉庫工作流程的變種。 一般擁有數百位協作開發者的超大型項目才會用到這樣的工作方式,例如著名的 Linux 內核項目。 被稱為 副主管(lieutenant) 的各個集成管理者分別負責集成項目中的特定部分。 所有這些副主管頭上還有一位稱為 主管(dictator) 的總集成管理者負責統籌。 主管維護的倉庫作為參考倉庫,為所有協作者提供他們需要拉取的項目代碼。 整個流程看起來是這樣的:

  1. 普通開發者在自己的主題分支上工作,并根據 master 分支進行變基。 這里是主管推送的參考倉庫的 master 分支。

  2. 副主管將普通開發者的主題分支合并到自己的 master 分支中。

  3. 主管將所有副主管的 master 分支并入自己的 master 分支中。

  4. 最后,主管將集成后的 master 分支推送到參考倉庫中,以便所有其他開發者以此為基礎進行變基。

Figure 56. 主管與副主管工作流。

這種工作流程并不常用,只有當項目極為龐雜,或者需要多級別管理時,才會體現出優勢。 利用這種方式,項目總負責人(即主管)可以把大量分散的集成工作委托給不同的小組負責人分別處理,然后在不同時刻將大塊的代碼子集統籌起來,用于之后的整合。

工作流程總結

上面介紹了在 Git 等分布式系統中經常使用的工作流程,但是在實際的開發中,你會遇到許多可能適合你的特定工作流程的變種。 現在你應該已經清楚哪種工作流程組合可能比較適合你了,我們會給出一些如何扮演不同工作流程中主要角色的更具體的例子。 下一節我們將會學習為項目做貢獻的一些常用模式。

4.2 分布式 Git - 向一個項目貢獻

向一個項目貢獻

描述如何向一個項目貢獻的主要困難在于完成貢獻有很多不同的方式。 因為 Git 非常靈活,人們可以通過不同的方式來一起工作,所以描述應該如何貢獻并不是非常準確——每一個項目都有一點兒不同。 影響因素包括活躍貢獻者的數量、選擇的工作流程、提交權限與可能包含的外部貢獻方法。

第一個影響因素是活躍貢獻者的數量——積極地向這個項目貢獻代碼的用戶數量以及他們的貢獻頻率。 在許多情況下,你可能會有兩三個開發者一天提交幾次,對于不活躍的項目可能更少。 對于大一些的公司或項目,開發者的數量可能會是上千,每天都有成百上千次提交。 這很重要,因為隨著開發者越來越多,在確保你的代碼能干凈地應用或輕松地合并時會遇到更多問題。 提交的改動可能表現為過時的,也可能在你正在做改動或者等待改動被批準應用時被合并入的工作嚴重損壞。 如何保證代碼始終是最新的,并且提交始終是有效的?

下一個影響因素是項目使用的工作流程。 它是中心化的嗎,即每一個開發者都對主線代碼有相同的寫入權限? 項目是否有一個檢查所有補丁的維護者或整合者? 是否所有的補丁是同行評審后批準的? 你是否參與了那個過程? 是否存在副官系統,你必須先將你的工作提交到上面?

下一個影響因素是提交權限。 是否有項目的寫權限會使向項目貢獻所需的流程有極大的不同。 如果沒有寫權限,項目會選擇何種方式接受貢獻的工作? 是否甚至有一個如何貢獻的規范? 你一次貢獻多少工作? 你多久貢獻一次?

所有這些問題都會影響實際如何向一個項目貢獻,以及對你來說哪些工作流程更適合或者可用。 我們將會由淺入深,通過一系列用例來講述其中的每一個方面;從這些例子應該能夠建立實際中你需要的特定工作流程。

提交準則

在我們開始查看特定的用例前,這里有一個關于提交信息的快速說明。 有一個好的創建提交的準則并且堅持使用會讓與 Git 工作和與其他人協作更容易。 Git 項目提供了一個文檔,其中列舉了關于創建提交到提交補丁的若干好的提示——可以在 Git 源代碼中的 Documentation/SubmittingPatches 文件中閱讀它。

首先,你的提交不應該包含任何空白錯誤。 Git 提供了一個簡單的方式來檢查這點——在提交前,運行 git diff --check,它將會找到可能的空白錯誤并將它們為你列出來。

Figure 57. git diff --check 的輸出

如果在提交前運行那個命令,可以知道提交中是否包含可能會使其他開發者惱怒的空白問題。

接下來,嘗試讓每一個提交成為一個邏輯上的獨立變更集。 如果可以,嘗試讓改動可以理解——不要在整個周末編碼解決五個問題,然后在周一時將它們提交為一個巨大的提交。 即使在周末期間你無法提交,在周一時使用暫存區域將你的工作最少拆分為每個問題一個提交,并且為每一個提交附帶一個有用的信息。 如果其中一些改動修改了同一個文件,嘗試使用 git add --patch 來部分暫存文件。 不管你做一個或五個提交,只要所有的改動都曾添加過,項目分支末端的快照就是一樣的,所以盡量讓你的開發者同事們在審查你的改動的時候更容易些吧。

當你之后需要時這個方法也會使拉出或還原一個變更集更容易些。 [重寫歷史]描述了重寫歷史與交互式暫存文件的若干有用的 Git 技巧——在將工作發送給其他人前使用這些工具來幫助生成一個干凈又易懂的歷史。

最后一件要牢記的事是提交信息。 有一個創建優質提交信息的習慣會使 Git 的使用與協作容易的多。 一般情況下,信息應當以少于 50 個字符(25個漢字)的單行開始且簡要地描述變更,接著是一個空白行,再接著是一個更詳細的解釋。 Git 項目要求一個更詳細的解釋,包括做改動的動機和它的實現與之前行為的對比——這是一個值得遵循的好規則。 使用指令式的語氣來編寫提交信息,比如使用“Fix bug”而非“Fixed bug”或“Fixes bug”。 這里是一份 [最初由 Tim Pope 寫的模板]:

首字母大寫的摘要(不多于 50 個字符)
?
如果必要的話,加入更詳細的解釋文字。在大概 72 個字符的時候換行。
在某些情形下,第一行被當作一封電子郵件的標題,剩下的文本作為正文。
分隔摘要與正文的空行是必須的(除非你完全省略正文),
如果你將兩者混在一起,那么類似變基等工具無法正常工作。
?
使用指令式的語氣來編寫提交信息:使用“Fix bug”而非“Fixed bug”或“Fixes bug”。
此約定與 git merge 和 git revert 命令生成提交說明相同。
?
空行接著更進一步的段落。
?
- 標號也是可以的。
?
- 項目符號可以使用典型的連字符或星號,后跟一個空格,行之間用空行隔開,但是可以依據不同的慣例有所不同。
?
- 使用懸掛式縮進

如果你所有的提交信息都遵循此模版,那么對你和與你協作的其他開發者來說事情會變得非常容易。 Git 項目有一個良好格式化的提交信息——嘗試在那兒運行 git log --no-merges 來看看漂亮的格式化的項目提交歷史像什么樣。

Note按我們說的去做,不要照著我們做的去做。為簡單起見,本書中很多例子的提交說明并沒有遵循這樣良好的格式, 我們只是對 git commit 使用了 -m 選項。簡而言之,按我們說的去做,不要照著我們做的去做。

私有小型團隊

你可能會遇到的最簡單的配置是有一兩個其他開發者的私有項目。 “私有” 在這個上下文中,意味著閉源——不可以從外面的世界中訪問到。 你和其他的開發者都有倉庫的推送權限。

在這個環境下,可以采用一個類似使用 Subversion 或其他集中式的系統時會使用的工作流程。 依然可以得到像離線提交、非常容易地新建分支與合并分支等高級功能,但是工作流程可以是很簡單的;主要的區別是合并發生在客戶端這邊而不是在提交時發生在服務器那邊。 讓我們看看當兩個開發者在一個共享倉庫中一起工作時會是什么樣子。 第一個開發者,John,克隆了倉庫,做了改動,然后本地提交。 (為了縮短這些例子長度,協議信息已被替換為 。)

# John's Machine
$ git clone john@githost:simplegit.git
Cloning into 'simplegit'...
...
$ cd simplegit/
$ vim lib/simplegit.rb
$ git commit -am 'remove invalid default value'
[master 738ee87] remove invalid default value1 files changed, 1 insertions(+), 1 deletions(-)

第二個開發者,Jessica,做了同樣的事情——克隆倉庫并提交了一個改動:

# Jessica's Machine
$ git clone jessica@githost:simplegit.git
Cloning into 'simplegit'...
...
$ cd simplegit/
$ vim TODO
$ git commit -am 'add reset task'
[master fbff5bc] add reset task1 files changed, 1 insertions(+), 0 deletions(-)

現在,Jessica 把她的工作推送到服務器上,一切正常:

# Jessica's Machine
$ git push origin master
...
To jessica@githost:simplegit.git1edee6b..fbff5bc  master -> master

上方輸出信息中最后一行顯示的是推送操作執行完畢后返回的一條很有用的消息。 消息的基本格式是 <oldref>..<newref> fromref → torefoldref 的含義是推送前所指向的引用, newref 的含義是推送后所指向的引用, fromref 是將要被推送的本地引用的名字, toref 是將要被更新的遠程引用的名字。 在后面的討論中你還會看到類似的輸出消息,所以對這條消息的含義有一些基礎的了解將會幫助你理解倉庫的諸多狀態。 想要了解更多細節請訪問文檔 git-push 。

John 稍候也做了些改動,將它們提交到了本地倉庫中,然后試著將它們推送到同一個服務器:

# John's Machine
$ git push origin master
To john@githost:simplegit.git! [rejected] ? ? ?  master -> master (non-fast forward)
error: failed to push some refs to 'john@githost:simplegit.git'

這時 John 會推送失敗,因為之前 Jessica 已經推送了她的更改。 如果之前習慣于用 Subversion 那么理解這點特別重要,因為你會注意到兩個開發者并沒有編輯同一個文件。 盡管 Subversion 會對編輯的不同文件在服務器上自動進行一次合并,但 Git 要求你先在本地合并提交。 換言之,John 必須先抓取 Jessica 的上游改動并將它們合并到自己的本地倉庫中,才能被允許推送。

第一步,John 抓取 Jessica 的工作(這只會 抓取 Jessica 的上游工作,并不會將它合并到 John 的工作中):

$ git fetch origin
...
From john@githost:simplegit+ 049d078...fbff5bc master ? ? -> origin/master

在這個時候,John 的本地倉庫看起來像這樣:

Figure 58. John 的分叉歷史

現在 John 可以將抓取下來的 Jessica 的工作合并到他自己的本地工作中了:

$ git merge origin/master
Merge made by the 'recursive' strategy.TODO | ?  1 +1 files changed, 1 insertions(+), 0 deletions(-)

合并進行得很順利——John 更新后的歷史現在看起來像這樣:

Figure 59. 合并了 origin/master 之后 John 的倉庫

此時,John 可能想要測試新的代碼,以確保 Jessica 的工作沒有影響他自己的工作, 當一切正常后,他就能將新合并的工作推送到服務器了:

$ git push origin master
...
To john@githost:simplegit.gitfbff5bc..72bbc59  master -> master

最終,John 的提交歷史看起來像這樣:

Figure 60. 推送到 origin 服務器后 John 的歷史

在此期間,Jessica 新建了一個名為 issue54 的主題分支,然后在該分支上提交了三次。 她還沒有抓取 John 的改動,所以她的提交歷史看起來像這樣:

Figure 61. Jessica 的主題分支

忽然,Jessica 發現 John 向服務器推送了一些新的工作,她想要看一下, 于是就抓取了所有服務器上的新內容:

# Jessica's Machine
$ git fetch origin
...
From jessica@githost:simplegitfbff5bc..72bbc59  master     -> origin/master

那會同時拉取 John 推送的工作。 Jessica 的歷史現在看起來像這樣:

Figure 62. 抓取 John 的改動后 Jessica 的歷史

Jessica 認為她的主題分支已經準備好了,但她想知道需要將 John 工作的哪些合并到自己的工作中才能推送。 她運行 git log 找了出來:

$ git log --no-merges issue54..origin/master
commit 738ee872852dfaa9d6634e0dea7a324040193016
Author: John Smith <jsmith@example.com>
Date:   Fri May 29 16:01:27 2009 -0700remove invalid default value

issue54..origin/master 語法是一個日志過濾器,要求 Git 只顯示所有在后面分支 (在本例中是 origin/master)但不在前面分支(在本例中是 issue54)的提交的列表。

目前,我們可以從輸出中看到有一個 John 生成的但是 Jessica 還沒有合并的提交。 如果她合并 origin/master,那個未合并的提交將會修改她的本地工作。

現在,Jessica 可以合并她的特性工作到她的 master 分支, 合并 John 的工作(origin/master)進入她的 master 分支,然后再次推送回服務器。

首先(在已經提交了所有 issue54 主題分支上的工作后),為了整合所有這些工作, 她切換回她的 master 分支。

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.

Jessica 既可以先合并 origin/master 也可以先合并 issue54 ——它們都是上游,所以順序并沒有關系。 不論她選擇的順序是什么最終的結果快照是完全一樣的;只是歷史會稍微有些不同。 她選擇先合并 issue54

$ git merge issue54
Updating fbff5bc..4af4298
Fast forwardREADME           |    1 +lib/simplegit.rb |    6 +++++-2 files changed, 6 insertions(+), 1 deletions(-)

沒有發生問題,如你所見它是一次簡單的快進合并。 現在 Jessica 在本地合并了之前抓取的 origin/master 分支上 John 的工作:

$ git merge origin/master
Auto-merging lib/simplegit.rb
Merge made by the 'recursive' strategy.lib/simplegit.rb |    2 +-1 files changed, 1 insertions(+), 1 deletions(-)

每一個文件都干凈地合并了,Jessica 的歷史現在看起來像這樣:

Figure 63. 合并了 John 的改動后 Jessica 的歷史

現在 origin/master 是可以從 Jessica 的 master 分支到達的, 所以她應該可以成功地推送(假設同一時間 John 并沒有更多推送):

$ git push origin master
...
To jessica@githost:simplegit.git72bbc59..8059c15  master -> master

每一個開發者都提交了幾次并成功地合并了其他人的工作。

Figure 64. 推送所有的改動回服務器后 Jessica 的歷史

這是一個最簡單的工作流程。 你通常會在一個主題分支上工作一會兒,當它準備好整合時就合并到你的 master 分支。 當想要共享工作時,如果有改動的話就抓取它然后合并到你自己的 master 分支, 之后推送到服務器上的 master 分支。通常順序像這樣:

Figure 65. 一個簡單的多人 Git 工作流程的通常事件順序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76947.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV 圖像旋轉

一、OpenCV 圖像旋轉介紹 在計算機視覺和圖像處理領域&#xff0c;圖像旋轉是指將圖像圍繞某個中心點按照一定的角度進行轉動。旋轉操作會改變圖像中像素的位置&#xff0c;從而得到新的圖像布局。這一操作在很多場景中都有重要應用&#xff0c;比如文檔矯正、目標檢測時對圖像…

<C#>在 .NET 開發中,依賴注入, 注冊一個接口的多個實現

在 .NET 開發里&#xff0c;有時一個接口會有多個實現類&#xff0c;此時就需要向依賴注入容器注冊多個實現。下面會詳細介紹不同場景下如何注冊多個實現&#xff0c;以及怎樣從容器中解析這些實現。 1. 注冊多個實現 在 .NET 中&#xff0c;依賴注入容器可以通過不同方式注冊…

idea 保存格式化 但是不格式化 Xml

xml- 其他 - 保持空格勾選上 https://blog.csdn.net/m0_65724734/article/details/128378290?spm1001.2101.3001.6650.8&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-128378290-blog-135147277.235%5Ev43%5Epc_blog_bo…

如何在C++中優雅地繪制圖表

如何在C項目中優雅地繪制圖表 matplotlibpreparematplotlibcpp.hpython3vs configuretest Gnuplotpreparegnuplotgnuplot-iostream.hboostvs configuretest MathGL 在C項目中&#xff0c;在進行一些數據分析時往往不夠直觀&#xff0c;若能借助圖表進行分析可以達到事半功倍的效…

vue3使用keep-alive緩存組件與踩坑日記

目錄 一.了解一下KeepAlive 二.使用keep-alive標簽緩存組件 1.聲明Home頁面名稱 三.在路由出口使用keep-alive標簽 四.踩坑點1&#xff1a;可能需要配置路由&#xff08;第三點完成后有效可忽略&#xff09; 五.踩坑點2&#xff1a;沒有找到正確的路由出口 一.了解一下Kee…

ros通信機制學習——latched持久化機制

點云的地圖的發送邏輯中&#xff0c;我發現每次使用rostopic echo 時只會打印一次&#xff0c;然后就不會再打印了。并且rviz中也是始終都會顯示的&#xff0c;這里面其實就是用到了latched持久話機制&#xff0c;可以接受這最后一次發布的消息。 我們通過一個具體的項目來學習…

力扣每日打卡 1922. 統計好數字的數目 (中等)

力扣 1922. 統計好數字的數目 中等 前言一、題目內容二、解題方法1. 暴力解法&#xff08;會超時&#xff0c;此法不通&#xff09;2. 快速冪運算3. 組合計數的思維邏輯分析組合計數的推導例子分析思維小結論 4.官方題解4.1 方法一&#xff1a;快速冪 三、快速冪運算快速冪運算…

如何使用通義靈碼玩轉Docker - AI助手提升開發效率

一、引言 Docker 作為一種流行的虛擬化技術&#xff0c;能夠幫助開發者快速搭建所需的運行環境。然而&#xff0c;對于初學者來說&#xff0c;掌握 Docker 的基本概念和使用方法可能會遇到一些挑戰。本文將介紹如何利用通義靈碼這一智能編碼助手&#xff0c;幫助你更高效地學習…

從一到無窮大 #45:InfluxDB MCP Server 構建:從工程實踐到價值重構

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 工程實踐遇到的問題MCP Host選擇開發流程 結果展現可能性展望工作生活帶來的變化 MCP…

JAVA SDK通過proxy對接google: GCS/FCM

前言&#xff1a;因為國內調用google相關api需要通過代理訪問(不想設置全局代理)&#xff0c;所以在代理這里經常遇到問題&#xff0c;先說一下結論 GCS 需要設置全局代理或自定義代理選擇器&#xff0c; FCM sdk admin 在初始化firebaseApp時是支持設置的。 GCS: 開始時嘗試在…

【NLP】24. spaCy 教程:自然語言處理核心操作指南(進階)

spaCy 中文教程&#xff1a;自然語言處理核心操作指南&#xff08;進階&#xff09; 1. 識別文本中帶有“百分號”的數字 import spacy# 創建一個空的英文語言模型 nlp spacy.blank("en")# 處理輸入文本 doc nlp("In 1990, more than 60% of people in East…

關于香橙派OrangePi 5 Ultra 這個開源板子,開發Android

我下載了它資料中的開源Android13 系統SDK&#xff0c; 這個SDK連個git 都沒有&#xff0c;把這種代碼釋放能稱為開源嗎&#xff1f;&#xff1f; 并且也就是說你買了這個板子&#xff0c;里面是沒有任何關于RK3588的開發文檔&#xff0c;如果你沒玩過其他RK平臺&#xff0c;估…

WHAT - React Portal 機制:將子組件渲染到 DOM 的指定節點

文章目錄 適合場景基本語法示例&#xff1a;Modal 彈窗1. 創建一個簡單的 Modal.tsx2. 在 App 中使用 為什么要用 Portal&#xff1f;TypeScript 中 Portal 類型定義&#xff1f; 適合場景 React Portal 是 React 提供的一種機制&#xff0c;讓你可以將子組件渲染到 DOM 的指定…

數據結構---跳表

目錄 一、跳表的概念 為什么要使用隨機值來確定層高 二、跳表的分析 &#xff08;1&#xff09;查找過程 &#xff08;2&#xff09;性能分析 三、跳表的實現 四、與紅黑樹哈希表的對比 skiplist本質上也是一種查找結構&#xff0c;用于解決算法中的查找問題&#xff0c…

PCDN通過個人路由器,用更靠近用戶的節點來分發內容,從而達到更快地網絡反應速度

PCDN&#xff08;P2P CDN&#xff09;的核心思想正是利用個人路由器、家庭寬帶設備等分布式邊緣節點&#xff0c;通過就近分發內容來降低延遲、提升網絡響應速度&#xff0c;同時降低傳統CDN的帶寬成本。以下是其技術原理和優勢的詳細分析&#xff1a; 1. 為什么PCDN能更快&…

用excel做九乘九乘法表

公式&#xff1a; IF($A2>B 1 , 1, 1,A2 & “" & B$1 & “” & $A2B$1,”")

凡泰極客亮相QCon2025鴻蒙專場,解析FinClip“技術+生態”雙引擎

2025年4月10日&#xff0c;備受矚目的QCon開發者技術峰會盛大舉行&#xff0c;本次活動開設鴻蒙專場以“HarmonyOS NEXT 創新特性與行業實踐”為主題&#xff0c;匯聚了眾多鴻蒙生態的領軍人物與技術專家&#xff0c;共同探討鴻蒙操作系統的技術創新與行業應用。 凡泰極客CTO徐…

java HttpServletRequest 和 HttpServletResponse

HttpServletRequest 和 HttpServletResponse 詳解 1. HttpServletRequest&#xff08;HTTP 請求對象&#xff09; HttpServletRequest 是 Java Servlet API 提供的接口&#xff0c;用于封裝客戶端的 HTTP 請求信息。它繼承自 ServletRequest&#xff0c;并增加了 HTTP 協議相…

HAL TIM PWM產生 藍橋杯

目錄 0.原理 0.1 CNT和CCR關系 0.2 PWM模式1模式2 1. cubemx配置 需求(將PA1輸出1Khz的 50&#xff05;占空比的方波) 1.0 PWM的頻率計算: 2.代碼 0.原理 0.1 CNT和CCR關系 CNT計數器和CCR比較器進行比較,如果是向上計數,CNT逐漸增加,CCR是虛線位置,也是用戶自定義的…

python入門:簡單介紹和python和pycharm軟件安裝/學習網址/pycharm設置(改成中文界面,主題,新建文件)

Python 目前是 AI 開發的首選語言 軟件安裝 python解釋器 官網下載 Python |Python.org 勾選 Add python.exe to PATH 將python.exe添加到PATH 勾選這個選項會將Python的可執行文件路徑添加到系統的環境變量PATH中。這樣做的好處是&#xff0c;你可以在命令行中從任何位置直…