一种说服 git 将捆绑包提取到活动分支中的方法?

A way to convince git to fetch a bundle into an active branch?

我有一个中央仓库,其中包含三个分支,branchAbranchBbranchC。我做了一些承诺,比如 branchB。然后我需要将提交复制到另一个我无法通过网络访问的平台。所以我做了一个包。我制作的最后一个包是在提交 123456f 时发布的。所以我通过以下方式创建我的包:

> git bundle create myrepo.bundle 123456f..HEAD

现在,记住这是在 branchB 上完成的,在我的其他平台上,如果我已经签出 branchB,我会尝试将更改合并到

> git fetch myrepo.bundle HEAD:branchB

但有人告诉我

fatal: Refusing to fetch into current branch refs/heads/replace_pipeline_codes of non-bare repository

我可以通过签出 branchA(或 C)来解决这个问题,然后从那里 运行 使用相同的获取命令。但这很尴尬,立即提出了一个问题,如果我只有一个分支的回购怎么办?

那么在这种情况下我该怎么做,有没有办法说服 git 将捆绑包提取到活动分支中?

顺便说一下,这与 this question 类似,但在那个问题中没有提到捆绑,所以我看不出这里的答案如何适用。

git fetch 拒绝更新您当前分支的原因是 git fetch 是一个仅更新远程引用的操作,而不是您本地签出的副本。

您可以通过添加 --update-head-ok 开关坚持并获取当前分支,但结果并不好:签出的文件没有更改,只有 HEAD 和 git status 报告更改恢复所有这些新提交。那可能不是你想要的。 (但是 git reset --hard 将在此时解决问题,正如@jthill 在评论中指出的那样,只要您的沙箱中没有任何未保存的工作。)

推荐方法一

如您所说,在执行提取之前检查另一个分支,然后运行

git checkout some-other-branch
git fetch myrepo.bundle HEAD:branchB
git checkout branchB

这样一来,更新与沙箱的当前状态无关,所以一切正常。

如果你的 repo 没有其他分支,你可以在分离头模式而不是 some-other-branch 中检出任何提交(例如来自评论中的@jthill:git checkout @^0 检出当前提交).

推荐方法2

现在,也许您真正想要的操作是:

git pull myrepo.bundle HEAD:branchB

当您在 branchB 上执行此操作时,该操作将以合理的方式工作,更新您的分支和签出沙箱中的文件,并向您发出准确的警告:“警告:获取更新了当前的分支负责人。"

方法三:迂回但比较冗长

我有时使用捆绑包的第三种方法让我在合并任何内容之前使用我喜欢的图形 git 日志工具检查它。它是将捆绑包添加为另一个远程:

git remote add mybundle <path-to-bundle-file>
git fetch mybundle

然后,在 git 日志中,包中的分支将显示在 mybundle/<branch-name> 处,您可以将其合并,就好像它来自连接的远程服务器一样。

虽然需要更多工作,但如果您想在应用之前仔细分析捆绑包提供的内容,此方法会很有用。

在合并拉动的出厂默认设置下,如果可能的话快进,git pull 会为您进行提取和合并,

git pull your.bundle HEAD

或者如果您设置了一些拉动配置,您可以使用

明确说明
git -c pull.ff=true -c pull.rebase=false pull your.bundle HEAD

其中任何一个最终都相当于

git fetch your.bundle HEAD
git merge FETCH_HEAD