¿Cómo 'git pull' en una twig que no es la actual?

Cuando ejecuta git pull en la twig master , normalmente se extrae del origin/master . Estoy en una twig diferente llamada newbranch , pero necesito ejecutar un command que haga un git pull desde el origin/master al master pero no puedo ejecutar git checkout para cambiar la twig seleccionada hasta que se complete el pull. ¿Hay alguna forma de hacer esto?

Para dar algunos antecedentes, el repository almacena un website. newbranch algunos cambios en newbranch y los implementé cambiando el website a newbranch . Ahora que esos cambios se han fusionado antes de la twig master , estoy intentando cambiar el website a la twig master también. En este punto, newbranch y origin/master son idénticos, pero el master está quedando atrás del origin/master y necesita ser actualizado. El problema es, si lo hago de la manera tradicional:

 $ git checkout master # Uh oh, production website has now reverted back to old version in master $ git pull # Website is now up to date again 

Necesito lograr lo mismo que arriba ( git checkout master && git pull ), pero sin cambiar el directory de trabajo a una revisión anterior durante el process.

Solutions Collecting From Web of "¿Cómo 'git pull' en una twig que no es la actual?"

Tienes un tree de trabajo que no quieres tocar, así que usa otro. El clon es barato, está hecho para esto.

 git fetch origin master # nice linear tree git clone . ../wip -b master # wip's `origin/master` is my `master` cd ../wip # . git pull origin origin/master # merge origin's origin/master git push origin master # job's done, turn it in. cd ../main rm -rf ../wip # wip was pushed here, wip's done git checkout master # payload 

Esto se responde aquí: fusionar, actualizar y extraer las twigs de Git sin utilizar los checkouts

 # Merge local branch foo into local branch master, # without having to checkout master first. # Here `.` means to use the local repository as the "remote": git fetch . foo:master # Merge remote branch origin/foo into local branch foo, # without having to checkout foo first: git fetch origin foo:foo 

Directo: tirando desde una twig remota hacia un maestro de twig actualmente no desprotegido:

 git pull origin master:master 

donde el origen es su control remoto y actualmente está desprotegido en alguna twig, por ejemplo, dev

Como resultado, la respuesta es engañosamente simple:

 $ git fetch # Update without changing any files $ git branch -d master # Remove out-of-date 'master' branch $ git checkout --track origin/master # Create and check out up-to-date 'master' branch 

Esto le permite actualizar la twig master sin cambiar a ella hasta que se haya actualizado.

Le preocupa algo que no se puede solucionar, ya que las operaciones de Git no son atómicas. Siempre tendrá un agujero donde su directory de trabajo se encuentra a medio path entre las twigs, incluso si actualiza el maestro sin cambiarlo primero. Esta es la razón por la que Git no es una herramienta de implementación .

Dado que en realidad no está cometiendo ningún código en su entorno de producción (espero), en realidad no necesita que le desprotejan una twig. Simplemente puede hacer una git fetch para actualizar sus references remotas, y luego git checkout origin/master para mover el directory de trabajo directamente a la confirmación apuntada actualmente por origin/master . Esto te pondrá en un estado principal separado, pero una vez más, como no estás cometiendo un código, esto no importa.

Este es el agujero más pequeño que vas a get, pero como dije, aún existe un agujero; checkout no es atómico.

Puede usar update-ref para esto:

 git fetch git update-ref refs/heads/master origin/master git checkout master 

Tenga en count que esto descartaría cualquier compromiso local en la twig principal. En su caso, no habrá ninguno, así que esto está bien. Para otras personas que intentan hacer esto cuando hay confirmaciones locales, no creo que sea posible, ya que la fusión solo se puede ejecutar en la twig actual.

La solución de Malvineous funciona para mí

 $ git fetch # Update without changing any files $ git branch -d master # Remove out-of-date 'master' branch $ git checkout --track origin/master # Create and check out up-to-date 'master' branch 

Solo da el error

 warning: not deleting branch 'master' that is not yet merged to 'refs/remotes/origin/master', even though it is merged to HEAD. error: The branch 'master' is not fully merged. If you are sure you want to delete it, run 'git branch -D master'. 

Entonces corro con la opción -D

Gracias

¿Esto no lo hace? (Suponiendo que esté en su twig de características):

git pull origin master

Esto atraerá al último maestro a su twig de características actual.