233

我是一个 Git 新手。我最近将一个 Rails 项目从 Subversion 移到了 Git。我在这里按照教程:http ://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

我也在使用 unfuddle.com 来存储我的代码。我在上下班的火车上对我的 Mac 笔记本电脑进行了更改,然后在我有网络连接时使用以下命令将它们推送到 unfuddle:

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 的事实是否是导致消息显示的原因。我怎样才能:

  1. 找出 Git 认为“起源/主人”在哪里?
  2. 如果它在其他地方,我如何将我的笔记本电脑变成'origin/master'?
  3. 收到此消息即可离开。这让我觉得 Git 对某事不满意。

我的 Mac 正在运行 Git 版本 1.6.0.1。


当我git remote show origin按照 dbr 的建议运行时,我得到以下信息:

~/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

当我git remote -v按照 Aristotle Pagaltzis 的建议运行时,我得到以下信息:

~/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 时使用的临时目录,并且可能是我推到 unfuddle 的地方。然后我相信我从 unfuddle 到geekfor目录中检查了一个新副本。

所以看起来我应该听从 dbr 的建议并做:

git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git
4

13 回答 13

285

我来到这个问题是为了寻找关于“你的分支在……前面”的消息的解释,在 git 的一般方案中是什么意思。这里没有答案,但是由于这个问题目前出现在谷歌的顶部,当你搜索“你的分支在'origin/master'之前”这个短语时,我已经弄清楚了这个消息的真正含义,我想我会在这里发布信息。

所以,作为一个 git 新手,我可以看到我需要的答案是一个明显的新手答案。具体来说,“您的分支在...之前”这句话的意思是您已经添加并提交到本地存储库的文件,但从未推送到源。至少对我来说,“git diff”没有显示出任何差异这一事实进一步混淆了这条消息的意图。直到我运行“git diff origin/master”,我才被告知我的本地存储库和远程主存储库之间存在差异。

所以,要清楚:


“你的分支在前面……” => 你需要推送到远程主机。运行“git diff origin/master”以查看本地存储库和远程主存储库之间的差异。


希望这对其他新手有所帮助。

(另外,我承认有些配置的细微之处可能会使这个解决方案部分失效,例如 master 可能实际上不是“remote”,并且“origin”是约定使用的可重新配置的名称,等等。但是新手确实不关心这类事情。我们想要简单、直接的答案。一旦我们解决了紧迫的问题,我们可以稍后阅读其中的微妙之处。)

伯爵

于 2010-04-06T17:00:57.487 回答
214

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,它会检查远程是否缺少提交(与您的本地存储库相比),如果是,则检查有多少提交。如果您将所有更改推送到“原点”,两者都将同步,因此您不会收到该消息。

2.如果它在其他地方,我如何将我的笔记本电脑变成'origin/master'?

这样做没有任何意义。说“起源”被重命名为“笔记本电脑”——你永远不想git push laptop从你的笔记本电脑上做。

如果要删除原始遥控器,请执行此操作..

git remote rm origin

这不会删除任何内容(就文件内容/修订历史而言)。这将停止“您的分支在前面......”消息,因为它不再将您的存储库与远程存储库进行比较(因为它已经消失了!)

要记住的一件事是 没有什么特别的origin,它只是 git 使用的默认名称。

当你做origin类似git pushgit 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 pushgit pull更新,而不是git push unfuddle master

于 2008-11-10T06:16:45.063 回答
39

我遇到了一个与我的工作目录类似的问题,ahead of origin by X commitsgit pull结果是Everything up-to-date. 我确实按照这个建议设法解决了这个问题。我在这里发布这个,以防它帮助其他有类似问题的人。

基本修复如下:

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

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

$ git push origin master:master
于 2011-03-30T01:02:42.803 回答
24

有时,原始主机(origin/master)的本地缓存版本和真正的原始主机之间存在差异。

如果你运行git remote update这将与 origin/master 重新同步原始 master

请参阅此问题的已接受答案

git pull origin master 和 git pull origin/master 的区别

于 2012-06-08T12:47:06.160 回答
10

我以为我的笔记本电脑是起源……</p>

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

我怎样才能:

  1. git remote -v会告诉你是什么origin是您对存储库分支的origin/master最后已知状态的“书签” ,而您自己的则是. 这一切都应该如此masteroriginmasterorigin/master

  2. 你没有。至少将存储库作为其自身的默认远程存储库是没有意义的。

  3. 它不是。它只是告诉您,您在本地进行了一些不在远程存储库中的提交(根据该存储库的最后已知状态)。

于 2008-11-10T05:09:59.317 回答
3

[ 解决方案 ]

$ git push origin

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

于 2011-06-01T19:28:24.857 回答
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。我没有掌握什么?

于 2010-07-29T18:10:13.527 回答
1

等你“推”。尝试:

$ git push

于 2011-04-20T03:03:51.777 回答
1

我最近遇到了这个问题,我认为这是因为我删除了一些不再需要的文件。问题是 git 不知道文件已被删除,它看到服务器仍然有它。(服务器 = 来源)

所以我跑了

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

然后运行提交并推送。

这解决了这个问题。

于 2011-07-25T22:22:19.877 回答
1

我也是一个 git 新手。我遇到了同样的问题,即“您的分支在 N 次提交之前位于 origin/master 之前”消息。执行建议的“git diff origin/master”确实显示了一些我不想保留的差异。所以 ...

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

(在主机上)

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

为了方便起见,我曾经在我的主机上对克隆进行更改。不再。我将对 master 进行这些更改,在那里 git commit 并执行 git pull。希望这应该让我在主机上的 git clone 完全同步。

/奈良

于 2012-01-03T23:17:21.257 回答
0

我对我的回购也有同样的疑惑。就我而言,我有一个旧遥控器,我不再推它了,所以我需要将它移除。

获取遥控器列表:

git remote

删除不需要的

git remote rm {insert remote to remove}
于 2011-06-10T00:07:17.787 回答
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
于 2011-08-23T15:24:19.233 回答
-1

我遇到了问题“您的分支在 nn 次提交之前领先于 'origin/master'。” 当我推送到远程存储库时:

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

当我发现我的远程地址在文件 .git/FETCH_HEAD 中并使用时:

git push

问题消失了。

于 2012-01-17T11:48:34.007 回答