你如何让 git 总是从特定的分支中提取?

Posted

技术标签:

【中文标题】你如何让 git 总是从特定的分支中提取?【英文标题】:How do you get git to always pull from a specific branch? 【发布时间】:2010-10-14 02:52:01 【问题描述】:

我不是 git 大师,但我已经使用它一段时间了,有几个不同的项目。在每个项目中,我总是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:明确地说,我知道我原来的方法可能不正确,但我需要修复这个 repo,以便我可以再次使用 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 是什么样的?签出该提交后您做了什么? 您是否在 4f82a29 之上进行了提交? Pat,我没有在它上面做任何提交。这是在服务器上,我们需要回滚到稳定版本以隐藏我们创建的错误。这个系统不是用于开发目的,所以我只是想回滚,等待我们修复错误,然后再拉回头部版本。 Ryan,我已更新以包含 .git/config。结帐后,我什么也没做。这台计算机是服务器,不用于开发。 【参考方案1】:

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

如果您运行命令 git remote show origin(假设 origin 是远程的简称),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 配置中缺少这些。如果是这种情况,那么 git remote show origin 的输出中将缺少显示“为 'git pull' 配置的本地分支:”的部分。

如果git pull 不存在配置,则后续步骤已由其他答案解释。

【讨论】:

【参考方案2】:

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

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

这告诉 Git 2 件事:

    当您在 master 分支上时,默认远程是 origin。 在 master 分支上使用 git pull 时,未指定远程和分支,使用默认远程(源)并合并远程 master 分支的更改。

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

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

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

【讨论】:

这对我也有用,我已经从 github 签出了一个项目。我正在运行 OS X 10.4 非常感谢您非常 - 这发生在我的一个开发人员项目中,有一个“服务器”存储库和两台计算机(我曾经经常推送/拉取没有问题在故障之前),不知道为什么,但修复工作正常! Under [branch "master"] 是什么意思 @ianj:在 Git 配置文件中(来自 repo 根目录,.git/config)。 @ianj:在命令行中,您始终可以使用$ git config branch.master.remote origin ; git config branch.master.merge refs/heads/master【参考方案3】:

我发现很难记住确切的 git configgit branch 参数,就像 mipadi 和 Casey 的答案一样,所以我使用这两个命令来添加上游参考:

git pull origin master
git push -u origin master

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

【讨论】:

我同意。这应该是最简单的答案。 您的答案应该包括它为什么起作用,并参考文档中解释原因的部分。【参考方案4】:

还有一种配置 Git 的方法,它总是将等效的远程分支拉入并推送到当前签出到工作副本的分支。它被称为git ready recommends setting by default 的跟踪分支。

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

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

【讨论】:

【参考方案5】:
git branch --set-upstream master origin/master

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

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

如果你有branch.autosetuprebase = always,那么它也会添加:

    rebase = true

【讨论】:

我发现这是让 git 表现得像被问到的最简单的方法,特别是如果有更多分支,而不仅仅是远程(即使你必须为每个分支都这样做,每个分支一次) 我刚试过这个,我得到了错误fatal: Not a valid object name: 'origin/master'.,即使origin是一个有效的遥控器,并且master像往常一样存在于两个repos中。 Ken,您需要先执行“git fetch origin”才能获取远程分支名称。 较新的 git 希望你使用 git branch --set-upstream-to=origin/master master【参考方案6】:

您的直接问题是如何使其成为大师,您需要按照它所说的去做。在分支配置中指定要从中提取的 refspec。

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

【讨论】:

不应该是“refs/heads/master”吗?根据 git-pull(1),这是默认合并的远程站点分支的名称。 是的,你是对的。我举我的例子的回购是一个特例。已更正。【参考方案7】:

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

  $ 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

【讨论】:

+1 用于了解神奇的单词“refs/heads/master”。我毫不费力地弄清楚如何设置变量,但完全不知道将它设置为 to 什么,并且手册页也没有多大帮助。找到这个答案后,我最终在文档中找到了正确的位置。对于好奇的人:这个神奇的词是指.git 中的一个文件路径,其中 git 似乎保留了masters 当前提交的哈希码。【参考方案8】:

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

$ git pull origin master

【讨论】:

重点是自动执行此操作,而不是指定它。【参考方案9】:

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

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

如果错误是在合并提交中引入的,则此过程将不起作用。见How-to-revert-a-faulty-merge。

【讨论】:

你在这里给了我很好的教育,我很感激,但我可能没有很好地描述我的情况,所以这与我的工作流程不完全匹配。我可能会发布另一个问题来解决这个问题。不过,谢谢,保罗! +1 给你,先生。 我只是误读了你的情况。我很高兴你得到了你需要的答案。

以上是关于你如何让 git 总是从特定的分支中提取?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确创建分支 GIT

为啥我的 git bash 总是从 master 分支开始?

Git 如何从特定的提交中创建一个新的分支

Git 如何从特定的提交中创建一个新的分支

使用“git pull”时,如何将 Git 配置为自动从当前分支中提取?

如何让 git bash 在子模块中显示分支名称