如何使git始终从特定分支中提取?


485

我不是git master,但是我已经和它一起工作了一段时间了,并且有几个不同的项目。当然,在每个项目中,从那时git clone [repository]起,我始终可以git pull,并且只要没有特别的变化,我就可以始终如此。

最近,我不得不还原到上一个分支,并使用进行了此操作git checkout 4f82a29。当我再次准备拉动时,我发现必须将分支设置回master。现在,我不能使用直线git pull,而是必须指定git pull origin master,这很烦人,并向我表明我不完全了解发生了什么。

发生了什么变化,这使我无法在git pull不指定原点大师的情况下进行平直比赛,以及如何将其改回原样?

更新:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = git@github.com:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

更新2:明确地说,我知道我的原始方法可能不正确,但是我需要修复此存储库,以便可以git pull再次使用。目前,git pull导致:

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

我可以知道git pull要合并的分支,它可以正常工作,但git pull不像原来在我之前那样工作git checkout


您的.git / config是什么样的?签出该提交后您做了什么?
Ryan Graham

您是否在4f82a29之上进行提交?
Pat Notz 09年

帕特,我没有在上面做任何提交。它在服务器上,我们需要回滚到稳定版本以隐藏我们创建的错误。该系统不是出于开发目的,因此我只想回滚,等待我们修复错误后再拉回原始版本。
David Smith,2009年

2
瑞安,我已经更新为包括.git / config。结帐后,我什么也没做。这台计算机是服务器,不用于开发。
David Smith,2009年

Answers:


730

在下[branch "master"],尝试将以下内容添加到仓库的Git配置文件(.git/config):

[branch "master"]
    remote = origin
    merge = refs/heads/master

这告诉Git 2件事:

  1. 当您在master分支上时,默认的遥控器是origin。
  2. git pullmaster分支上使用时(未指定任何远程和分支),请使用默认的remote(来源)并合并来自remote master分支的更改。

我不确定为什么会从您的配置中删除此设置。您可能也必须遵循其他人发布的建议,但这可能有用(或至少有帮助)。

如果您不想手动编辑配置文件,则可以使用命令行工具:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

2
这对我也很有效,我已经从github签出了一个项目。我正在运行OS X 10.4
Sam Barnum,

谢谢你非常多-这发生在我身上的一个开发项目,一个“服务器”仓库和两台电脑(这在我以前经常推/拉毛刺出现之前没有任何问题),不知道为什么,但修复工作精细!
切斯特布雷

1
您是什么意思?Under [branch“ master”]
ianj 2010年

3
@ianj:在Git配置文件中(从repo根目录开始.git/config)。
mipadi 2010年

1
@ianj:在命令行中,您总是可以$ git config branch.master.remote origin ; git config branch.master.merge refs/heads/master代替。
mipadi 2010年

139

如果愿意,可以通过命令行设置这些选项(而不是编辑配置文件),如下所示:

  $ git config branch.master.remote origin
  $ git config branch.master.merge refs/heads/master

或者,如果您像我一样,并且希望将其作为所有项目(包括将来可能要处理的项目)的默认设置,则将其添加为全局配置设置:

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12
+1表示魔术单词“ refs / heads / master”。我没有麻烦搞清楚如何来设置变量,但绝对没有什么线索,将其设置,而该男子的网页是没有太大的帮助。找到答案后,我终于在文档中找到了正确的位置。出于好奇:魔术字是指一个文件路径.git,其中git似乎保留了master当前提交的哈希码。
mokus 2011年

84
git branch --set-upstream master origin/master

这会将以下信息添加到您的config文件中:

[branch "master"]
    remote = origin
    merge = refs/heads/master

如果有,branch.autosetuprebase = always它还将添加:

    rebase = true

1
我发现这是使git像询问的那样进行操作的最简单方法,尤其是如果有更多分支,而不仅仅是远程分支(即使您必须为每个分支都这样做,则每个分支一次)
s3v3n 2012年

2
我只是试过了,fatal: Not a valid object name: 'origin/master'.即使origin是一个有效的远程服务器,也仍然出现错误,并且master通常都存在于两个仓库中。
肯·威廉姆斯

2
肯,您需要先执行“ git fetch origin”以获取远程分支名称。
Eric Lee

14
较新的git希望您使用git branch --set-upstream-to=origin/master master
orbeckst 2013年

52

我发现很难记住与mipadi和Casey的答案一样的精确值git configgit branch参数,因此我使用以下两个命令添加上游引用:

git pull origin master
git push -u origin master

这会将相同的信息添加到您的.git / config中,但我发现它更容易记住。


1
我同意。这应该是最好的最简单的答案。
linbianxiaocao

2
您的答案应包括其工作原理,并参考文档中解释原因的部分。
vfclists

24

Git pull结合了两个动作-从跟踪分支中的远程存储库中获取新提交,然后将它们合并到当前分支中

当您签出特定的提交时,您没有当前分支,只有HEAD指向您所做的最后一次提交。所以git pull,没有指定其所有参数。这就是为什么它不起作用。

根据更新的信息,您要执行的操作是还原远程存储库。如果您知道导致错误的提交,最简单的处理方法是git revert记录一个新的提交,以撤消指定的错误提交:

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

由于您要更改服务器,因此我假设您不需要重写历史记录即可隐藏错误的提交。

如果该错误是在合并提交中引入的,则此过程将不起作用。请参阅 如何还原故障合并


您在这里给了我一些很好的教育,对此我表示赞赏,但是我可能无法很好地描述我的情况,因此这与我的工作流程并不完全匹配。我可能会发布另一个问题来解决这个问题。不过,谢谢保罗!+1,先生。
大卫·史密斯

我只是误解了你的情况。很高兴您得到所需的答案。
保罗

12

还有一种配置Git的方法,它总是将等效的远程分支拉入并推送到当前签出到工作副本的分支。这称为跟踪分支,git ready建议默认设置

对于当前工作目录上方的下一个存储库:

git config branch.autosetupmerge true

对于所有未配置的Git存储库:

git config --global branch.autosetupmerge true

魔法种类,恕我直言,但在情况下,这可能有助于在特定分支始终当前分支

当您branch.autosetupmerge设置true和检查分支首次,Git会告诉你跟踪相应的远程分支:

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

然后,Git将自动推送到相应的分支:

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

10

不想编辑我的git配置文件,我遵循@mipadi帖子中的信息并使用:

$ git pull origin master

13
关键是要自动执行此操作,而不是指定它。
艾瑞克(Eric)

4

关于如何使它成为主服务器的直接问题,您需要按照它说的做。在分支配置中指定要引用的refspec。

[branch "master"]
    merge = refs/heads/master

那不应该是“ refs / heads / master”吗?根据git-pull(1),这是默认情况下合并的远程站点上分支的名称。
亚当·蒙森

是的,你是对的。我以我为例的回购是一个特例。已更正。
瑞安·格雷厄姆

0

只是想添加一些信息,我们可以检查此信息是否git pull自动引用任何分支。

如果您运行命令,git remote show origin(假设将origin作为remote的简称),则git会显示此信息,无论是否存在用于git pull

下面是一个示例输出。(摘自git文档)。

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

请注意显示的部分,为git pull配置的本地分支。

在这种情况下, git pull将参考git pull origin master

最初,如果您已使用git clone克隆了存储库,则将自动处理这些事情。但是,如果您使用git remote add手动添加了远程,则git config中会缺少这些。如果是这种情况,则显示“为'git pull'配置的本地分支:”的部分将从输出中丢失。git remote show origin

如果没有任何配置,请执行以下下一步操作git pull

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.