ver tipos tag modificados log etiquetas crear archivos git version-control

tipos - ¿Cómo presionas solo algunas de tus confirmaciones locales de git?



git ver archivos modificados (5)

Supongamos que tengo 5 confirmaciones locales. Quiero enviar solo 2 de ellos a un repositorio centralizado (usando un flujo de trabajo al estilo de SVN). ¿Cómo hago esto?

Esto no funcionó:

git checkout HEAD~3 #set head to three commits ago git push #attempt push from that head

Eso termina presionando los 5 compromisos locales.

Supongo que podría hacer un reinicio de git para deshacer mis commits, seguido de git stash y luego git push, pero ya tengo mensajes de commit escritos y archivos organizados y no quiero volver a hacerlos.

Mi sensación es que algún indicador pasado a presionar o restablecer funcionaría.

Si ayuda, aquí está mi configuración de git

[ramanujan:~/myrepo/.git]$cat config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = ssh://server/git/myrepo.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master


Respuesta corta:

git push <latest commit SHA1 until you want commits to be pushed>

Ejemplos:

git push fc47b2

git push HEAD~2

Respuesta larga:

Los compromisos se vinculan entre sí como una cadena con un mecanismo principal / secundario. Por lo tanto, al presionar un commit en realidad también empuja a todos los padres se compromete a este compromiso que no se conoce por el control remoto. Esto se hace implícitamente cuando se git push la confirmación actual: todas las confirmaciones anteriores también se presionan porque este comando es equivalente a git push HEAD .

Por lo tanto, la pregunta podría reescribirse en Cómo enviar un compromiso específico y este compromiso específico podría ser HEAD ~ 2, por ejemplo.

Si las confirmaciones que desea enviar no son consecutivas, simplemente vuelva a git rebase -i con una base de datos de git rebase -i antes del git rebase -i específico .


1) Use "git rebase" para reordenar sus commits, si así lo desea.

git rebase -i

Este comando mostrará algo como esto en tu editor (estoy usando vim)

pick 4791291 commitA pick a2bdfbd commitB pick c3d4961 commitC pick aa1cefc commitD pick 9781434 commitE # Rebase .............. # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit''s log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out ^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur Pos ^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text ^T To Spell

2) Reordene sus commits de acuerdo a su elección con un simple corte de pasta. Supongamos que el nuevo orden es

recoger 9781434 COMPRAR

recoger c3d4961 commitC

pick 4791291 commitA

elegir aa1cefc commitD

elegir a2bdfbd commitB

Haga estos cambios en su editor y presione ctrl + O (writeOut)

O también puedes usar

git rebase -i HEAD~<commitNumber>

Puedes verificar la nueva secuencia con

git log

3) Ahora usa

git push <remoteName> <commit SHA>:<remoteBranchName>

Si solo hay una rama en remoto (origen) y una en local (principal), solo use

git push <commit SHA> git push aa1cefc

Esto presionará commitB y commitD.


Lo que hago es trabajar en una sucursal local llamada "trabajo". Esta rama contiene todas las confirmaciones temporales (como soluciones provisionales o de compilación privada o lo que sea) que no pretendo enviar al repositorio de subida. Trabajo en esa rama, luego, cuando quiero comprometerme, cambio a la rama principal, selecciono con precisión las confirmaciones apropiadas que deseo confirmar, y luego envío el maestro.

Después de sacar los cambios de la corriente ascendente en mi rama principal, me puse a git checkout work y git rebase master . Eso reescribe todos mis cambios locales para estar al final de la historia.

De hecho, estoy usando git svn con este flujo de trabajo, por lo que mi operación "push" implica git svn dcommit . También uso tig que es un buen visualizador de repositorios gui en modo texto, para seleccionar los commits apropiados para masterizar.


Por defecto, git-push empuja todas las ramas. Cuando haces esto:

git checkout HEAD~3 #set head to three commits ago git push #attempt push from that head

Te mueves a una CABEZA separada (no estás en ninguna rama) y luego empujas todas las ramas, incluido el maestro local (que todavía está donde estaba) al maestro remoto.

La solución manual es:

git push origin HEAD:master

Si encuentra que el comportamiento predeterminado de presionar todas las ramas es confuso (¡y peligroso!), Agréguelo a su ~ / .gitconfig:

[remote.origin] push = HEAD

Entonces solo se empuja la rama en la que estás. En su ejemplo (una cabeza separada), habría recibido este mensaje de error, en lugar de presionar accidentalmente las confirmaciones incorrectas:

error: unable to push to unqualified destination: HEAD


Suponiendo que sus confirmaciones están en la rama principal y desea enviarlas a la rama maestra remota:

$ git push origin master~3:master

Si estabas usando git-svn:

$ git svn dcommit master~3

En el caso de git-svn, también podría usar HEAD ~ 3, ya que está esperando una confirmación. En el caso de git directo, debe usar el nombre de la rama porque HEAD no se evalúa correctamente en el refspec.

También podría tomar un enfoque más largo de:

$ git checkout -b tocommit HEAD~3 $ git push origin tocommit:master

Si está haciendo un hábito de este tipo de flujo de trabajo, debe considerar hacer su trabajo en una sucursal separada. Entonces podrías hacer algo como:

$ git checkout master $ git merge working~3 $ git push origin master:master

Tenga en cuenta que la parte "maestro de origen: maestro" es probablemente opcional para su configuración.