如何在git中找到来源/主服务器的位置,以及如何更改它?


227

我是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分支从非混淆存储库中提取代码。

最近,当我在笔记本电脑上运行“ 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. 如果在其他地方,我如何将笔记本电脑变成“原产地/主人”?
  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到geekfor目录的新副本。

因此,看来我应该遵循dbr的建议并执行以下操作:

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

Answers:


202

1. 找出Git认为“来源/主”正在使用的位置 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. 如果在其他地方,我如何将笔记本电脑变成“原产地/主人”?

这样做是没有意义的。假设“来源”已重命名为“笔记本电脑”-您永远不想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 pushgit pull更新,而不是git push unfuddle master


1
他写道,他推送到origin存储库中(即使他不知道它是如何用git来表示的)–删除遥控器对他来说几乎不是一件有用的事情。
亚里斯多德·帕加尔兹

10
我不明白为什么人们会重新提出问题。它改变了问题的含义,使现有的答案变得毫无意义,也没有让其他人知道提问者需要更多的信息是基于他们的问题可能有点“不正确”的事实。
stu

9
删除远程源正是我需要的,因为它指向的是不再存在的本地存储库,而不是非混乱存储库。
布赖恩·凯利

3
斯图:改写是一件好事!如果他们首先没有说清楚的话,那么得到无法解决实际问题的答案是没有意义的。
dbr

4
但是生气和痛苦很容易。:-)但我明白你的意思。
stu

286

我来到这个问题,是在git的一般方案中寻找有关消息“您的分支在...前面”的含义的解释。这里没有答案,但是由于当您搜索短语“您的分支位于'origin / master'之前”时,此问题当前显示在Google的顶部,因此我已经弄清楚了消息的真正含义,我以为可以在此处发布信息。

因此,作为git新手,我可以看到我需要的答案显然是新手答案。具体来说,“您的分支前面...”一词的意思是,有些文件已添加并提交到本地存储库,但从未提交到源文件。至少对我而言,“ git diff”没有差异的事实进一步混淆了该消息的意图。直到我运行“ git diff origin / master”后,我才被告知本地存储库和远程主存储库之间存在差异。

因此,要明确:


“您的分支领先...” =>您需要推送到远程主服务器。运行“ git diff origin / master”以查看本地存储库和远程主存储库之间的区别。


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

(此外,我认识到,有些配置方面的微妙之处可能会使该解决方案部分无效,例如,主服务器实际上可能不是“远程”,并且“起源”是约定中使用的可重新配置名称,等等。但是,新手可以不在乎这种事情。我们想要简单明了的答案。解决了紧迫的问题之后,我们可以稍后再阅读其中的细微之处。)

伯爵


2
@Earl git diff --cached origin/master在这里不会是更好的说明,因为它指出下一次推送的结果是什么?您上面突出显示的命令还显示了未提交和未暂存的文件(我想我也是git新手)
nhed 2011年

48
git fetch如果在出现此错误后也有可能需要运行git pull remote branch。您的裁判可能已过时。git fetch解决该问题。
布莱恩·肯尼迪

origin/master部分意味着回购中的master分支origin
拉基布2011年

1
请注意,此描述不完整。我目前遇到问题, # On branch master # Your branch is ahead of 'origin/master' by 3 commits. 但是git diff origin / master却什么也没显示(和--cached选项不会改变它)。而且,git fetch不会更改此设置,git pull不会更改此设置,git reset --hard不会更改此设置。要更改此设置,我需要:git reset --hard origin / master而我选择该路由,因为其他人正在此存储库中与我一起工作,而我不想使他们的测试无效,并且因为我无法找出这些提交的内容是。
rdm'5

1
当我需要我也得到这个消息离而不是推到原点/主。例如,如果我git checkout master收到消息,则来自另一个分支,这意味着我应该git pull origin master在工作之前。但我觉得很困惑,因为该邮件的措辞暗示相反
Anentropic

38

我遇到的问题类似于我的工作目录,ahead of origin by X commitsgit pull导致了Everything up-to-date。我确实遵循了这个建议来修复它。我将其发布在这里,以防其他有类似问题的人使用。

基本修复方法如下:

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

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

$ git push origin master:master

1
谢谢,为我做到了。git diff没有显示任何内容,按照您的描述进行操作后,我不再收到此令人困惑和烦人的消息。
LaundroMat 2012年

1
需要更多的支持:)。投票结果较高的答案对我来说都是“无效”(即“ git fetch”-什么也没做...检查“ git remote show origin”-没什么不正确,不需要更改)
Adam


10

我以为我的笔记本电脑就是起源...

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

我怎样才能:

  1. git remote -v会告诉你什么originorigin/master是你的“书签”,为最后已知状态master的分支origin库,和你自己master是一个跟踪分支origin/master这就是应有的一切

  2. 你不知道 至少对于将存储库作为其自身的默认远程存储库而言,这没有任何意义。

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


1
我以我的笔记本电脑为起源,因为那是我第一次创建存储库的地方(起源于此)。
布赖恩·凯利

1
相反origin,在本地指向便携式计算机对我来说是完全有意义的,因为对于便携式计算机(如便携式计算机)而言,脱机或切换网络是非常常见的情况。这样,您就可以使用git pushgit pull任何时间,没有必要去想,如果你连接到正确的网络。目前。origin当网络链接可用时,可以根据当前的漫游状态自动将该本地与真实的远程服务器同步。有问题的部分是何时运行哪个同步,与之相比,GIT部分则相当容易。
蒂诺(Tino)

2
毫无疑问origin,指向笔记本电脑上的另一个存储库是很有意义的。但是origin,将存储库的指向自身本身并不会:不管您运行git push还是git pull,都没有任何区别,因为无论如何,存储库始终始终与自身完全同步。这是错误的,是一种重言式。
亚里斯多德·帕加兹

3

[解决方案]

$ git push origin

^这为我解决了。它所做的是,它使我的主机(在笔记本电脑上)与远程服务器上的“源”同步。


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状态”时,我被告知我领先于原始人。

# 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上。我没有掌握什么?


1
两件事情:rep2的“源/主”检查实际上并不查看rep1。如果在rep2中执行“ git pull”,它将注意到它们处于相同状态并停止抱怨。要实际查看推送到工作副本中的更改,您需要执行“ git checkout”-推送绝不要触摸目标存储库的工作副本。
Walter Mundt'7

我以为可能是这种情况,但是我收到“ git checkout M README,您的分支比1提交早于'origin / master'。” 但是我的工作副本实际上落后了1次提交,而不是提前。
Steve Hindmarch


1

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

所以我跑了

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

然后运行一次提交并推动。

那解决了问题。


1
仅当提交消息中显示
delete-

1

我也是git新手。我也遇到了同样的问题,即“您的分支比N / commit早于原始/主机”。进行建议的“ git diff origin / master”确实显示了一些我不愿意保留的差异。所以...

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

(在主机上)

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

为了方便起见,我经常在主机上对克隆进行更改。不再。我将对主服务器进行这些更改,在此处git commit,然后执行git pull。希望这可以使我在主机上的git clone保持完全同步。

/奈良


0

我想知道关于我的回购的同样的事情。就我而言,我有一个不再要推到的旧遥控器,因此需要将其卸下。

获取遥控器列表:

git remote

删除不需要的那一个

git remote rm {insert remote to remove}

0

您可以在进行自己的提交之前将其重置为特定的提交。

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

使用git log找什么样的commit是提交你有局部变化发生之前。

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

记下本地提交并直接重置为上一个提交:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

-1

我遇到了一个问题:“您的分支比nn commit领先于'origin / master'。” 当我用以下方法推送到远程存储库时:

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

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

git push

问题消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.