Git:如何在不提取的情况下自动将本地分支与远程跟踪合并

时间:2010-10-29 06:11:48

标签: git merge branch git-branch

想象一下,我有几个分支:master,a,b,c ......

现在我在主分支和“git pull”。这将从远程服务器获取所有更改到origin / master,origin / a,origin / b ... branches并将CURRENT branch(master)与origin / master合并。但后来我想切换到A分支并再次从远程跟踪分支合并这些远程更改,而不再获取更改(因为它们已经在源/分支中)。

是否有一些更简单的方法来指定完全远程分支I跟踪(即自动)?

4 个答案:

答案 0 :(得分:1)

我认为您可以简单地签出您的本地分支,并从原产地/分支机构的本地副本进行合并。

类似的东西:

git checkout a
git merge origin/a

答案 1 :(得分:1)

我不相信这有一个内置命令。但是,您可以这样做:

#!/bin/bash
head=$(git symbolic-ref HEAD) || exit
head=${head#refs/heads/}
merge=$(git config --get branch.$head.merge) || { echo "no tracking branch"; exit 1; }
remote=$(git config --get branch.$head.remote) || remote=origin
git merge $remote/${merge#refs/heads/}

# alternatively, as in Aristotle's answer:
# head=$(git symbolic-ref HEAD) || exit
# upstream=$(git for-each-ref --format='%(upstream:short)' "$head"
# [ -z "$upstream" ] && { echo "no tracking branch"; exit 1; }
# git merge $upstream

我认为我已经很好地覆盖了我的基础 - 如果处于分离的HEAD状态,或者当前分支没有跟踪分支,它将以失败状态退出。它默认为origin,正常的git transfer命令也是如此。 (如果你试图在跟踪遥控器上的分支以外的其他东西的分支上使用它会发生奇怪的事情,即不是形式refs / heads / *,但这似乎不太可能。)似乎不喜欢它实际上可以节省你很多时间,但是你就是这样!

如果你想使用它,只需将它存储在某个位置并将其别名,或者将其命名为git-something并将其放入PATH中。

答案 2 :(得分:0)

git pull只不过是git fetch + git merge。使用参数--rebase,你也可以使用rebase而不是merge,这样你就可以切换到另一个分支并合并/ rebase:

git checkout a
git merge origin/a

或:

git checkout a
git rebase a

由于它没有做任何其他事情我甚至已经停止使用拉力。我只是定期git fetch所以我可以轻松跟踪其他存储库中的更改,然后在我准备好时git merge/rebase

答案 3 :(得分:0)

这将依次检出所有跟踪分支,并合并到相应的远程分支中:

git for-each-ref --format='%(refname:short) %(upstream:short)' \
| while read branch upstream ; do
    [ -z "$upstream" ] && continue
    git checkout "$branch"
    git merge "$upstream" || git reset --hard
done

如果合并有冲突,则会使用git reset重新合并,您必须手动完成。

未测试。

您还可以将一个或多个模式传递给git for-each-ref,以将其限制为某个分支或某些分支。