我有一个中央回购,比如说,有三个分支,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将一个包取到一个活动的分支中?
顺便说一句,这类似于this question,但是在这个问题中没有提到捆绑,所以我看不出这里的答案是如何适用的。
发布于 2021-04-16 21:37:53
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
上执行此操作时,该操作将以合理的方式工作,更新您的分支和签出沙箱中的文件,并给出以下准确的警告:“警告:获取更新的当前分支头”。
方法3:迂回但更冗长的
我有时在bundle中使用的第三种方法允许我在合并任何东西之前使用我喜欢的图形git日志工具来检查它。它将将包添加为另一个远程设备:
git remote add mybundle <path-to-bundle-file>
git fetch mybundle
然后,在git日志中,包中的分支将显示在mybundle/<branch-name>
上,您可以将其合并,就好像它来自连接的远程一样。
虽然有更多的工作要做,但如果您想在应用之前仔细分析包提供了什么,则此方法可能很有用。
发布于 2021-04-16 22:00:42
在工厂默认的合并拖放、快速转发(如果可能的话)设置下,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
https://stackoverflow.com/questions/67131687
复制相似问题