合并时如何临时结帐到另一个分支?

How can I temporarily checkout to another branch when merging?

我目前正在合并branchA和branchB,有很多冲突,我只解决了一部分。

但是,我想结帐到这个 repo 的另一个分支来处理一些其他问题。

如果我运行git merge --abort,我将失去所有以前的工作。

所以我想知道是否有一些方法可以“隐藏”我的合并状态,检出到另一个分支,做一些修复和提交,然后检出回到我的合并状态,并继续合并?

TL;DR

使用git worktree add.

更长

你不能。有些事情你可以 而不是 ,但首先让我们扩展一下这个“你不能”的事情。

这是 Git 的一个问题:当您处于未合并状态时,“un-merged-ness”——事实上 不完整的合并,连同 关于 合并的不完整内容 — 存储在一个地方,即 Git 的 索引 。 (Git 也称这个东西为 暂存区 ,指的是你通常如何使用它,而且——现在很少见,主要是在像 git rm --cached 这样的旗帜中——cache。这三个名字指的是同一个东西,由于不完全合并的情况,我通常使用术语index,因为它没有明显的意义。)

关于 Git 的索引有很多要了解的,但要记住的主要事情是索引或暂存区始终保存 提议的下一次提交,在 Git。您无法进行提交——这包括无法 运行 git stash,因为 git stash 只是进行提交——当提议的下一次提交完全 internally-confused-all-to-heck 时当存在合并冲突时。因此,在 解决 合并冲突之前,您无法取得任何 进展

那么,您可以做什么?好吧,任何日常 Git 克隆的三重奏 — 存储库、索引和工作树 — 三重奏。作为 ,您可以制作另一个克隆,这会得到另一个三重奏:.

从 Git 2.5 开始,然而 - Git 2.15 中的一个重要修复意味着如果你落后于1[=,你应该升级你的 Git 93=]—有另一种更少 resource-intensive 的方法来处理这个问题:每个 Git 存储库可以 添加工作树 。每个添加的工作树都带有一个专用于该特定工作树的新索引。

因此,初始克隆让您:

  • 存储库
  • 主要 对(您可以在其中选择一个 b运行ch 来处理/使用)

并且每 添加git worktree add 制作的工作树得到你:

  • secondary pair (where you should pick one b运行ch to work on / with, that was different from all other工作树,并坚持下去)

同时使用您在进行初始克隆时获得的存储库。所以这与新克隆“一样好”,除了:

  • 它“更好”,因为只有一个共享存储库,而且
  • 它“更糟”,因为只有一个共享存储库。

如果“better-ness”对您来说比“worse-ness”更重要——几乎所有时间几乎每个人都是如此——使用git worktree add。如果没有(或者由于某种原因您没有 git worktree add),请使用单独的克隆。


1这里的错误是,如果您使用 git worktree add 添加一个新的工作树,并开始在那里工作,然后暂停超过两周左右, 2.5 和 2.15 之间的 Git 版本 实际上会丢失数据。触发这个错误真的非常罕见和困难,但我自己 运行 遇到过一次。因此,对于 2.5.0 或更高版本但 2.15 之前的 Git 版本,如果您确实使用 git worktree add,请尝试在一周左右的时间内完成所有添加的工作树工作,然后删除(和 p运行e) 添加工作树,避免触发错误的可能性。

请注意,显式 git worktree remove 命令不在原始 git worktree 中;事实上,它是在 Git 2.17 中添加的。最初的设计说你应该在完成后手动删除它,运行 git worktree prune 让主存储库注意到它已经消失了。

潜在的错误是主存储库无法扫描每个添加的工作树的 HEAD 和索引。它们实际上存储在与主工作树一起使用的存储库中,因此即使工作树不可用,它们也可用(如果它是,如文档所述,“存储在便携式设备上...... [那]并不总是安装”)并且应该始终被扫描。有人忘了。