我是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进行部署,并使用主分支从unduddle存储库中提取代码。
最近,当我在笔记本电脑上运行“git status”时,我注意到下面的消息:
# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)
我很困惑为什么。我以为我的笔记本电脑是源头…但不知道是否我最初从Subversion或推送到unduddle是导致消息显示的原因。我怎样才能:
找出Git认为“源/主”在哪里?
如果是在其他地方,我如何把我的笔记本电脑变成“源/主”?
让这条信息消失。这让我觉得Git对某些事情不满意。
我的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时使用的临时目录,可能也是我从那里推送到unduddle的地方。然后我相信我检查了一个新的副本从unuddle到geekfor目录。
所以看起来我应该遵循dbr的建议,这样做:
git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git
1. 用Git -remote找出Git认为“origin/master”在哪里
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时,它会检查远程存储库是否缺少提交(与本地存储库相比),如果是,则检查提交的数量。如果你把所有的更改都推到“原点”,两者都会同步,所以你不会收到那个消息。
2. 如果是在其他地方,我如何把我的笔记本电脑变成“源/主”?
这样做毫无意义。说“origin”被重命名为“laptop”-你永远不想从你的笔记本电脑上做git push laptop。
如果你想删除原始远程,你可以这样做。
git remote rm origin
这不会删除任何东西(在文件-内容/修订-历史方面)。这将停止“您的分支领先于..”消息,因为它将不再将您的存储库与远程存储库进行比较(因为它已经消失了!)
有一件事要记住,关于origin没有什么特别的,它只是git使用的默认名称。
当你执行Git push或Git pull之类的操作时,Git默认使用origin。所以,如果你有一个经常使用的遥控器(在你的情况下是unuddle),我建议添加unuddle作为“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 unuddle master
在git的一般方案中,我提出这个问题是想了解“您的分支领先于……”这条消息的含义。这里没有答案,但由于这个问题目前出现在谷歌的顶部,当你搜索短语“你的分支在‘起源/主’之前”时,我已经弄清楚了这条消息的真正含义,我想我应该在这里发布信息。
So, being a git newbie, I can see that the answer I needed was a distinctly newbie answer. Specifically, what the "your branch is ahead by..." phrase means is that there are files you've added and committed to your local repository, but have never pushed to the origin. The intent of this message is further obfuscated by the fact that "git diff", at least for me, showed no differences. It wasn't until I ran "git diff origin/master" that I was told that there were differences between my local repository, and the remote master.
所以,明确一点:
“你的树枝领先……”=>需要推送到远程主服务器。运行"git diff origin/master"查看本地存储库和远程主存储库之间的差异。
希望这能对其他新手有所帮助。
(此外,我认识到有一些配置上的微妙之处可能会部分地使这个解决方案无效,例如主服务器实际上可能不是“远程”的事实,以及“origin”是根据约定使用的可重新配置的名称,等等。但是新手们并不关心这类事情。我们想要简单直接的答案。一旦我们解决了这个紧迫的问题,我们可以稍后阅读其中的微妙之处。)
Earl
我正在与这个问题作斗争,之前的答案都没有解决我所看到的问题。我已经把问题还原到最基本的部分,看看能不能把问题说清楚。
我创建了一个新的存储库(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'时,我被告知我在origin之前。
# 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与第二次提交之前的README相同。我所做的唯一修改是rep1,我想做的就是把它们推到rep2。我没有抓住什么?