我有一个中央回购,比如说,有三个分支,branchA
、branchB
和branchC
。我在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