cambiar rama en git por nombre parcial

5 minutos de lectura

Avatar de usuario de Ram on Rails React Native
Ram sobre rieles React Native

Si tengo las siguientes ramas en git

1194-qa-server
master
remotes/origin/1178-authentication
remotes/origin/1194-qa-server
remotes/origin/HEAD -> origin/master
remotes/origin/master

Quiero cambiar a una sucursal usando –solo– el número, incluso si eso requiere llamar a un script. Por ejemplo:

switch_branch 1178

y el script/solución debe hacer lo siguiente

  1. git branch -a (busca todas las sucursales locales y remotas en mi repositorio)
  2. filtrar por el parámetro dado (‘1178’ arriba)
  3. extrae el nombre de la rama que git puede usar
  4. cambiar a esa sucursal

¿Cuál es la forma recomendada de hacerlo sin tener que realizar todos estos pasos manualmente?

Estoy usando Mac OSX, si eso importa aquí.

actualizar: bash-it (github.com/revans/bash-it) cumple mi propósito

Welcome to Bash It!

Here is a list of commands you can use to get help screens for specific pieces of Bash it:

  rails-help                  list out all aliases you can use with rails.
  git-help                    list out all aliases you can use with git.
  todo-help                   list out all aliases you can use with todo.txt-cli
  brew-help                   list out all aliases you can use with Homebrew
  aliases-help                generic list of aliases.
  plugins-help                list out all functions you have installed with bash-it
  bash-it-plugins             summarize bash-it plugins, and their installation status
  reference <function name>   detailed help for a specific function

  • Usando bash puedes usar git checkout 1178[TAB] 😉

    – KingCrunch

    5 de julio de 2012 a las 8:21


  • Y usando algunos elegante ayudante es solo gco 1178[TAB]

    – Stefan

    5 de julio de 2012 a las 8:52

  • Realmente no funciona para mí. Encontré algunas referencias en la web para el autocompletado de hash, pero eso no es lo que estoy buscando.

    – Ram sobre rieles React Native

    5 de julio de 2012 a las 10:42


  • en realidad necesitas instalar git autocompletar para git checkout 1178[TAB] trabajar. Más información aquí: apple.stackexchange.com/a/55886

    – Crogers

    19 de abril de 2020 a las 18:46

Hay muy pocas ocasiones en las que le gustaría pagar remotes/origin/*. Existen, pero a los efectos de este atajo, no nos preocupemos por ellos. Esto le dará lo que quiere en OSX:

git config --global alias.sco '!sh -c "git branch -a | grep -v remotes | grep $1 | xargs git checkout"'

A continuación, puede emitir git sco <number> para pagar una sucursal que incluye <number> pero excluye “controles remotos”. Tu puedes cambiar sco para ser lo que quieras. Acabo de elegirlo para “super checkout”.

Por supuesto, esto no funcionará muy bien si tiene más de una rama que coincida <number>. Sin embargo, debería ser un buen punto de partida.

  • Sirve para el propósito, pero encontré bash-it mejor. github.com/revans/bash-it

    – Ram sobre rieles React Native

    9 de julio de 2012 a las 19:42


  • Haz una llamada a head -1 al final y deberías ser bueno incluso con múltiples coincidencias.

    – DylanYoung

    15 de julio de 2020 a las 17:28

Avatar de usuario de DàChún
DàChún

Aquí está mi solución con pago difuso: agregue el alias a su ~/.gitconfig por correr

git config --global alias.fc '!f() { git branch -a | grep -m1 -e ${1}.*${2} | sed "s/remotes\/origin\///" | xargs git checkout; }; f'

El comando anterior agregará el alias a su ~/.gitconfig:

[alias]
    # fuzzy checkout branch, e.g: git cb feature 739, will checkout branch feature/PGIA-739-deploy-maximum
    fc = "!f() { git branch -a | grep -m1 -e ${1}.*${2} | sed \"s/remotes\\/origin\\///\" | xargs git checkout; }; f" 

El alias puede tener 2 parámetros para la coincidencia aproximada, puede usarlo como:

git fc <keyword1> <keyword2>

Encontrará la caja de la sucursal primer partido

Por ejemplo, si desea pagar su sucursal 1178, puede ejecutar:

git fc 1178

el alias fc admite dos parámetros, si desea una coincidencia más precisa, también puede ejecutar:

git fc 1178 auth

También puedes encontrar mis otros fragmentos favoritos aquí

  • ¡Esto funciona muy bien, gracias! Sin embargo, hay un pequeño problema. Si desea cambiar a una sucursal que tiene el mismo número (coincidencia) que la sucursal actual, no puede seleccionar ninguna con mensaje. Ejemplo: estoy enV3F-95 y hay otra sucursal some-long-Matching-test-V3F-95. sí git fc 95 entonces se muestra error: pathspec 'V3F-95' did not match any file(s) known to git

    – Arvind K.

    4 de febrero a las 6:29

  • Otra cosa extraña sucedió. tengo una sucursal Development y lo intenté git fc dev. El resultado fue, git fc dev\nortebranch 'develop' set up to track 'origin/develop'.\norteSwitched to a new branch 'develop'. Creó una nueva rama llamada desarrollar y cambió a ella. No tengo ninguna sucursal local o remota con develop. ¿Alguna idea?

    – Arvind K.

    4 de febrero a las 6:35

  • Por cierto, ¿hay alguna manera de usar el patrón de coincidencia de nombre de rama con otros comandos de git? Por ejemplo yo también estoy harto de hacer git pull origin Development, git merge Development etc. 🙂

    – Arvind K.

    4 de febrero a las 6:47

avatar de usuario de bxm
bxm

Aquí está la solución que se me ocurrió.

[ ${#} -ne 1 ] && { echo -e "Please provide one search string" ; exit 1 ; }
MATCHES=( $(git branch -a --color=never | sed -r 's|^[* ] (remotes/origin/)?||' | sort -u | grep -E "^((feature|bugfix|release|hotfix)/)?([A-Z]+-[1-9][0-9]*-)?${1}") )
case ${#MATCHES[@]} in
  ( 0 ) echo "No branches matched '${1}'" ; exit 1  ;;
  ( 1 ) git checkout "${MATCHES[0]}"      ; exit $? ;;
esac
echo "Ambiguous search '${1}'; returned ${#MATCHES[@]} matches:"

for ITEM in "${MATCHES[@]}" ; do
  echo -e "  ${ITEM}"
done
exit 1

lo llamé git-rcheckout (“r” para regex, a falta de un nombre mejor) y lo colocó en mi camino (es un poco demasiado largo para calzarlo en mi .gitconfig.)

Intentará hacer coincidir las sucursales locales y remotas (aunque solo verifica las locales) y tolerará (es decir, ignorará para fines de búsqueda) algunos estilos de JIRA, como sucursales que comienzan con prefijos comunes y cosas con estilo como ID de boleto de JIRA.

por ejemplo, escribiendo esto:

git rcheckout this

Debería coincidir con cosas como

this-branch
feature/this-branch
bugfix/JIRA-123-this-branch
JIRA-123-this-branch
remotes/origin/this-branch
remotes/origin/feature/this-branch
remotes/origin/bugfix/JIRA-123-this-branch
remotes/origin/JIRA-123-this-branch

Pero las expresiones regulares que he usado son lo suficientemente tolerantes como para que también puedas hacer:

git rcheckout JIRA-123

Acceder:

bugfix/JIRA-123-this-branch
JIRA-123-this-branch
remotes/origin/bugfix/JIRA-123-this-branch
remotes/origin/JIRA-123-this-branch

De forma predeterminada, busca prefijos de rama, pero en realidad puede usar expresiones regulares para hacer cosas más sofisticadas si lo desea, así:

git rcheckout '.*bran'
git rcheckout '.*is-br.*h'

  • Funcionará para los nombres de sucursales grandes que normalmente crea Jira. También apoya la git flow paradigma. Excelente.

    – bvj

    27 de febrero de 2018 a las 4:23

¿Ha sido útil esta solución?