代码之家  ›  专栏  ›  技术社区  ›  Zebooka

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

  •  5
  • Zebooka  · 技术社区  · 14 年前

    现在我是在主分行和“吉特拉”。这会将所有更改从远程服务器获取到origin/master、origin/a、origin/b。。。将当前分支(主分支)与源/主分支进行分支和合并。但是,我想切换到一个分支,然后再次从远程跟踪的分支合并这些远程更改,而不再提取更改(因为它们已经在origin/A分支中)。

    有没有更简单的方法来做到这一点,不指定确切的远程分支我跟踪(即自动)?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Cascabel    14 年前

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

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

    我想我已经很好地覆盖了我的基础——如果在分离的头状态,或者如果当前分支没有跟踪分支,它将以失败状态退出。它默认为to origin,就像正常的git传输命令一样。(如果您尝试在跟踪远程分支以外的分支的分支上使用它,可能会发生一些奇怪的事情,即不是refs/heads/*,但这似乎不太可能。)看起来它实际上不会为您节省很多时间,但您已经找到了!

    如果你想使用它,就把它存储在某个地方,并给它起个别名,或者命名为git某物,然后放到你的路径上。

        2
  •  1
  •   The Mighty Rubber Duck    14 年前

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

    git checkout a
    git merge origin/a
    
        3
  •  0
  •   Tomas Markauskas    14 年前

    git pull 不过是 git fetch + git merge --rebase 您也可以让它重新定位而不是合并,这样您就可以切换到另一个分支并合并/重新定位:

    git checkout a
    git merge origin/a
    

    git checkout a
    git rebase a
    

    因为它不起任何作用,我甚至已经完全停止使用拉。我只是 有规律地跟踪其他存储库中的更改,然后 git merge/rebase 只要我准备好了。

        4
  •  0
  •   Aristotle Pagaltzis    14 年前

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

    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 把它限制在某一分支或某一组分支上。