你如何让git总是从一个特定的分支拉?

我不是一个git大师,但我已经用它工作了一段时间,有几个不同的项目。在每个项目中,我总是git clone [repository],并且从这一点开始,总是可以git pull,当然,前提是我没有突出的变化。

最近,我不得不恢复到前一个分支,并使用git checkout 4f82a29这样做。当我再次准备拉的时候,我发现我必须把树枝放回主人的位置。现在,我不能使用直接的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之前那样工作。

250709 次浏览

你眼前的问题是如何让它拉主人,你需要按它说的做。在分支配置中指定要提取的refspec。

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

< >强Git拉< / >强结合了两个动作——从被跟踪分支的远程存储库中获取新的提交,然后将它们合并到您当前的分支机构中。

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

根据您更新的信息,您要做的是恢复远程回购。如果你知道引入bug的提交,最简单的处理方法是使用git revert,它记录一个新的提交,撤销指定的bug提交:

$ 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

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

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

这告诉Git两件事:

  1. 当您在主分支上时,默认的远程是origin。
  2. 当在主分支上使用git pull时,没有指定remote和branch,使用默认remote (origin)并合并来自远程主分支的更改。

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

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

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

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

$ git pull origin master

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

  $ 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
git branch --set-upstream master origin/master

这将向你的config文件添加以下信息:

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

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

    rebase = true

还有一种配置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

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

git pull origin master
git push -u origin master

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

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

如果你运行命令git remote show origin,(假设origin是remote的缩写),git会显示这个信息,不管是否存在任何默认引用。

下面是一个示例输出。(摘自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拉。

在这种情况下,git pull将引用git pull origin master

最初,如果您已经使用git clone克隆了存储库,那么这些问题就会自动得到解决。但是如果你使用git remote add手动添加了一个远程,这些在git配置中是没有的。如果是这样的话,那么它显示“本地分支配置为'git pull':”的部分将从git remote show origin的输出中缺失。

如果git pull不存在配置,接下来的步骤已经由其他答案解释了。