Obtener el nombre de la twig de origen padre en git?

He clonado algunos repositorys de git e hice "git branch abcd", que me cambió a una twig derivada de origin / abcd. abcd no es la twig de origen por defecto. Luego, he creado una twig de características "my_feature" fuera de abcd. Quiero hacer "git merge origin / abcd" en my_feature en un script que sea aplicable independientemente del nombre de la twig de origen utilizada (o al less aplicable a casos fáciles cuando no hay estructuras de twigs complejas descritas en otras respuestas sobre git).

¿Cómo encuentro cuál es la twig de origen "más cercana" / "principal" de la que se creó la twig actual?

Esto es difícil de hacer bien. En git, una twig es solo un puntero que avanza automáticamente a una confirmación, y una confirmación puede tener cualquier número de nombres de twig en ella. Considera este caso:

your master: y1---y2---y3 / master: a---b---c---d---e \ feature: f1---f2---f3---f4 

Revisaste la twig "master" en c , y y1 , y2 , y y3 . Su historial se parece a abc y1 y2 y3 . Mientras tanto, el maestro ha avanzado a d , pero alguien creó una twig característica y cometió f1 a f4 function de c . Git no tiene manera de determinar que su twig proviene de la function master lugar de feature , por lo que en el mejor de los casos tendrá una opción de twigs para fusionarse.

Si hicieras esto automáticamente, tendrías que aplicar una heurística para seleccionar la twig más corta, o la twig más larga, o la que tenga la mayoría / less commits, o algo así. Naturalmente, dado que hay tantas opciones, no es realmente una buena opción para una function incorporada de git . Sin embargo, usando las funciones de "plomería" de git, puede escribir la suya propia:

 #!/bin/bash # Tries to determine a good merge base from among all local branches. # Here used, a "good" merge base is the one sharing the most recent commit # on this branch. This function will exit 1 if no branch is found, # or exit 2 in a tie. # # Untested - use at your own risk. MAX_SEARCH=20 # only search the last 20 commits on this branch FOUND=0 LAST_BRANCH= # iterate through the commits, most recent first for COMMIT in $(git rev-list --max-count=$MAX_SEARCH HEAD); do # check every local branch for BRANCH in $(git for-each-ref --format="%(refname)" refs/heads); do # look for the commit in that branch's history if (git rev-list $BRANCH | fgrep -q COMMIT); then echo $BRANCH FOUND=$((FOUND + 1)) LAST_BRANCH="$BRANCH" fi done if [ $FOUND -gt 1 ]; then # more than one choice; exit exit 2 elif [ $FOUND -eq 1 ]; then git merge $LAST_BRANCH exit 0 fi done exit 1 # could not find a parent 

Con un DVCS, no existe una "twig principal".

Una twig es:

  • un nombre
  • un compromiso inicial, y ese compromiso puede:
    • parte de múltiples twigs, tanto del repos como del uppo como ' origin '.
    • cambiar después de una rebase de su twig

Vea para más:

  • " ¿Cómo decir para qué twig era un commit de github? "
  • " Git: ¿Cómo enumerar las twigs que contienen una confirmación determinada? "

La única forma de que su script funcione es registrar el nombre del origin/branch , preferiblemente como git notes (ya que no cambia el historial y SHA1, sino que agrega un metadato).