【问题标题】:git pull remote master in detached headgit pull remote master in detached head
【发布时间】:2013-12-15 22:29:24
【问题描述】:

这一直困扰着我关于 git 的问题。我有一个包含多个遥控器的存储库,我需要将修补程序应用于遥控器的主分支。所以,我尝试做:

git fetch remote1 master
git checkout remote1/master

但是,我总是处于一个超然的头部状态。签出远程主机并应用补丁的正确方法是什么?

【问题讨论】:

  • 不,git fetch 不会移动您的 HEAD,因此不会导致头分离。而且您的git pull 命令无效:它需要一个远程作为参数,而不是某个远程分支。请添加究竟你做了什么,以及为什么你认为它会导致头部分离。
  • 好的,我想我澄清了一点。并将命令修复为我实际在做的事情,而不是我认为我在做的事情。对此感到抱歉。
  • @user2659205 感谢您更新您的命令。我已经更新了我的答案,但有个快速的问题:remote1 实际上是 origin 在你的情况下吗?或者它真的是一个不同的存储库?你有权限推送吗?你想分享你正在制作的补丁吗?所有这些问题都会影响答案。 :-( 我在回答中做了几个假设,但如果你的情况不同,我可以改变它。
  • 是的,remote1 是一个单独的仓库,我可以访问。我试图找出对我们的测试和实时服务器进行修补程序的最佳工作流程。感谢您的详细回答。这几乎就是我最终做的事情。是的,我还是 git 的新手,所以我还在学习,我一定会去看看那些网站。我想我只是对需要将 remote1 检出到另一个分支的想法有疑问。只是感觉很奇怪,但我会习惯的:)

标签: git git-patch git-detached-head


【解决方案1】:

这些命令都不会让你心不在焉。你还有没有在你的问题中写下的其他事情?

git fetch remote1

这将获取与 remote1 的默认 refspec 匹配的任何内容。这通常意味着 remote1 上的所有分支,除非您进行了不同的配置。

git fetch remote1 master

上述命令从remote1 中获取master 并将其存储为FETCH_HEAD

git pull remote1/master

此命令将出错,因为 remote1/master 不是存储库的名称。

有几种方法可以解决问题,但这实际上取决于您要完成的任务。典型的做法是为要更新的远程分支创建一个本地分支,然后合并相应的分支:

git checkout -b r1-master remote1/master
git merge other/master
git push

但是,尚不清楚这是否是您可以接受的工作流程。你能发布更多关于你想要完成的事情的信息吗?

更新

感谢您使用实际使用的命令更新您的问题。

git fetch remote1 master

上面的命令抓取master的最新内容,存储在FETCH_HEAD。你想在这里去掉master,让Git更新你的远程引用:git fetch remote1。在此指针处,remote1/master 应该与服务器上的内容保持同步。

git checkout remote1/master

这是为您提供分离的HEAD 的命令。远程引用与本地分支不同(refs/heads 中的引用)。当您签出远程引用时,Git 会将您置于分离的 HEAD 状态。我相信这背后的想法是防止你破坏你对远程分支的看法。远程 ref 可以作为您上次获取时远程存储库状态的快照。让你承诺他们会破坏这种观点。本地分支机构是需要进行编辑的地方。

让我们做几个假设。首先,我将假设remote1 不是origin,并且您已添加此远程以与主存储库以外的其他存储库进行交互。其次,我假设你有能力将代码推送到remote1

在继续之前,让我们确保将push.default 设置为合理的值。运行git config --global push.default。如果没有返回任何内容,或者它显示matching,那么让我们更改它。默认配置 (matching) 将尝试在推送时更新特定远程的所有参考。如果您不使分支机构的本地版本保持最新,这会产生删除人们工作的副作用。更好的默认值是upstream,它只会推送你所在的分支。设置它:

git config --global push.default upstream

在 Git 中添加补丁的典型方法是创建一个分支,制作补丁,将其合并到远程分支的本地表示中,然后将结果推送到远程分支。

让我们从创建远程 master 的本地分支开始:

git checkout -b r1-master remote1/master

现在我们有一个名为 r1-master 的本地分支,我们可以对其进行更新(HEAD 不会在此分支上分离)。

接下来,做你的工作。这通常涉及创建另一个分支并向其添加一系列补丁:

git checkout -b fix-bugs r1-master
# Edit and commit

接下来,您需要再次结帐r1-master。在进行更改时,有人可能在 remote1/master 上引入了新的提交,所以让我们确保我们是最新的:

git fetch remote1

接下来,在 bug fix 分支中合并:

git merge fix-bugs

这将弹出一个编辑器。添加一条关于合并修复内容的合理日志消息,然后保存并退出。

此时,r1-master 已包含您的修复程序,但它不在远程服务器上。我们需要将新引入的修复推送到远程服务器:

git push

此时,r1-masterremote1/master 应该指向同一个东西,并且远程服务器已更新为您的修复。

其他帮助

对于它的价值,您似乎是 Git 新手,所以让我为您指出几个教程。第一个是Try Git。我喜欢它,因为您可以在网页上尝试这些命令,但它不是很深入。 Git Immersion 更深入,并且对 Git 背后的概念有很好的介绍。 NDP Software 的Git Cheatsheet 也是关于命令如何影响本地和远程存储库的绝佳参考。最后,Pro Git 是一本可以帮助您入门的好书。在线版本是免费的。

【讨论】:

    【解决方案2】:

    git fetch remote1 master 将获取远程的 master 分支并将其存储在 FETCH_HEAD 中,remote1/master 中。 - 你只需要git fetch remote1,或git fetch --all

    git checkout remote1/master 将始终将您置于分离头模式,因为您没有指定本地分支。 - 你想要像git checkout -b master remote1/master 这样的东西。

    请阅读git help fetchgit help checkout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-09
      • 2022-08-17
      • 2012-09-14
      • 2011-02-22
      • 2013-11-06
      • 2018-10-18
      • 2020-07-27
      相关资源
      最近更新 更多