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

我以为我的笔记本电脑是源头…

这有点荒谬:origin指的是默认的远程存储库——您通常从中获取/提取其他人的更改。

我怎样才能:

git remote -v will show you what origin is; origin/master is your “bookmark” for the last known state of the master branch of the origin repository, and your own master is a tracking branch for origin/master. This is all as it should be. You don’t. At least it makes no sense for a repository to be the default remote repository for itself. It isn’t. It’s merely telling you that you have made so-and-so many commits locally which aren’t in the remote repository (according to the last known state of that repository).


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。我没有抓住什么?


我有一个类似的问题,我的工作目录在X提交之前,但git拉导致一切都是最新的。我确实按照这个建议解决了这个问题。我把这个贴在这里,希望它能帮助其他有类似问题的人。

基本修复如下:

$ git push {remote} {localbranch}:{remotebranch}

括号中的单词应替换为您的远程名称、本地分支名称和远程分支名称。如。

$ git push origin master:master

它在等着你去“推”。试一试:

$ git push


【解决方案】

$ git push origin

这为我解决了问题。 它做了什么,它同步我的主(在笔记本电脑上)与“原点”,这是在远程服务器上。


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

获取遥控器列表:

git remote

删除你不需要的那个

git remote rm {insert remote to remove}

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

所以我跑了

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

然后运行commit和push。

这就解决了问题。


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

$ 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

我也是个菜鸟。我遇到了同样的问题,'你的分支领先于原点/master的N个提交'消息。执行建议的“git diff origin/master”确实显示了一些我不愿意保留的差异。所以…

由于我的git克隆是用于托管的,我想要一个主回购的精确副本,并且不关心保留任何本地更改,我决定保存我的整个回购,并创建一个新的:

(主机上)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

为了方便起见,我过去常常对主机上的克隆进行更改。没有更多的。我将对master进行这些更改,git commit,然后进行git pull。希望这能使我的git克隆在主机上保持完全同步。

/回头见


当我推送到远程存储库时,我遇到了“你的分支在nn提交的'origin/master'之前”的问题:

git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git

当我发现我的远程地址在文件。git/FETCH_HEAD和使用:

git push

问题消失了。


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

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

请看这个问题的公认答案

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