Git: как объединить локальную ветку с удаленным отслеживанием автоматически без выборки

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

Теперь я в мастер-ветке и «git pull». Это извлекает все изменения с удаленного сервера в исходное / ведущее, 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.

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

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

 git checkout a git merge origin/a 

git pull – это не что иное, как git fetch + git merge . С параметром --rebase вы также можете --rebase его и не объединить, чтобы вы могли просто переключиться на другую ветку и слить / переустановить:

 git checkout a git merge origin/a 

или:

 git checkout a git rebase a 

Поскольку он ничего не делает, я даже вообще не использовал pull. Я просто git fetch регулярно, поэтому я могу легко отслеживать изменения в других репозиториях, а затем git merge/rebase всякий раз, когда я готов.

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

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