39

我已经使用该选项设置了跟踪分支--track,当我执行git pullon 时master,它会将所有分支提取到origin/branchname但不与本地跟踪分支合并。这很烦人,因为如果我稍后执行git pushon master,它会说跟踪分支上的非快进更新被拒绝,因为它们在初始时没有快进git pull

我的问题是:我如何做到这一点,以便git pull获取所有分支并自动快进所有跟踪分支?

注意:git pull曾经用我的 GitHub 存储库快进我所有的跟踪分支,但现在我已经使用 Gitolite 设置了自己的存储库,这个问题就出现了。

4

6 回答 6

21

快速转发所有将上游分支设置为匹配源/分支的分支的 Shell 脚本,而不进行任何检出

  • 它不会随时更改您当前的分支,无需处理工作副本更改和签出时间丢失

  • 它只做快进,不能快进的分支会显示错误信息并被跳过

通过运行确保所有分支的上游分支都正确设置git branch -vv。设置上游分支git branch -u origin/yourbanchname

复制粘贴到一个文件和 chmod 755:

#!/bin/sh

curbranch=$(git rev-parse --abbrev-ref HEAD)

for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do
        upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::');
        if [ "$branch" = "$upbranch" ]; then
                if [ "$branch" = "$curbranch" ]; then
                        echo Fast forwarding current branch $curbranch
                        git merge --ff-only origin/$upbranch
                else
                        echo Fast forwarding $branch with origin/$upbranch
                        git fetch . origin/$upbranch:$branch
                fi
        fi
done;
于 2014-06-27T11:59:11.813 回答
6

If you really want to fast forward all local branches that are tracking remote branches you might want to consider adding this as an alias to your ~/.gitconfig:

[alias]
    pull-all = !"for b in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${b#refs/heads/} ; git pull --ff-only ; done"

You can then run git pull-all, it will iterate through your local branches and run a git pull --ff-only on each.

于 2013-09-15T21:57:11.147 回答
6

可是等等:

注意:我假设您已经跟踪了所有远程分支,如“将所有远程 git 分支跟踪为本地分支” 。


注意:Git 2.0(2014 年第二季度)将通过提交 b814da8引入配置 push.ff:

pull.ff::

默认情况下,Git 在合并作为当前提交的后代的提交时不会创建额外的合并提交。相反,当前分支的尖端是快进的。

  • 当设置为 时false,这个变量告诉 Git 在这种情况下创建一个额外的合并提交(相当于--no-ff从命令行提供选项)。
  • 当设置为 时only,只允许这样的快进合并(相当于--ff-only从命令行给出选项)。
于 2011-01-02T10:08:49.413 回答
5

如果可能,以下单行代码将所有具有上游分支的分支快进,否则打印错误:

git branch \
  --format "%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)" |
  sh

它是如何工作的?

它使用git branch命令的自定义格式。对于每个具有上游分支的分支,它会打印一行具有以下模式的行:

git push . <remote-ref>:<branch>

这可以直接通过管道输入sh(假设分支名称格式正确)。省略| sh以查看它在做什么。

警告

当前签出的分支将不会使用类似的消息进行更新

! [remote rejected] origin/master -> master (branch is currently checked out)

为此,您可以求助于常规git pull --ff-only.

别名

将以下内容添加到您的.gitconfig以便git fft执行此命令:

[alias]
        fft = !sh -c 'git branch --format \"%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)\" | sh' -

别名是“快进跟踪(分支)”的简写。

于 2019-04-15T18:21:01.990 回答
0

例如,SmartGit有一个选项可以在您切换到分支时自动合并来自跟踪分支的更改。这应该做你想要达到的目标。

于 2011-01-02T12:20:32.067 回答
0

我只是写了一个小工具来做到这一点。https://github.com/changyuheng/git-fast-forward-all

该工具的优点:

  1. 在一个存储库中支持多个遥控器。(hub sync目前不支持多个遥控器。)
  2. 支持在本地分支和对应的远程跟踪分支上具有不同的名称。
  3. 比为每个分支获取远程的其他脚本快得多。
  4. 没有容易出错的正则表达式解析/编辑。
于 2019-11-20T10:06:30.790 回答