2010-01-06 11 views
10

Justo ahora cometí y presioné algo (sí, mi error en el push) que decidí que debía 'revertir' o 'deshacer'. Así que me dijeron que emitiera git reset --soft HEAD^ en mi extremo, y pensé que esto crearía de alguna manera un compromiso de "revertir" que una vez confirmado lo haría como si el cambio nunca hubiera sucedido. No me importa si la historia del cambio está allí, eso es exactamente lo que imaginé que sucedería.No se puede presionar Después de reiniciar el git --soft HEAD^

De todos modos, después de haber hecho eso me comprometí de nuevo, y luego, cuando traté de presionar, recibí el error de no avance rápido. Ahora, sé que arruiné algo con el reinicio, algo parecido a mi árbol y mi árbol de origen ahora no coinciden, pero me pregunto cómo solucionarlo. Ahora solo quiero volver al momento antes de emitir el restablecimiento, para poder revertir manualmente los cambios, eliminándolos manualmente y luego confirmando, a menos que alguien más pueda recomendar la forma correcta de revertir un commit push, y por esto no quiere decir que la historia deba desaparecer del registro o de nada.

Respuesta

7

Si entiendo correctamente su problema podría intentar lo siguiente:

(estoy asumiendo que esto es su rama 'master' y que está empujando a 'origen')

sincronización con su control remoto para llegar al mismo estado

git remote update 
git checkout master 
git merge origin/master 

Ahora revertir su cometen

git revert HEAD (or where ever the commit you want to revert is now) 
git commit -av 

sincronización con el mando a distancia

git push 
0

desea utilizar git revert HEAD para crear un nuevo commit eso sería deshacer el envío de datos a CABEZA. En su lugar, acaba de mover HEAD a la confirmación antes de la CABEZA actual.

+0

Gracias, eso tiene sentido, aunque esto probablemente hubiera sido mejor como comentario ya que realmente no soluciona mi problema. Gracias sin embargo. –

5

ahora sólo quiero volver a la época anterior emití el restablecimiento

Si sólo desea cancelar la git reset --soft que acabas de hacer, se puede consultar el ex jefe cometer id en el reflogs

$ git reflog 
$ git reset --soft formerCommit 

Y entonces usted puede preparar su git revert

+0

Gracias, esto es similar a lo que alguien en el IRC me dijo que hiciera, pero es bastante confuso, así que voy a ir con la respuesta de Rnicholson para fines de documentación. –

+1

No estaba familiarizado con git reflog. Muy genial. Aprendí algo nuevo. Esta es probablemente una mejor solución ya que condensa los primeros 3 pasos de mi respuesta a un comando. – rnicholson

0

Aunque mi respuesta está más allá de lo que están pidiendo, Creo que en realidad es lo que pretendes hacer.

Has utilizado git reset --soft HEAD^ para deshacer el compromiso que has realizado. Esto devuelve la copia de trabajo al estado anterior a su compromiso (ya HEAD puntos a sus cometer actual, y HEAD^ puntos a la anterior (suponiendo que no hay más que uno de los padres).

Pero ahora cuando git push le dicen algo como:

! [rejected]   <branch> -> <branch>e (non-fast-forward) 
error: failed to push some refs to 'ssh://<remote server>/<remote path>' 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Integrate the remote changes (e.g. 
hint: 'git pull ...') before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

Esto es decir que las confirmaciones no se alinean y es allí para evitar que se cometa un error El mensaje de error es un poco engañoso y no quiere hacer lo que sugiere. (un tirón para sincronizar su rama). Solo puede saber NO hacer esto debido a sus intenciones.

Simplemente puede evitar esto con un --force (o -f) (*):

git push --force 

Es posible que necesite ajustar la corriente arriba de nuevo:

git push --force --set-upstream origin <branch> 

Tenga en cuenta que esto tendrá consecuencias si otros ya han retirado su trabajo, ya que habrá diferentes compromisos que harán los mismos cambios (posiblemente). Ver https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#problems-With-rewriting-history.

Para evitar cualquier problema, sólo alguna vez hacerlo empuja a sus ramas (no una rama común - por ejemplo, la rama development los desarrolladores se fusionan todas sus ramas de característica en los) y asegúrese de tener una comunicación abierta en su equipo.

Un desarrollador podría normalmente utilizar este modelo para lo que llamo viernes por la tarde se compromete en la que desea guardar su trabajo antes del fin de semana en caso de fallo de hardware (pero volver a la pre-commit estado el lunes) .

*Friday* 

git add --all # To add all files whether they are tracked or not 
git commit -m "Friday afternoon commit" 
git --set-upstream push  # --set-upstream is for if the branch doesn't exist on the remote server 

*Monday* 

git reset --soft HEAD^ 
git push -f --set-upstream origin <branch> 

La ventaja de hacerlo de esta manera, en comparación con un git revert discutido en otra respuesta, es evitar confirmaciones adicionales. El restablecimiento tendrá 2 commits y de esta manera no tendrá ninguno (no hay más). La ventaja de git reset es que NO reescribirá el historial, por lo que es mucho más seguro, especialmente si no está seguro de lo que está haciendo.

(*) Normalmente, los repositorios están configurados para NO permitirte hacer esto para dominar: arregla una rama y crea una solicitud de extracción. Si ha leído el enlace anterior, reescribir el historial en el maestro tendrá consecuencias GRAVES (a menos que sea la única persona que haya clonado ese código).

Cuestiones relacionadas