在本週的部落格中,我想在完成有關使用 git merge 的實驗後分享我的想法和經驗。
完成最近專注於使用 Git 的實驗後,我對 Git 使用的兩種主要合併策略有了更深入的了解:快轉和三向遞歸 (recursive-ort) 合併。
快轉合併:當主分支自建立功能分支以來沒有新提交時,就會發生這種情況。在這種情況下,Git 只是將主分支指標向前移動到功能分支的最新提交。這種類型的合併不會建立單獨的合併提交,使其變得簡單且線性。
3 路遞歸合併:當主分支和功能分支都有不同的提交時,使用此方法。 Git 計算一個共同的祖先並嘗試合併兩個分支的變更。如果對兩個分支中的相同行或檔案進行更改,則可能會出現衝突,需要手動解決。最初,我的印像是,跨不同分支修改同一文件時總是會發生衝突。但是,只有當兩個分支中更改完全相同的程式碼行時,才會發生衝突。
在本實驗中,我致力於為我的儲存庫 VShell 添加兩個功能,其中涉及為每個功能建立單獨的分支。這些功能旨在透過支援多個輸入檔案/資料夾和流輸出來改進工具的功能。
第一個功能涉及使該工具能夠同時處理多個文件和資料夾路徑。以前,該工具僅處理單一檔案輸入,但透過此增強功能,使用者現在可以傳遞多個檔案或目錄作為參數。處理目錄中的所有檔案。
為了實現這一點,我擴展了現有邏輯以遞歸地迭代資料夾內容,將檔案路徑轉換為絕對路徑,並將所有相關檔案儲存在數組中。相關片段:
files.forEach((file) => { // convert a file path to an absolute path const filePath = path.resolve(file); ... const directoryFiles = fs .readdirSync(filePath) .map((f) => path.join(filePath, f)); allFiles = allFiles.concat(directoryFiles); ... const results = allFiles.map((file) => { process.stderr.write(`Debug: Processing file: ${file}. \n`); return fs.readFileSync(file, "utf-8"); }); return results.join("\n"); }
此程式碼確保單一檔案和目錄中的所有檔案都相應處理。
第二個功能為該工具添加了流支持,允許使用 -s/--stream 標誌將響應即時輸出到 stdout。與先前的實作相比,這是一個重大改進,先前的實作僅將回應寫入輸出檔案或在處理完成後完整顯示。
為了實現這一目標,我引入了非同步迭代,使用 for wait...of 迴圈來處理串流的資料區塊。此外,我即時追蹤令牌使用情況,因為令牌資訊僅在最終回應區塊中可用。核心邏輯如下:
if (options.stream) { // Handle streaming response const { response, tokenInfo } = await readStream(chatCompletion); return { response, tokenInfo }; }
async function readStream(stream) { let response = ""; let tokenInfo; for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content; if (content) { process.stdout.write(content); response += content; } // The last chunk will contain the usage information if (chunk?.x_groq?.usage) { // Retrieve Token Usage from Response const usage = chunk?.x_groq?.usage; const promptToken = usage?.prompt_tokens || 0; const completionToken = usage?.completion_tokens || 0; const totalToken = usage?.total_tokens || 0; tokenInfo = { promptToken, completionToken, totalToken }; } } return { response, tokenInfo }; }
即時串流方法需要對令牌追蹤進行調整,這與用於非串流回應的更簡單方法相反,在非串流回應中可以直接存取使用資料。
對於串流傳輸,只有在處理循環中的最後一個區塊後才能存取令牌使用物件。
// The last chunk will contain the usage information if (chunk?.x_groq?.usage) { // Retrieve Token Usage from Response const usage = chunk?.x_groq?.usage; ... }
預設情況下,當使用 -s/--stream 標誌而不透過 -o/--output 指定輸出檔案時,回應將會即時串流並顯示在控制台中。但是,如果使用者想要將回應匯出到文件,他們可以使用 -o/--output 標誌指定輸出檔案。
完成這兩個功能後,我啟動了合併過程,首先將功能 1 合併到主分支,然後是功能 2。由於這些功能是在單獨的文件中開發的,因此在合併過程中沒有發生衝突。然而,Git 使用了 ORT 合併策略(Ostensibility Recursive's Twin),這是從 Git 2.34 開始預設的。 ORT策略是經典遞歸合併策略的重寫,在處理複雜合併場景時提供更好的效能和準確性。
我的最終合併提交雜湊是:286e23c
以上是在 Git 中使用合併的詳細內容。更多資訊請關注PHP中文網其他相關文章!