¿Cómo encontrar si una rama es una rama o usuario rastreado localmente creado rama local?
-
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 ' / p>
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
-
-
- Para examinar la
- 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).
- El nombre de “seguimiento a distancia” tiene sentido cuando se piensa en ello como esto, pero puede ser confundida con la funcionalidad
- 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
-
-
- ramas de seguimiento remoto son copias locales de las ramas de un repositorio remoto.
-
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 latest2
rama local se encuentra en latest2
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.
- El propósito de las secciones locales que “pista” alguna otra rama es hacer que sea fácil simplemente
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