git拉远程主机在分离头

时间:2013-12-15 22:29:24

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

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

git fetch remote1 master
git checkout remote1/master

但是,我总是处于一个独立的头状态。检查远程主控并应用补丁的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

这些命令都不会给你一个分离的头。你还有其他的东西,你没有在你的问题中写下来吗?

git fetch remote1

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

git fetch remote1 master

以上命令从master获取remote1并将其存储为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状态。我相信这背后的想法是让你不要破坏你对远程分支的看法。远程引用用于作为上次获取时远程存储库状态的快照。让你承诺他们会破坏这种观点。当地分支机构需要进行编辑。

让我们做一些假设。首先,我将假设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

接下来,合并错误修复分支:

git merge fix-bugs

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

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

git push

此时,r1-masterremote1/master应指向相同的内容,并且远程服务器已使用您的修复程序进行了更新。

其他帮助

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

答案 1 :(得分:1)

git fetch remote1 master将获取远程主分支并将其存储在FETCH_HEAD中的remote1/master而不是中。git fetch remote1。 - 您只需要git fetch --allgit checkout remote1/master

git checkout -b master remote1/master将始终使您处于分离头模式,因为您没有指定本地分支。 - 你想要git help fetch

请阅读git help checkout和{{1}}。