说服git在活动分支中获取bundle的方法



我有一个中央回购,比如说,有三个分支,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(并从中运行相同的fetch命令来解决此问题。但这很尴尬,并立即引发了一个问题:如果我只有一家分行的回购,我该怎么办?

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

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

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

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

推荐方法1

正如您所说,在提取之前先签出另一个分支,然后运行

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

这样,更新与沙盒的当前状态无关,所以一切都很顺利。

如果您的回购没有其他分支,您可以在分离头模式而不是some-other-branch中签出任何提交(例如,来自注释中的@jthill:git checkout @^0签出当前提交(。

推荐方法2

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

git pull myrepo.bundle HEAD:branchB

当您在branchB上执行此操作时,该操作将以合理的方式工作,更新您的分支和已签出的沙盒中的文件,并向您发出准确的警告:";警告:fetch更新了当前分支头">

方法3:迂回但更详细

我有时在bundle中使用的第三种方法是,在合并任何内容之前,使用我喜欢的图形git日志工具对其进行检查

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

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

虽然还有更多的工作要做,但如果你想在应用之前仔细分析捆绑包提供的内容,这种方法可能会很有用

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

git pull your.bundle HEAD

或者,如果你已经设置了一些pull配置,你可以用显式

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

它们中的任何一个最终都会做相当于的事情

git fetch your.bundle HEAD
git merge FETCH_HEAD

最新更新