在分离头状态下执行git pull remote master

9

Git让我一直困惑。我有一个带有多个远程分支的仓库,需要对这些远程分支的主分支应用热修复。所以,我尝试执行以下操作:

git fetch remote1 master
git checkout remote1/master

但是,我总是陷入游离的HEAD状态。如何正确检出远程主机的主分支并应用补丁?


不,git fetch 不会移动你的 HEAD,因此也不会导致分离的 HEAD。而且你的 git pull 命令是无效的:它需要一个远程作为参数,而不是一些远程分支。请添加你所做的 确切 操作,以及为什么你认为它会导致分离的 HEAD。 - michas
好的,我觉得我澄清了一点。并且修正了命令,使其符合我实际操作的内容,而不是我以为的。对此感到抱歉。 - user2659205
@user2659205 感谢您更新您的命令。我已经更新了我的答案,但是有一个快速问题:在您的情况下,remote1实际上是origin吗?还是它真的是一个不同的存储库?您是否有权限将其推送到该存储库?您是否想分享您正在制作的补丁?所有这些问题都会影响答案。 :-( 我在我的答案中做出了一些假设,但如果您的情况不同,我可以进行更改。 - John Szakmeister
是的,remote1是一个单独的仓库,我有权限。我正在尝试找出最佳工作流程,以便对我们的测试和生产服务器进行热修复。感谢您详细的回答,这基本上就是我最终采取的方式。是的,我还是Git新手,所以我仍在学习,并且一定会查看那些网站。我想我只是对需要将remote1检出到不同分支的想法有些困惑。这感觉有点奇怪,但我会逐渐习惯的 :) - user2659205
2个回答

10

这些命令都不会让你的HEAD分离。你是否还有其他操作没有在问题中提到?

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

以上命令会获取主分支的最新内容并将其存储在FETCH_HEAD中。在这里你不想加上master,而是让Git更新你的远程引用:git fetch remote1。此时,remote1/master应该与服务器上的内容保持最新。

git checkout remote1/master

这是一个让你获得分离的HEAD的命令。远程引用与本地分支(在refs/heads中的引用)不同对待。当你检出一个远程引用时,Git会将你置于分离的HEAD状态。我认为背后的想法是为了防止你破坏对远程分支的视图。远程引用存在的目的是作为上次拉取远程仓库状态的快照。让你提交到它们会破坏这个视图。编辑必须在本地分支上进行。
让我们做几个假设。首先,我假设remote1不是origin,并且您添加了此远程以与主要存储库交互。其次,我假设您有能力将代码推送到remote1
在继续之前,让我们确保push.default设置为合理的值。运行git config --global push.default。如果没有返回任何内容,或者说matching,那么让我们进行更改。默认配置(matching)将尝试在特定远程的推送上更新所有引用。这会有一个副作用,如果您不保持分支的本地版本最新,则会删除其他人的工作。更好的默认值是upstream,它只会推送你所在的分支。使用以下命令设置:
git config --global push.default upstream

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

首先,让我们创建远程主分支的本地分支:

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修复分支合并进来:

git merge fix-bugs

这将弹出一个编辑器。添加一个合理的日志信息,说明合并所修复的问题,然后保存并退出。
此时,r1-master 已经包含了您的修复,但它还没有在远程服务器上。我们需要将新引入的修复推送到远程服务器:
git push

此时,r1-masterremote1/master应该指向相同的内容,远程服务器已更新您的修复。

其他帮助

就知识而言,看起来您是Git新手,所以让我指向一些教程。首先是尝试Git。我喜欢它,因为您可以在网页上尝试命令,但它不是很详细。 Git沉浸式学习更加深入,并且对Git背后的概念进行了优秀的演示。 NDP Software的Git速查表也是对本地和远程代码库如何受到命令影响的出色参考。最后,Pro Git是一个好的入门书籍,其在线版本是免费的。

2

git fetch remote1 master将获取远程主机的master分支并存储在FETCH_HEAD中,而不是remote1/master。 - 您只需使用git fetch remote1git fetch --all

git checkout remote1/master总是会使您进入游离头模式,因为您没有指定一个本地分支。 - 您需要像这样使用git checkout -b master remote1/master

请阅读git help fetchgit help checkout


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接