Git: Как объединить локальную ветку с удаленным отслеживанием автоматически без загрузки - PullRequest
5 голосов
/ 29 октября 2010

Представьте себе, у меня есть несколько веток: master, a, b, c ...

Сейчас я нахожусь в master ветке и "git pull".Он выбирает все изменения с удаленного сервера в ветви origin / master, origin / a, origin / b ... и объединяет текущую ветку (master) с origin / master.Но затем я хочу переключиться на ветку A и снова объединить эти удаленные изменения из удаленной отслеживаемой ветви, БЕЗ извлечения изменений снова (так как они уже находятся в исходной / ветке).

Есть ли более простой способ сделать этоне указывается именно удаленная ветвь, которую я отслеживаю (т.е. автоматически)?

Ответы [ 4 ]

1 голос
/ 29 октября 2010

Я не верю, что для этого есть встроенная команда. Тем не менее, вы можете сделать что-то вроде этого:

#!/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. (Что-то странное случится, если вы попытаетесь использовать это в ветке, которая отслеживает что-то, кроме ветки на удаленном компьютере, то есть не в форме refs /head / *, но это кажется маловероятным.) Не похоже на самом деле сэкономит вам много времени, но вот вы!

Если вы хотите использовать его, просто сохраните его где-нибудь и присвойте ему псевдоним, или назовите его git-нечто и поместите в свой путь.

1 голос
/ 29 октября 2010

Я думаю, что вы можете просто оформить локальный филиал и объединить его с локальной копией источника / филиала.

Что-то вроде:

git checkout a
git merge origin/a
0 голосов
/ 29 октября 2010

Это по очереди проверяет все ветви отслеживания и объединяет их в соответствующие удаленные ветви:

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, чтобы ограничить их определенной ветвью или определенным их набором.

0 голосов
/ 29 октября 2010

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, когда я буду готов.

...