2011-05-11 218 views
44

我没有得到git rebase origingit rebase origin/master之间的差异。在我的情况下,我克隆了一个git仓库两次。在第一个克隆中,我必须使用git rebase origin,而在另一个克隆中,我必须使用git rebase origin/master“git rebase origin”与“git rebase origin/master”

一个例子:http://paste.dennis-boldt.de/2011/05/11/git-rebase

+0

你能提供更多关于你在做什么的信息吗? 'git rebase origin'应该不起作用,因为'origin'是一个远程而不是分支(至少默认情况下,你可以命名一个分支源。) – asm 2011-05-11 11:43:27

+0

我在我的问题中增加了一个例子。一旦我能够使用'git rebase origin'(第27行)。在另一个克隆它不工作(第54行),所以我必须使用'git rebase origin/master'(第57行) – Dennis 2011-05-11 12:23:35

+0

这两个表单都使用[gitrevisions](https://www.kernel.org/pub/)软件/ scm/git/docs/gitrevisions.html)语法来命名特定的提交。正如手册页所指出的,“origin”意思是“实际上”,无论哪个“origin/*”分支由“origin/HEAD”命名。最常见的是'origin/HEAD'命名'origin/master'(这显示在'git branch -r'输出中,作为'origin/HEAD-> origin/master')。如果'origin/HEAD' *失踪*,您只会得到一个错误(如@Dennis所做的那样)。如果你是“远程设置头部”(如同在接受的答案中那样),你可以选择'origin/HEAD'的解析方式。 – torek 2017-03-06 04:57:11

回答

19

这里有一个更好的选择:

git remote set-head -a origin 

从文档:

使用-a,查询远程以确定其HEAD,然后$ GIT_DIR/remotes // HEAD被设置为同一分支。例如,如果远程HEAD指向下一个,则“git remote set-head origin -a”将把$ GIT_DIR/refs/remotes/origin/HEAD设置为refs/remotes/origin/next。这只有在refs/remotes/origin/next已经存在时才有效;如果不是,它必须先取得。

这实际上已经有相当长的一段时间了(从v1.6.3开始);不知道我错过了它!

+3

我从来没有回答过:现在我用了很多,而且工作得很好! – Dennis 2013-10-12 11:34:33

+0

当我尝试'git rebase origin'时,我看到错误'invalid upstream origin'。运行这个命令解决了我的问题。 – DrStrangepork 2014-11-13 18:39:28

48

git rebase origin意味着“从origin跟踪分支衍合”,而git rebase origin/master的意思是“从分支的originmaster变基”

你必须有一个跟踪分支~/Desktop/test,其中意味着git rebase origin知道origin的哪个分支将与之分开。如果没有跟踪分支存在(在~/Desktop/fallstudie的情况下),git不知道它必须采用哪个分支origin,并且失败。

为了解决这个问题,可以使现有的master分支轨迹origin/master

git branch --set-upstream master origin/master 
+0

其实我找到了唯一的区别:'test'另外有'remotes/origin/HEAD'。所以,你是对的。我如何将这个添加到克隆'fallstudie'? http://paste.dennis-boldt.de/2011/05/11/git-branch – Dennis 2011-05-11 13:08:47

+0

'git branch --set-upstream master origin/master' – CharlesB 2011-05-11 13:11:47

+0

这不是解决方案。该错误仍然是'无效的上游原点',并且仍然只有一个原点分支。 – Dennis 2011-05-11 13:33:37

2

你可以用名称为“HEAD” [git的\裁判\遥控器\起源]下一个新的文件,并把内容“ref:refs/remotes/origin/master”。这应该可以解决你的问题。

看来,从空回购克隆将导致此。也许空的回购没有HEAD,因为没有提交对象存在。

可以使用

git的日志--remotes --branches --oneline --decorate

看到每个库之间的区别,而 “问题” 一不有“原产地/ HEAD”

编辑:给出一个使用命令行的方式
你也可以使用git命令行来做到这一点,他们有相同的结果

git的象征-REF参/遥控器/产地/ HEAD参/遥控器/产地/主

+0

正确,看起来就是这样。有了这个额外的文件,我得到了错过的HEAD分支。我在我的Linux系统上做过:'echo“ref:refs/remotes/origin/master”> .git/refs/remotes/origin/HEAD'。感谢冬天。 – Dennis 2011-05-11 15:17:42

+1

@丹尼斯:这里的结论是'origin'意思是'origin/HEAD',但是git对于确定原点的HEAD有点不确定。远程协议实际上并不允许传输符号引用,因此当您克隆时,它会有效地向远程发送HEAD的SHA1,然后指出ref也指向该提交。 (如果有多个,它会首先选择主人。)而远程更新等实际上并不会触及遥控器的头部,所以如果您在克隆时没有得到它,则会被卡住。 – Cascabel 2011-05-12 03:22:37

+0

@Jefromi:我意识到git是有问题的。谢谢你的解释。 – Dennis 2011-05-12 11:09:31