想象一下,我有几个分支:master、a、b、c ...
现在我在主分支和“git pull”。这会将所有更改从远程服务器获取到 origin/master、origin/a、origin/b ... 分支并将 CURRENT 分支(master)与 origin/master 合并。但后来我想切换到 A 分支并再次合并来自远程跟踪分支的这些远程更改,而不再次获取更改(因为它们已经在原点/分支中)。
是否有一些更简单的方法可以做到这一点,而不是指定我跟踪的确切远程分支(即自动)?
想象一下,我有几个分支:master、a、b、c ...
现在我在主分支和“git pull”。这会将所有更改从远程服务器获取到 origin/master、origin/a、origin/b ... 分支并将 CURRENT 分支(master)与 origin/master 合并。但后来我想切换到 A 分支并再次合并来自远程跟踪分支的这些远程更改,而不再次获取更改(因为它们已经在原点/分支中)。
是否有一些更简单的方法可以做到这一点,而不是指定我跟踪的确切远程分支(即自动)?
我不相信有一个内置的命令。但是,您可以执行以下操作:
#!/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 中。
我认为您可以简单地签出您的本地分支并从您的本地副本中合并 origin/a 分支。
就像是:
git checkout a
git merge origin/a
这将依次检查所有跟踪分支,并合并到它们相应的远程分支中:
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
将其限制为某个分支或一组特定分支。
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
只要我准备好了。