我是Git新手。我最近将一个Rails项目从Subversion移到了Git。我按照教程:http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/
我也在使用unfuddle.com来存储我的代码。我在火车上下班时使用我的Mac笔记本电脑进行更改,然后在使用以下命令进行网络连接时将它们推到一起:
git push unfuddle master
我使用Capistrano进行部署,并使用master分支从unfuddle存储库中提取代码。
最近,当我在笔记本电脑上运行“git status”时,我注意到以下消息:
# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)
我很困惑为什么。我以为我的笔记本电脑是原产地...但不知道我最初是从Subversion拉出来还是推送到Unfuddle,这是导致消息显示的原因。我怎么能:
我的mac正在运行Git版本1.6.0.1。
当我按照dbr的建议运行git remote show origin
时,我得到以下内容:
~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly
当我按照Aristotle Pagaltzis的建议运行git remote -v
时,我得到以下内容:
~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin /Users/brian/Projects/GeekFor/gf/.git
unfuddle git@spilth.unfuddle.com:spilth/geekfor.git
现在,有趣的是,我正在geekfor
目录中处理我的项目,但它说我的来源是gf
目录中的本地机器。我相信gf
是我将项目从Subversion转换为Git时使用的临时目录,也可能是我推动它解开的地方。然后我相信我从一个新的副本到geekfor
目录。
所以看起来我应该遵循dbr的建议并做:
git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git
答案 0 :(得分:285)
我来到这个问题寻找关于“你的分支在......前面”的信息的解释,意思是,在git的一般方案中。这里没有答案,但是当你搜索“你的分支领先于'origin / master'”这个短语时,这个问题目前显示在谷歌的顶端,我已经弄明白了这个消息的真正含义,我以为我会在这里发布信息。
所以,作为一个git新手,我可以看到我需要的答案是一个明显的新手答案。具体来说,“你的分支在......前面”的短语意味着你已经添加并提交到本地存储库的文件,但从未推送到原点。这个消息的意图进一步模糊了这样一个事实:“git diff”,至少对我而言,没有显示出任何差异。直到我运行“git diff origin / master”,才被告知我的本地存储库和远程主服务器之间存在差异。
所以,要明确:
“你的分支领先......” =>您需要推送到远程主站。运行“git diff origin / master”以查看本地存储库与远程主存储库之间的差异。
希望这有助于其他新手。
(另外,我认识到存在可能部分地使该解决方案无效的配置细微之处,例如主设备实际上可能不是“远程”的事实,并且“origin”是约定所使用的可重新配置的名称等。但新手不关心那种事情。我们想要简单明了的答案。一旦我们解决了紧迫的问题,我们可以在稍后阅读细微之处。)
厄尔
答案 1 :(得分:191)
1.
找出Git认为'origin / master'正在使用的地方git-remote
git remote show origin
..将返回类似的东西。
* remote origin
URL: me@remote.example.com:~/something.git
Remote branch merged with 'git pull' while on branch master
master
Tracked remote branch
master
远程基本上是指向远程存储库的链接。当你这样做..
git remote add unfuddle me@unfuddle.com/myrepo.git
git push unfuddle
.. git会将更改推送到您添加的地址。它就像一个书签,用于远程存储库。
运行git status
时,它会检查远程是否缺少提交(与本地存储库相比),如果是,则检查提交的数量。如果您将所有更改都推送到“origin”,则两者都将同步,因此您将不会收到该消息。
2.
如果它在其他地方,我如何将笔记本电脑变成'原产地/主人'?
这样做没有意义。说“origin”被重命名为“laptop” - 你永远不想从你的笔记本电脑上做git push laptop
。
如果要删除原始遥控器,请执行..
git remote rm origin
这不会删除任何内容(就文件内容/修订历史而言)。这将停止“你的分支正前方......”消息,因为它将不再将你的存储库与遥控器进行比较(因为它已经消失了!)
要记住的一件事是origin
没有什么特别之处,它只是git使用的默认名称。
当您执行origin
或git push
等操作时,Git会默认使用git pull
。所以,如果你有一个遥控器,你使用了很多(在你的情况下是Unfuddle),我建议你将unfuddle添加为“origin”:
git remote rm origin
git remote add origin git@subdomain.unfuddle.com:subdomain/abbreviation.git
或使用set-url:
在一个命令中执行上述操作git remote set-url origin git@subdomain.unfuddle.com:subdomain/abbreviation.git
然后您可以简单地git push
或git pull
进行更新,而不是git push unfuddle master
答案 2 :(得分:38)
我遇到的问题与我的工作目录ahead of origin by X commits
类似,但git pull
导致Everything up-to-date
。我确实按照this advice设法解决了这个问题。我在这里发帖,以防其他人遇到类似问题。
基本修复如下:
$ git push {remote} {localbranch}:{remotebranch}
括号中的单词应替换为您的远程名称,本地分支名称和远程分支名称。 e.g。
$ git push origin master:master
答案 3 :(得分:24)
有时原始主文件(origin / master)的本地缓存版本与真正的原始主文件之间存在差异。
如果你运行git remote update
,这将使用origin / master
查看此问题的已接受答案
Differences between git pull origin master & git pull origin/master
答案 4 :(得分:9)
我以为我的笔记本电脑是原产地......
这有点荒谬:origin
指的是默认的远程存储库 - 您通常从其中获取/拉取其他人的更改。
我怎么能:
git remote -v
会告诉您origin
是什么; origin/master
是master
存储库的origin
分支的最后已知状态的“书签”,您自己的master
是tracking branch的This is all as it should be 1}}。 {{3}}
你没有。至少将存储库作为自身的默认远程存储库是没有意义的。
事实并非如此。它只是告诉你,你已经在本地进行了那么多的提交,这些提交不在远程存储库中(根据该存储库的最后已知状态)。
答案 5 :(得分:3)
[解决方案]
$ git push origin
^这为我解决了。 它做了什么,它将我的主人(在笔记本电脑上)与远程服务器上的“原点”同步。
答案 6 :(得分:1)
我正在努力解决这个问题,之前的答案都没有解决我所看到的问题。我已经把这个问题简化为基础知识,看看我是否可以解决问题。
我创建了一个新的存储库(rep1),在其中放入一个文件并提交它。
mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"
我创建了rep1的克隆并将其命名为rep2。我查看rep2内部,看文件是否正确。
cd ~
git clone ~/rep1 rep2
cat ~/rep2/README
在rep1中,我对文件进行了一次更改并提交了它。然后在rep1中创建一个指向rep2的遥控器并推送更改。
cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master
现在,当我进入rep2并做一个'git status'时,我被告知我已经领先于原点。
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README
#
在第二次提交之前,rep2中的README与最初一样。我所做的唯一修改是rep1,我想做的就是将它们推送到rep2。什么是我不能理解?
答案 7 :(得分:1)
等着你“推”。尝试:
$ git push
答案 8 :(得分:1)
我最近遇到了这个问题,我认为这是因为我删除了一些我不再需要的文件了。问题是git不知道文件已被删除,并且它看到服务器仍然拥有它。 (server = origin)
所以我跑了
git rm $(git ls-files --deleted)
然后运行提交并推送。
解决了这个问题。
答案 9 :(得分:1)
我也是一个git新手。我遇到了同样的问题,'你的分支是在原始/主要由N提交'消息。做建议的'git diff origin / master'确实显示了一些我不想保留的差异。所以...
由于我的git克隆用于托管,并且我想要一个主要仓库的精确副本,并且不关心保留任何本地更改,我决定保存我的整个仓库,并创建一个新的:
(在主机上)
mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo
为了方便起见,我曾经在我的主机上对克隆进行了更改。不再。我将对master进行更改,git在那里进行修改,并执行git pull。希望这应该让我的git clone在主机上完全同步。
/奈良
答案 10 :(得分:0)
我想知道关于我的回购的同样的事情。在我的情况下,我有一个旧的遥控器,我不再推动,所以我需要删除它。
获取遥控器列表:
git remote
删除你不需要的那个
git remote rm {insert remote to remove}
答案 11 :(得分:0)
在您自己的提交发生之前,可以重置为特定的提交。
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)
使用git log
查找在本地更改发生之前提交的提交内容。
$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...
记下本地提交并直接重置到之前的提交:
git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
答案 12 :(得分:-1)
我遇到了问题“nn提交你的分支领先于'origin / master'。”当我用:
推送到远程存储库时git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git
当我发现我的远程地址位于.git / FETCH_HEAD文件中并使用时:
git push
问题消失了。