我是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

当前回答

在您自己的提交发生之前,可以将其重置为特定的提交。

$ 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

其他回答

有时,本地缓存的origin master (origin/master)版本与真正的origin master之间存在差异。

如果你运行git远程更新,这将使origin master与origin/master重新同步

请看这个问题的公认答案

git pull origin master和git pull origin/master之间的差异

我最近遇到了这个问题,我想这是因为我删除了一些我不再需要的文件。问题是git不知道文件已经被删除了,它看到服务器上还有文件。(server = origin)

所以我跑了

git rm $(git ls-files --deleted)

然后运行commit和push。

这就解决了问题。

我正在与这个问题作斗争,之前的答案都没有解决我所看到的问题。我已经把问题还原到最基本的部分,看看能不能把问题说清楚。

我创建了一个新的存储库(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。我没有抓住什么?

我也在想我的回购。以我为例,我有一个旧遥控器,我不再按它了,所以我需要把它拿走。

获取遥控器列表:

git remote

删除你不需要的那个

git remote rm {insert remote to remove}

在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