8

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

git fetch remote1 master
git checkout remote1/master

但是,我总是以一种超然的头脑状态而告终。签出遥控器主人并应用补丁的正确方法是什么?

4

2 回答 2

8

这些命令都不会给你一个超然的头脑。你还有没有在你的问题中写下的其他事情?

git fetch remote1

这将获取与默认 refspec 匹配的任何内容remote1。这通常意味着所有分支都打开,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 与本地分支(refs in 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 的新手,所以让我为你指出几个教程。第一个是尝试 Git。我喜欢它,因为您可以在网页上尝试这些命令,但它不是很深入。 Git Immersion更深入,对 Git 背后的概念有很好的介绍。NDP Software 的Git Cheatsheet也是关于命令如何影响本地和远程存储库的绝佳参考。最后,Pro Git是一本让你入门的好书。在线版本是免费的。

于 2013-12-15T22:58:21.687 回答
1

git fetch remote1 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

于 2013-12-16T00:58:09.623 回答