【问题标题】:How can I find the location of origin/master in git, and how do I change it?如何在 git 中找到 origin/master 的位置,以及如何更改它?
【发布时间】:2010-09-21 13:58:21
【问题描述】:

我是一名 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 认为 'origin/master' 在哪里?
  2. 如果它在其他地方,我如何将我的笔记本电脑变成'origin/master'?
  3. 让此消息消失。这让我觉得 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 时使用的临时目录,并且可能是我推到 unfuddle 的地方。然后我相信我从 unfuddle 到 geekfor 目录中检查了一份新副本。

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

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

【问题讨论】:

    标签: git git-push git-remote


    【解决方案1】:

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

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

    所以,要清楚:


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


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

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

    伯爵

    【讨论】:

    • @Earl git diff --cached origin/master 在这里不是更好的说明,因为它说明了下一次推送的结果是什么?您上面突出显示的命令还显示未提交和未暂存的文件(我想,我也是一个 git 新手)
    • 如果您在git pull remote branch 之后收到此错误,也可能需要运行git fetch。你的 refs 可能已经过时了。 git fetch 解决了这个问题。
    • origin/master 部分是指master 分支在origin repo 中吗?
    • 请注意,此描述不完整。我目前正在经历 # 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 我选择这条路线是因为其他人正在这个存储库中与我一起工作,我不想让他们的测试无效,而且因为我无法找出这些提交是什么是。
    • 当我需要而不是推送到 origin/master 时,我也会收到此消息。例如,如果我从另一个分支git checkout master 我收到消息,这意味着我应该在工作之前git pull origin master。但我觉得这很令人困惑,因为消息的措辞表明相反
    【解决方案2】:

    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'?

    这样做没有意义。假设“origin”被重命名为“laptop”——你永远不想在笔记本电脑上做git push laptop

    如果你想删除原始遥控器,你可以这样做..

    git remote rm origin
    

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

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

    当您执行git pushgit pull 之类的操作时,Git 默认使用origin。因此,如果您有一个经常使用的遥控器(在您的情况下是 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

    【讨论】:

    • 他写道,他推送到 origin 存储库(尽管他不知道它在 git 术语中是如何工作的)——移除遥控器对他来说几乎不是一件有用的事情。跨度>
    • 我不明白为什么人们会改写问题。它改变了问题的含义,使现有答案变得毫无意义,并且不会让其他人知道提问者需要更多信息,因为他们的问题可能略微“不正确”。
    • 删除远程源正是我需要的,因为它指向一个不再存在的本地存储库,而不是 unfuddle 存储库。
    • stu:改写是个好东西!如果他们一开始就没有明确表达,那么得到不能解决实际问题的答案是没有意义的。
    • 但是生气和苦毒要容易得多。 :-) 但我明白你的意思。
    【解决方案3】:

    我遇到了与此类似的问题,我的工作目录是ahead of origin by X commits,但git pull 导致Everything up-to-date。我确实设法通过关注this advice 来修复它。我将其发布在这里,以防它帮助遇到类似问题的其他人。

    基本修复如下:

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

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

    $ git push origin master:master
    

    【讨论】:

    • 谢谢,这对我有用。 git diff 没有显示任何内容,在按照您的描述进行操作后,我不再收到这种令人困惑和烦人的消息。
    • 需要更多支持:)。投票率较高的答案对我来说都是“没有效果”(即“git fetch”——什么也没做……检查“git remote show origin”——没有什么不正确的,没有什么需要改变的)
    【解决方案4】:

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

    如果您运行git remote update,这将重新同步原始主机与原始主机

    查看此问题的已接受答案

    Differences between git pull origin master & git pull origin/master

    【讨论】:

      【解决方案5】:

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

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

      我该怎么做:

      1. git remote -v 会告诉你origin 是什么; origin/masterorigin 存储库的master 分支的最后一个已知状态的“书签”,而您自己的mastertracking branchorigin/masterThis is all as it should be.

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

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

      【讨论】:

      • 我认为我的笔记本电脑是源头,因为那是我第一次创建存储库的地方(它的源头)。
      • 相比之下,让origin 在本地指向笔记本电脑对我来说非常有意义,因为离线或切换网络对于笔记本电脑等便携式设备来说是一种非常常见的情况。这样您就可以随时使用git pushgit pull,无需考虑当前是否连接到正确的网络。当网络链接可用时,这个本地origin 可以自动与真实的遥控器同步,具体取决于当前的漫游状态。有问题的部分是何时运行哪个同步,而 GIT 部分则相当容易。
      • origin 指向笔记本电脑上的另一个 存储库非常有意义,当然。但是,将存储库的origin 指向自身 不会:无论您运行git push 还是git pull,都没有区别,因为存储库始终与自身完全同步。这是错误的,有点重言式。
      【解决方案6】:

      [解决方案]

      $ git push origin
      

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

      【讨论】:

        【解决方案7】:

        我正在努力解决这个问题,之前的答案都没有解决我所看到的问题。我已将问题归结为基本问题,看看是否可以弄清楚我的问题。

        我创建了一个新的存储库 (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 中的自述文件与第二次提交之前的原样相同。我所做的唯一修改是rep1,我想做的就是将它们推送到rep2。什么是我没有掌握的?

        【讨论】:

        • 两件事:rep2 的“origin/master”检查实际上并没有查看 rep1。如果您在 rep2 中执行“git pull”,它会注意到它们处于相同状态并停止抱怨。要真正查看工作副本中推送的更改,您需要执行“git checkout”——推送永远不会触及 dest 存储库的工作副本。
        • 我认为可能是这种情况,但我得到“git checkout M README 你的分支在 'origin/master' 之前 1 个提交。”但我的工作副本实际上落后了 1 次提交,而不是领先。
        【解决方案8】:

        它在等你“推”。试试:

        $ git push

        【讨论】:

          【解决方案9】:

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

          所以我跑了

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

          然后运行提交并推送。

          这解决了问题。

          【讨论】:

          • 这仅在提交消息说删除时才有效 --
          【解决方案10】:

          我也是一个 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 保持完全同步。

          /奈良

          【讨论】:

            【解决方案11】:

            我对我的回购也有同样的疑惑。在我的情况下,我有一个旧遥控器,我不再推送它,所以我需要将它移除。

            获取遥控器列表:

            git remote
            

            删除不需要的那个

            git remote rm {insert remote to remove}
            

            【讨论】:

              【解决方案12】:

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

              $ 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
              

              【讨论】:

                【解决方案13】:

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

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

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

                git push
                

                问题消失了。

                【讨论】:

                  猜你喜欢
                  • 2012-01-31
                  • 1970-01-01
                  • 2013-07-14
                  • 2012-09-27
                  • 2014-04-21
                  • 2020-07-27
                  • 2011-02-22
                  相关资源
                  最近更新 更多