¿Cómo encontrar si una rama es una rama o usuario rastreado localmente creado rama local?

StackOverflow https://stackoverflow.com/questions/2887242

  •  04-10-2019
  •  | 
  •  

Pregunta

Tengo una rama de seguimiento a distancia de seguimiento a nivel local en mi repositorio local con 'git branch -b nombre-sucursal origen / nombre-sucursal'. Mi rama remota es test2 / test2 (origen / nombre-sucursal) que está siendo rastreado localmente como test2.

El origen también se nombra test2. No he comprobado mi-test2 local de la rama de seguimiento.

Cuando hago un 'origen remoto git pull-rama:-rastreado-rama local' me sale este error

[test2] $ git test2 test2 tirón: test2 Desde / gitvobs / git_bare / test2 ! [Rechazada] test2 -> test2 (no avance rápido)

Mientras que cuando el pago my locales test2 rama de seguimiento y hacer pull 'origen local de git pull-seguido-rama' no me sale el error y hago uso de un tirón 'git pull test2 test2'

Desde / gitvobs / git_bare / test2 * Rama test2 -> FETCH_HEAD Auto-fusión a.txt fusión automática falló; conflictos fijos y luego confirmar el resultado.

Yo sé que la adición de un signo + (test2 test2 + git pull: test2) ayudaría pero sobrescribe los cambios locales

.

Entonces, ¿cómo puedo saber cuál de mis ramas locales son creados por mí usando localmente 'git branch nuevo-nombre-sucursal' o seguimiento a nivel local de las ramas remotas usando git branch nombre-sucursal -b origen / nombre-sucursal '

¿Fue útil?

Solución

Independientemente de la lista de Camiones de ramificado (que se puede ver con git config -l), un medios "non-fast-forward" mensaje no pueden fusionar la rama remota (es decir, la copia local de la descabellada cometer de la rama remota) en su rama, ya que:

  • su rama tiene confirmaciones de su propia
  • la rama remota tiene nuevas confirmaciones desde el último tirón

así:

  --last pull
  |
  v
x-x-x-x-x <--test2
  \
   -y-y-y <-- test2/test2

Mientras que esto habría sido una combinación de avance rápido

  --last pull
  |
  v
x-x <--test2
  \
   -y-y-y <-- test2/test2

Así que:

git checkout test2
git fetch test2 test2 
git merge test2/test2
#fix conflicts
git commit

Y por favor, llame a su cesión temporal a distancia de cualquier otro nombre que test2. Es decir demasiados test2 aquí;)


Ahora para la lista de sucursales remotas seguimiento en tu repositorio local:

git config --get-regexp branch..*

Otros consejos

git pull Confusión

Para instalar sobre la especificidad

git pull comando incluye demasiada información.

[test2] $ git test2 test2 tirón: test2
Desde / gitvobs / git_bare / test2
! [Rechazada] test2 -> test2 (no avance rápido)

Yo sé que la adición de un signo + (test2 test2 + git pull: test2) ayudaría pero sobrescribe los cambios locales

.

Esto es lo que los medios de comando:

#             *------------ (1) remote repository name
#            /     *------- (2) ref in remote repository
#           /     /     *-- (3) ref in  local repository
#          /     /     /
git pull test2 test2:test2

# Means this: From remote repository `test2` (1),
# fetch branch `test2` (2), store it in local branch `test2` (3), then
# merge the fetched history into HEAD.

Se está diciendo git pull para sobrescribir su sucursal test2 local con lo que el mando a distancia tiene en su rama test2 y luego la fusiona con HEAD. Es probable que no desea incluir la parte de destino de la refspec (el :test2).


Si la rama local de haber efectuado su salida está configurado para realizar un seguimiento de algo (ver las “ramas: ...” a continuación), acaba de hacer

git pull

Si necesita alimentación (o anulación) de un repositorio remoto y, solo suministra el nombre remoto / url y la sección local del mando a distancia (dejar fuera de la parte final de la refspec):

git pull test2 test2

tirar en una rama que no está activada fuera

git pull es (como se mencionó anteriormente) una combinación de git fetch y git merge (o git rebase ).

En general, una fusión podría implicar la resolución de conflictos. La resolución de conflictos requiere un árbol de trabajo. Por lo tanto, no es posible realizar una operación normal de mezcla sin un árbol de trabajo. Esto significa que la cabeza actual tiene que ser uno de los padres de la fusión (que serán los primeros padres). Haciendo un rebase también necesita un árbol de trabajo para la resolución de conflictos.

Desde un tirón implica una fusión o rebase, no es posible tirar en una sucursal local que no está desprotegido. Sólo se puede tirar en la rama actualmente desprotegido.

Ramas: Local, Seguimiento, seguimiento remoto

Los diversos tipos de ramas Git son todos del mismo objeto subyacente: refs. Refs viven en el espacio de nombres refs/ en $GIT_DIR/refs/ y $GIT_DIR/packed-refs.

  • ramas “local” viven en el espacio de nombres refs/heads/.
    • Para examinar la test2 ref rama local:
      • git show-ref refs/heads/test2, o
        • cat .git/refs/heads/test2, o
        • grep -F refs/heads/test2 .git/packed-refs
  • ramas “de seguimiento remoto” viven en los espacios de nombres refs/remotes/<remote-name>/.
    • ramas de seguimiento remoto son copias locales de las ramas de un repositorio remoto.
      • El nombre de “seguimiento a distancia” tiene sentido cuando se piensa en ello como esto, pero puede ser confundida con la funcionalidad --track lamentablemente con nombre de git branch y git checkout (ver el tipo rama final).
    • Para examinar el seguimiento a distancia test2 ref rama:
      • git show-ref refs/remotes/test2/test2, o
        • cat .git/refs/remotes/test2/test2, o
        • grep -F refs/remotes/test2/test2 .git/packed-refs
  • Las secciones locales que hacen un seguimiento otra rama son ramas locales normales (en refs/heads/) que tienen configuración adicional en $GIT_DIR/config:

    [branch "test2"]
            remote = test2
            merge = refs/heads/test2
    

    Es importante señalar que los merge (o) rebase configuración nombres de las opciones de un ref en el control remoto . Así refs/heads/test2 aquí significa la test2 rama local se encuentra en la test2 remoto. El nombre . a distancia especial puede ser usado para referirse a las sucursales locales en el repositorio local.

    • El propósito de las secciones locales que “pista” alguna otra rama es hacer que sea fácil simplemente git pull tipo y tienen que fusionar en (o rebase en la parte superior de) la historia de alguna otra rama.

Se dijo que quería distinguir ramas locales liso liso de las ramas locales que hacen un seguimiento alguna otra rama. Usted puede hacer esto mediante la búsqueda de la rama configuración en el archivo $GIT_DIR/config.

Se puede utilizar git config para hacer esto:

branch_tracks_something() {
    {
        git config branch."$1".merge ||
        git config branch."$1".rebase
    } >/dev/null 2>&1
}
# test local branch 
branch_tracks_something test2 && echo 'test2 tracks something' || echo 'test2 does not track anything'

O, si usted tiene Git 1.6.3 o posterior, puede utilizar el formato de %(upstream) git para-cada-ref

{ echo 'show_ref_desc() {
    case "$1" in
        refs/heads/*)
            t=''
            test -n "$2" && t=" (tracks $2)"
            echo "local: $1$t"
        ;;
        refs/remotes/*)
           echo "remote tracking: $1"
        ;;
        *)
            echo "other: $1"
        ;;
    esac
}'; git for-each-ref --shell --format='show_ref_desc %(refname) %(upstream)'; } |
sh

Las miradas de salida como la siguiente:

local: refs/heads/test2 (tracks refs/remotes/test2/test2)
remote tracking: refs/remotes/test2/HEAD
remote tracking: refs/remotes/test2/test2
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top