5

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

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

是否有一些更简单的方法可以做到这一点,而不是指定我跟踪的确切远程分支(即自动)?

4

4 回答 4

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 状态,或者当前分支没有跟踪分支,它会以失败状态退出。它默认为原点,就像普通的 git 传输命令一样。(如果您尝试在一个分支上使用它,该分支正在跟踪除远程分支之外的其他内容,即不是 refs/heads/* 的形式,但这似乎不太可能。)看起来不像它实际上会为您节省很多时间,但是您来了!

如果您想使用它,只需将其存储在某个地方并为其命名,或者将其命名为 git-something 并将其放入您的 PATH 中。

于 2010-10-29T06:58:00.063 回答
1

我认为您可以简单地签出您的本地分支并从您的本地副本中合并 origin/a 分支。

就像是:

git checkout a
git merge origin/a
于 2010-10-29T06:16:36.767 回答
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将其限制为某个分支或一组特定分支。

于 2010-10-29T08:08:04.383 回答
0

git pull无非是git fetch+ git merge。使用该参数--rebase,您还可以让它变基而不是合并,这样您就可以切换到另一个分支并合并/变基:

git checkout a
git merge origin/a

或者:

git checkout a
git rebase a

由于它没有做任何其他事情,我什至完全停止使用拉。我只是git fetch定期进行,这样我就可以轻松地跟踪其他存储库中的更改,然后git merge/rebase只要我准备好了。

于 2010-10-29T06:31:10.857 回答