【问题标题】:Git: How to merge local branch with remote tracking automatically without fetchingGit:如何在不获取的情况下自动将本地分支与远程跟踪合并
【发布时间】:2011-05-02 06:08:41
【问题描述】:

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

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

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

【问题讨论】:

  • 我相当确定 OP 希望避免显式命名远程分支,就像 git pull 一样 - git 知道要获取和合并哪个分支。也就是说,git merge origin/a 不是答案。

标签: git merge branch git-branch


【解决方案1】:

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

类似:

git checkout a
git merge origin/a

【讨论】:

  • 我很确定这根本不是答案 - 请参阅我对这个问题的评论。不过不想投反对票,因为我可能是错的。
  • 在我看来他只是不想再次访问服务器。他说“无需再次获取更改(因为它们已经在原点/分支中)。”所以他不想做的部分是取。虽然我可能也理解错了。最好留给 OP 来决定或提供更多细节。 :)
【解决方案2】:

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

git checkout a
git merge origin/a

或:

git checkout a
git rebase a

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

【讨论】:

  • 我很确定这根本不是答案 - 请参阅我对这个问题的评论。不过不想投反对票,因为我可能是错的。
  • 是的,这是没有答案的。目前尚不清楚这如何适用于 OP 情况,并且答案的介绍谈到了 --rebase,bot 并没有真正解释以下示例。写得不好的答案。
【解决方案3】:

我不相信有用于此的内置命令。但是,您可以执行以下操作:

#!/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 中。

【讨论】:

  • @Zebooka:不管怎样,这个功能是刚刚添加的。 Commit 93e535a 允许您设置配置选项 merge.defaultupstream 这将导致 git merge(不带参数)与适当的远程跟踪分支合并 - 就像 git pull 没有获取一样。我的猜测是它可能会进入 v1.7.5。
【解决方案4】:

这将依次检查所有跟踪分支,并合并到它们对应的远程分支中:

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 merge 拒绝尝试合并,因为工作树有修改,reset --hard 将销毁这些修改。 reset --merge 会更安全,但仍不完全安全。 (而且我知道您在那里有一个结帐,但是通过本地修改,它要么失败,要么在切换分支时将它们留在原处 - 无论哪种方式,仍然有本地修改。)
  • 危险,但似乎暗示了如何自动更新当前分支。谢谢
猜你喜欢
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 2011-03-04
  • 2010-09-27
  • 2016-02-22
  • 2018-03-24
  • 2019-02-16
相关资源
最近更新 更多