2012-03-01 22 views
189

Cambio a maestro después de desarrollar en una rama durante mucho tiempo. El registro muestra:¿Cómo avanzar rápidamente una rama a la cabeza?

Su sucursal está detrás de 'origen/maestro' por 167 confirmaciones, y se puede reenviar rápidamente.

Traté:

git checkout HEAD 

No tiene ningún efecto. Esto se debe a que he cancelado una confirmación intermedia en el maestro.

¿Cómo hacer que el maestro se quede en la cabeza?

Respuesta

207

Haciendo:

git checkout master 
git pull origin 

buscará e fusionar la rama origin/master (es posible que acaba de decir git pull como origen es el valor por defecto).

+41

Creo que la respuesta de Rob es mejor. Por lo general, encuentro esta situación en la que * he terminado de tirar * y luego cambio a una rama diferente, que necesita ser reenviada rápidamente. Me resulta molesto si tengo que hacer otra extracción (no operativa) y esperar a que se complete; hacer una operación solo local es más rápido y es lo que quiero de todos modos. –

270

Pruebe git merge origin/master. Si quiere asegurarse de que solo avance, puede decir git merge --ff-only origin/master.

+4

Esto es agradable de usar cuando su control remoto tiene algunos aros de autenticación para pasar. Cuando tiro en una rama, tengo que autenticar. Luego, cuando cambio a otra rama (es decir, para seleccionar mis cambios), prefiero usar este comando 'merge' para que no tenga que volver a autenticarse. – RustyTheBoyRobot

+19

'--ff-only' es extremadamente útil. – Luke

+1

No sé si se requiere la porción 'origin/master' o si falla sensiblemente, pero me pareció útil crear un alias para avanzar rápido, así que quería asegurarme de que se utilizaba la rama ascendente en lugar de codificarla con dificultad. a 'origin/master':' ff = merge --ff-only @ {u} '(' @ {u} 'está en sentido ascendente). – Thor84no

26
git checkout master 
git pull 

debería hacer el trabajo.

Aparecerá el mensaje "Su bifurcación está detrás" cada vez que trabaje en una rama diferente al maestro, alguien realice cambios en el maestro y git pull.

(branch) $ //hack hack hack, while someone push the changes to origin/master 
(branch) $ git pull 

ahora se tira del/de referencia maestra origen, pero su maestro es no se fusionaron con él

(branch) $ git checkout master 
(master) $ 

ahora principal está detrás del origen/maestra y se puede reenviar rápida

this will pull and merge (so merge also newer commits to origin/master) 
(master) $ git pull 

this will just merge what you have already pulled 
(master) $ git merge origin/master 

ahora su maestro y el origen/maestro están sincronizados

29

En su situación, git rebase también haría el truco. Como no tiene cambios que el maestro no tenga, git simplemente avanzará rápidamente. Si está trabajando con un flujo de trabajo de rebase, eso podría ser más recomendable, ya que no terminaría con una fusión si comete un error.

[email protected]:~/work$ git status 
# On branch master 
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded. 
# (use "git pull" to update your local branch) 
# 
nothing to commit, working directory clean 
[email protected]:~/work$ git rebase 
First, rewinding head to replay your work on top of it... 
Fast-forwarded master to refs/remotes/origin/master. 
# On branch master 
nothing to commit, working directory clean 
+0

¡Y muy útil para mí ya que no se supone que usemos git pull! – Stefan

+0

Incluso si tiene algún cambio pendiente, siempre puede esconder y rebase, no sé si esta es la manera "correcta" pero funciona de maravilla. –

2

No hay complejidades requieren simplemente de pie en su oficina y hacer un git tire que trabajó para mí

O, como un segundo intento git origen tirón maestro sólo en caso de que si tienes la mala suerte con el primer comando

5

Si está de pie en una rama diferente y quiere obtener la versión más reciente del maestro también se puede hacer

git checkout -B master origin/master

0

mueve el puntero del almuerzo en la cabeza:

git branch -f master 

Su rama master ya existe, por lo que git no le permitirá a la sobrescribe, a menos que utilice ... -f (este argumento significa --force)

O puede utilizar rebase:

git rebase HEAD master 

hacerlo por su propia cuenta y riesgo;)

0

Para rebase la actual locales rastreador rama moviendo los cambios locales en la parte superior de la última estado remoto:

$ git fetch && git rebase 

De manera más general, a avance rápido y soltar los cambios locales ( restablecimiento completo) *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name} 

a avance rápido y mantener los cambios locales (rebase):

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name} 

* - para deshacer el cambio causado por no intencional Hard Reset primero hacer git reflog, que muestra el estado de la cabeza en orden inverso , encuentre el hash al que HEAD apuntaba antes de la operación de reinicio (generalmente obvio) y restablezca completamente la rama a ese hash.

Cuestiones relacionadas