Git-拉动时自动快进所有跟踪分支

Git-拉动时自动快进所有跟踪分支,git,branch,pull,Git,Branch,Pull,我已经使用--track选项设置了跟踪分支,当我在master上执行git pull时,它会将所有分支提取到origin/branchname,但不会与本地跟踪分支合并。这是非常烦人的,因为如果我以后在master上执行git push,它会说跟踪分支上的非快进更新被拒绝,因为它们在最初的git pull上不是快进的 我的问题是:如何使git使用fetch all branch拉取,并自动快进所有跟踪分支? 注意:git pull用于使用我的GitHub repos快进我的所有跟踪分支,但现在我

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

我的问题是:如何使
git使用fetch all branch拉取
,并自动快进所有跟踪分支?

注意:
git pull
用于使用我的GitHub repos快进我的所有跟踪分支,但现在我已经使用Gitolite建立了自己的repos,出现了这个问题。

但是请稍候:

  • 除非首先签出分支,否则git不会合并(在
    获取
    部分之后的
    git pull
    的第二步)文件。见“
  • master
    上的git pull将合并
    master
    上的文件,这意味着下一次推送将是快进推送。非快进只能发生
注意:我想您已经跟踪了所有远程分支,如“”


注:Git 2.0(2014年第2季度)将引入配置push.ff:

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

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

例如,如果切换到某个分支,则具有自动合并来自跟踪分支的更改的选项。这应该做你想实现的事情。

如果你真的想快速跟踪跟踪远程分支的所有本地分支,你可能想考虑把这个作为一个别名添加到你的代码>~/.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"

然后,您可以运行
git pull all
,它将遍历您的本地分支,并在每个分支上运行
git pull--ff only

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

  • 它在任何时候都不会更改您当前的分支,无需处理工作副本更改和签出时所损失的时间

  • 它只进行快进,不能快进的分支将显示错误消息并将被跳过

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

将粘贴复制到文件和chmod 755:

#/垃圾箱/垃圾箱
curbranch=$(git rev parse--abbrev ref HEAD)
对于以美元为单位的分支(每个ref/heads的git——format=“%(refname:short)”);做
upbranch=$(git config--get branch.$branch.merge | sed's:refs/heads/:');
如果[“$branch”=“$upbranch”];然后
如果[“$branch”=“$curbranch”];然后
echo快进当前分支$curbranch
git合并--仅限ff来源/$upbranch
其他的
echo快进$branch与origin/$upbranch
git获取。原产地/$upbranch:$branch
fi
fi
完成;

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

git branch \
  --format "%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)" |
  sh
它是如何工作的? 它使用带有
git分支
命令的自定义格式。对于具有上游分支的每个分支,它将打印一条具有以下模式的线:

git push . <remote-ref>:<branch>
为此,您可以使用常规的
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' -

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

我刚刚编写了一个小工具来实现这一点

此工具的优点:

  • 支持一个存储库中的多个远程设备。(
    hub sync
    目前不支持多个遥控器。)
  • 支持在本地分支和相应的远程跟踪分支上使用不同的名称
  • 比为每个分支获取远程数据的其他脚本快得多
  • 没有易出错的正则表达式解析/编辑

  • 您能显示您正在使用的确切命令吗?在
    master
    分支上执行
    git推送
    应该推送除您的master分支之外的任何内容,如果您尚未对master进行任何更改,则不应该尝试推送。我不确定您的工作流是什么,但我的直接反应是,如果您不执行任何操作,则不需要创建本地跟踪分支处理它们(即,它们可以快速转发的情况);远程跟踪分支(
    origin/*
    )会自动更新,在任何情况下都可供您参考。@CharlesBailey举个例子:多个开发人员共享一组分支,并且至少偶尔会对所有分支进行操作,但通常在拉更新时,大多数分支都可以快进。注意:Git2.0将有助于确保只拉ff(仅快进)。请参阅
    签出的可能重复项可能不受欢迎,因为它需要更新工作树,这可能会触发IDE中的更新或监视文件的任何其他内容。为了避免这种情况,您可以使用
    updateref
    ,如下所示:我天真地猜测跟踪分支
    [alias]
            fft = !sh -c 'git branch --format \"%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)\" | sh' -