【问题标题】:How do I configure Git to automatically pull from current branch when using "git pull"?使用“git pull”时,如何将 Git 配置为自动从当前分支中提取?
【发布时间】:2013-10-17 06:41:27
【问题描述】:

使用我们当前的设置,您必须在拉取时输入分支名称(即:git pull origin feature-branch"。我已经犯了从一个分支拉到另一个分支的错误,不小心将两个分支与两个非常不同的分支合并发布。我想通过配置 Git 来避免这种情况,这样只需键入 git pull 即可拉出您所在的当前分支。

我该怎么做?

【问题讨论】:

    标签: git branch config


    【解决方案1】:

    您可以创建一个跟踪分支。来自 Git Book (http://git-scm.com/book/en/Git-Branching-Remote-Branches):

    当你克隆一个仓库时,它通常会自动创建一个 master 跟踪 origin/master 的分支。这就是为什么git pushgit pull 开箱即用,没有其他参数。然而,你 如果您愿意,可以设置其他跟踪分支 - 不跟踪的分支 origin 上的分支,不要跟踪 master 分支。简单的 case 是你刚刚看到的例子,正在运行 git checkout -b [branch] [remotename]/[branch]。如果你有 Git 1.6.2 或更高版本,您也可以使用--track 速记:

    $ git checkout --track origin/serverfix
    Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
    Switched to a new branch "serverfix"
    

    【讨论】:

      【解决方案2】:

      这个命令应该配置 git 拉到当前分支..当在终端/iTerm 中运行时。

      git config --global pull.default current
      

      只需将“pull”改为“push”即可获得与“git push”相同的效果。

      【讨论】:

      • 那么,pull的解决方案是什么?
      • 这完全是废话。配置帮助中没有记录 pull.default
      【解决方案3】:

      此外,如果您要进入您的 .gitconfig 文件并进行一点更改,您可以将其设置为自动假定您要从任何项目的当前分支推送/拉取。所以在你想要的任何编辑器中打开.gitconfig。并找到 [push] 选项,将其设置为default=simple,如下所示。

      [push]
              default = simple
      [pull]
              default = simple
      

      这样。也将拉动更改为简单。两者现在可能都设置为当前。本质上它与我之前发布的选项完全相同:

      git config --global pull.default current
      

      但我发现它是一个更好的选择。因此,您可以使用同一行,但将 current 更改为 simple

      【讨论】:

      • 此解决方案不起作用,它给我以下错误:错误:push.default 的值格式错误:简单错误:必须是无、匹配、跟踪或当前之一。致命:/home/rebecca/.gitconfig 中的错误配置文件第 11 行
      • 从命令行运行这些。 'git config --global push.default simple' 'git config --global pull.default simple'
      • 更新:它在 git 2.3 中不起作用,但在 git 2.4 中起作用。
      【解决方案4】:

      这对我有用:

      git branch --set-upstream-to=origin/branch_name branch_name
      

      完成此操作后,我可以使用以下语法:

      git checkout branch_name
      git pull --rebase
      git push
      

      【讨论】:

      • 短:git branch -u origin/branch_name
      【解决方案5】:

      我也喜欢输入git pull 并获得所有魔力。

      你有两个选择:

      1) git config --global branch.autoSetupMerge always

      这将确保您无论是签出远程分支还是创建新分支;跟踪信息将由 git 自动处理。然后就可以了

      git clone <some_repo>
      git checkout -b <new_branch>
      git push
      git pull
      

      请注意,为了push 没有更多关键字,您还需要设置推送选项。我已将其设置为matching,但每个人都有自己的偏好。 (git config --global push.default matching)

      更多信息: autosetupmerge 默认为 true。当设置为 true 时,这让 git 在您检出远程已经存在的分支时执行跟踪。例如,如果您执行git checkout &lt;branch&gt;,git 将处理跟踪信息,以便您可以在该分支上执行git pull但是,它不会在您使用-b 选项创建的分支上执行此操作。将 autosetupmerge 设置为 always 可确保 git 始终处理跟踪信息。

      2) 签出新分支时,需要专门设置分支从原点拉取(也称为跟踪)

      git checkout -b <branch> --track <remote>/<branch>
      

      当分支是瞬态的时,我发现这不太有用。如果你很少创建一个新分支,你应该这样做。但是,如果您像我一样,只有 master 分支是持久的,并且每个功能都有自己的全新分支,那么我发现选项 1 更有用。

      注意,你不需要进行git配置--global。您可以简单地在那里写--local,并且只具有特定于该存储库的设置。

      【讨论】:

      • git config --global branch.autoSetupMerge always 是我一直在寻找的命令。谢谢。我不明白为什么这不仅仅是默认值。
      【解决方案6】:

      如果你将git push配置为自动计算远程分支名称,那么你可以通过-u,它也会自动设置跟踪分支。

      设置 git push 以使用同名的远程分支:

      git config --global push.default current`
      

      git help push 中的-u 选项说明:

      -u, --set-upstream
          For every branch that is up to date or successfully pushed, add
          upstream (tracking) reference, used by argument-less git-pull(1) and
          other commands. For more information, see branch.<name>.merge in
          git-config(1).
      

      假设你当前的分支是&lt;branch_name&gt;:

      $ git push -u
      Branch <branch_name> set up to track remote branch <branch_name> from origin.
      Everything up-to-date
      

      【讨论】:

      • 不是关于 git pull 的问题吗? (而不是 git push)
      【解决方案7】:

      我需要将我的 repos 与 master 分支同步,所以我最终得到了一个简单的 bash 脚本,它可以获取更改并将 rebase 到 master 分支:

      function git_do_rebase_with_master (){
          current=$(pwd)
          echo "Syncing $1 ..."
          cd "$1"
          git fetch origin
          GIT_STASH_MESSAGE="Sync on $(date)"
          echo $GIT_STASH_MESSAGE
          git stash -m"${GIT_STASH_MESSAGE}"
          git rebase origin/master
          (git stash list | grep "${GIT_STASH_MESSAGE}" && git stash pop) || echo "Stash was not applied"
          echo "Completed git sync current branch"
          git log --name-status HEAD^..HEAD --pretty=oneline -1
          echo "Completed syncing of $1 ..."
          cd $current
      }
      
      
      alias sync_repo="git_do_rebase_with_master /path/to/repo" 
      

      【讨论】:

        猜你喜欢
        • 2018-07-27
        • 2019-07-19
        • 2012-07-11
        • 2013-09-30
        • 2022-12-03
        • 2011-02-15
        • 2023-03-09
        • 2017-11-16
        相关资源
        最近更新 更多