Supongamos que tengo 5 commits locales. Quiero enviar solo 2 de ellos a un repositorio centralizado (usando un flujo de trabajo de estilo 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 empujando los 5 commits locales.
Supongo que podría hacer git reset 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 rehacerlos.
Mi sensación es que alguna bandera pasada para 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
fuente
master~3
. Cualquier referencia al compromiso "hasta" deseado es igualmente válido, comoHEAD~3
oHEAD~~~
, o el SHA específico, o una etiqueta que etiqueta ese compromiso.git push
master
para el lado remoto de la especificación de referencia, comogit push origin tocommit:newbramch
Lo que hago es trabajar en una sucursal local llamada "trabajo". Esta rama contiene todas las confirmaciones temporales (como soluciones alternativas u opciones de compilación privadas o lo que sea) que no tengo la intención de enviar al repositorio ascendente. Yo trabajo fuera de esa rama, a continuación, cuando quiero cometer me cambio a la rama principal, cereza recoger las confirmaciones apropiadas que yo no quiero cometer, a continuación, empuje principal.
Después de llevar los cambios desde la parte superior a mi rama maestra, yo
git checkout work
ygit rebase master
. Eso reescribe todos mis cambios locales para estar al final de la historia.De hecho, estoy usando
git svn
este flujo de trabajo, por lo que implica mi operación "push"git svn dcommit
. También utilizotig
que es un buen visor de repositorio de GUI en modo de texto, para elegir los commits apropiados para masterizar.fuente
work
rama. Luego, fusiona ramas específicasmaster
para no perder el historial en ellas. Cuando trabajaswork
, fusionas todas tus ramas en él. Es más costoso, pero podría valer la pena en algunos casos.Por defecto, git-push empuja todas las ramas. Cuando haces esto:
Te mueves a un HEAD separado (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:
Si encuentra que el comportamiento predeterminado de empujar todas las ramas es confuso (¡y peligroso!), Agregue esto a su ~ / .gitconfig:
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:
fuente
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 commits están unidos como una cadena con un mecanismo padre / hijo. Por lo tanto, empujar una confirmación en realidad también empuja todas las confirmaciones principales a esta confirmación que no era conocida por el control remoto. Esto se hace implícitamente cuando se realiza
git push
la confirmación actual: todas las confirmaciones anteriores también se envían porque este comando es equivalente agit push HEAD
.Entonces, la pregunta podría reescribirse en Cómo impulsar una confirmación específica y esta confirmación específica podría ser HEAD ~ 2, por ejemplo.
Si las confirmaciones que desea impulsar no son consecutivas, simplemente vuelva a ordenarlas con un
git rebase -i
antes de la inserción específica .fuente
1) Use "git rebase" para reordenar sus confirmaciones, si lo desea.
Este comando mostrará algo como esto en su editor (estoy usando vim)
2) Reordene sus confirmaciones de acuerdo con su elección mediante un simple corte y pegado. Supongamos que el nuevo orden es
elegir 9781434 commitE
seleccione c3d4961 commitC
recoger 4791291 commitA
elija aa1cefc commitD
seleccione a2bdfbd commitB
Realice estos cambios en su editor y presione Ctrl + O (writeOut)
O también puedes usar
Puede verificar la nueva secuencia con
3) Ahora usa
Si solo una rama en remoto (origen) y una en local (maestro), solo use
Esto empujará commitB y commitD.
fuente