首頁  >  文章  >  web前端  >  在 Git 中使用合併

在 Git 中使用合併

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-09-27 12:25:031131瀏覽

Working with Merge in Git

在本週的部落格中,我想在完成有關使用 git merge 的實驗後分享我的想法和經驗。

Git 合併策略

完成最近專注於使用 Git 的實驗後,我對 Git 使用的兩種主要合併策略有了更深入的了解:快轉和三向遞歸 (recursive-ort) 合併。

  • 快轉合併:當主分支自建立功能分支以來沒有新提交時,就會發生這種情況。在這種情況下,Git 只是將主分支指標向前移動到功能分支的最新提交。這種類型的合併不會建立單獨的合併提交,使其變得簡單且線性。

  • 3 路遞歸合併:當主分支和功能分支都有不同的提交時,使用此方法。 Git 計算一個共同的祖先並嘗試合併兩個分支的變更。如果對兩個分支中的相同行或檔案進行更改,則可能會出現衝突,需要手動解決。最初,我的印像是,跨不同分支修改同一文件時總是會發生衝突。但是,只有當兩個分支中更改完全相同的程式碼行時,才會發生衝突。

實驗室實現:功能分支合併

在本實驗中,我致力於為我的儲存庫 VShell 添加兩個功能,其中涉及為每個功能建立單獨的分支。這些功能旨在透過支援多個輸入檔案/資料夾和流輸出來改進工具的功能。

功能 1:支援多個檔案和資料夾 - 第 15 期:

第一個功能涉及使該工具能夠同時處理多個文件和資料夾路徑。以前,該工具僅處理單一檔案輸入,但透過此增強功能,使用者現在可以傳遞多個檔案或目錄作為參數。處理目錄中的所有檔案。

為了實現這一點,我擴展了現有邏輯以遞歸地迭代資料夾內容,將檔案路徑轉換為絕對路徑,並將所有相關檔案儲存在數組中。相關片段:

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");
}

此程式碼確保單一檔案和目錄中的所有檔案都相應處理。

功能 2:對標準輸出的串流響應 - 第 16 期:

第二個功能為該工具添加了流支持,允許使用 -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 標誌指定輸出檔案。

合併流程和 Git 合併策略

完成這兩個功能後,我啟動了合併過程,首先將功能 1 合併到主分支,然後是功能 2。由於這些功能是在單獨的文件中開發的,因此在合併過程中沒有發生衝突。然而,Git 使用了 ORT 合併策略(Ostensibility Recursive's Twin),這是從 Git 2.34 開始預設的。 ORT策略是經典遞歸合併策略的重寫,在處理複雜合併場景時提供更好的效能和準確性。

我的最終合併提交雜湊是:286e23c

以上是在 Git 中使用合併的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:黑客啤酒節下一篇:黑客啤酒節