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

一种说服git将bundle提取到活动分支中的方法?,git,branch,Git,Branch,我有一个中央回购,有三个分支机构,branchA,branchB,和branchC。我在,比如说,branchB中进行了一些提交。然后我需要将提交复制到另一个我无法通过网络访问的平台。所以我做了一个包裹。我做的最后一个包是,比如说,提交123456f。因此,我通过以下方式创建包: > git bundle create myrepo.bundle 123456f..HEAD 现在,请记住这是在branchB上完成的,在我的另一个平台上,如果我签出了branchB,我会尝试将更改合并到bu

我有一个中央回购,有三个分支机构,
branchA
branchB
,和
branchC
。我在,比如说,
branchB
中进行了一些提交。然后我需要将提交复制到另一个我无法通过网络访问的平台。所以我做了一个包裹。我做的最后一个包是,比如说,提交
123456f
。因此,我通过以下方式创建包:

> git bundle create myrepo.bundle 123456f..HEAD
现在,请记住这是在
branchB
上完成的,在我的另一个平台上,如果我签出了
branchB
,我会尝试将更改合并到bundle中

> 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将bundle提取到活动分支中


顺便说一句,这与类似,但在这个问题中没有提到捆绑,因此我不认为这里的答案适用。

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

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

推荐方法1

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

git checkout some-other-branch
git fetch myrepo.bundle HEAD:branchB
git checkout branchB
这样,更新与沙盒的当前状态无关,因此一切正常

如果您的回购协议没有其他分支,您可以在分离头模式下签出任何提交,而不是
其他分支
(例如,从注释中的@jthill:
git checkout@^0
签出当前提交)

推荐方法2

现在,也许你真正想要的手术是:

git pull myrepo.bundle HEAD:branchB
当您在
branchB
上执行此操作时,该操作将以合理的方式工作,更新您的分支和签出沙箱中的文件,并给出准确的警告:“警告:获取已更新的当前分支头。”

方法3:迂回但更详细

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

git remote add mybundle <path-to-bundle-file>
git fetch mybundle
git远程添加mybundle
git获取mybundle
然后,在git日志中,bundle中的分支将显示在
mybundle/
中,您可以将其合并,就像它来自连接的远程服务器一样


在做更多工作的同时,如果您想在应用捆绑包之前仔细分析它提供的内容,此方法可能会很有用。

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

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

推荐方法1

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

git checkout some-other-branch
git fetch myrepo.bundle HEAD:branchB
git checkout branchB
这样,更新与沙盒的当前状态无关,因此一切正常

如果您的回购协议没有其他分支,您可以在分离头模式下签出任何提交,而不是
其他分支
(例如,从注释中的@jthill:
git checkout@^0
签出当前提交)

推荐方法2

现在,也许你真正想要的手术是:

git pull myrepo.bundle HEAD:branchB
当您在
branchB
上执行此操作时,该操作将以合理的方式工作,更新您的分支和签出沙箱中的文件,并给出准确的警告:“警告:获取已更新的当前分支头。”

方法3:迂回但更详细

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

git remote add mybundle <path-to-bundle-file>
git fetch mybundle
git远程添加mybundle
git获取mybundle
然后,在git日志中,bundle中的分支将显示在
mybundle/
中,您可以将其合并,就像它来自连接的远程服务器一样


在进行更多工作的同时,如果您希望在应用捆绑包之前仔细分析捆绑包提供的内容,则此方法可能非常有用。

在合并拉取的出厂默认设置下,如果可能,快速转发,
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

在合并拉取的出厂默认设置下,如果可能,快速转发,
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

因此,
git pull
而不是
git fetch
听起来像是我想要的。谢谢我在这方面有点生疏。应用捆绑包