Git让我一直困惑。我有一个带有多个远程分支的仓库,需要对这些远程分支的主分支应用热修复。所以,我尝试执行以下操作:
git fetch remote1 master
git checkout remote1/master
但是,我总是陷入游离的HEAD状态。如何正确检出远程主机的主分支并应用补丁?
Git让我一直困惑。我有一个带有多个远程分支的仓库,需要对这些远程分支的主分支应用热修复。所以,我尝试执行以下操作:
git fetch remote1 master
git checkout remote1/master
但是,我总是陷入游离的HEAD状态。如何正确检出远程主机的主分支并应用补丁?
这些命令都不会让你的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-master
和remote1/master
应该指向相同的内容,远程服务器已更新您的修复。
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 fetch
和git help checkout
。
git fetch
不会移动你的 HEAD,因此也不会导致分离的 HEAD。而且你的git pull
命令是无效的:它需要一个远程作为参数,而不是一些远程分支。请添加你所做的 确切 操作,以及为什么你认为它会导致分离的 HEAD。 - michasremote1
实际上是origin
吗?还是它真的是一个不同的存储库?您是否有权限将其推送到该存储库?您是否想分享您正在制作的补丁?所有这些问题都会影响答案。 :-( 我在我的答案中做出了一些假设,但如果您的情况不同,我可以进行更改。 - John Szakmeister