Si se agregan algunos cambios al índice y hay algunos cambios que no se agregan al índice, ¿cómo puedo intercambiar estos dos conjuntos de cambios?¿Cuál es la forma más corta de intercambiar cambios por etapas y sin escena en git?
Respuesta
Se piensa que esto es más fácil de hacer con commits temporales. Cuando tiene confirmaciones escalonadas y sin escena, tiene la posibilidad de conflictos al intentar reordenar los cambios.
Hacer una confirmación con los cambios por etapas, crear una rama para su uso posterior:
git commit -m "Saved staged"
git branch save-staged
Hacer una confirmación con los cambios unstaged (si los cambios unstaged incluyen nuevos archivos es posible que necesite de forma explícita git add
ellos primero) :
git commit -a -m "Unstaged changes"
rebase los cambios unstaged sobre la cabeza originales (puede implicar la resolución de conflictos):
git rebase --onto HEAD^^ HEAD^
rebase los cambios escalonados sobre el cambio unstaged (puede implicar la resolución de conflictos):
git reset --hard save-staged
git rebase --onto [email protected]{1} HEAD^
Por último, restablezca el índice para los (originalmente) cambios unstaged:
git reset HEAD^
y mover el puntero rama de nuevo a la cabeza original:
git reset --soft HEAD^
rama temporal Eliminado:
git branch -D save-staged
sí, esta forma es demasiado compleja para comprenderla o recordarla, pero realmente funciona. Supongo que hay una manera más fácil, ¿tal vez usando parches? – whitered
@whitered: pregunta abierta: ¿qué tienes dificultad para entender? Las páginas man para restablecimiento, rebase y confirmación deben describir todas las opciones que he utilizado en detalle y los pasos que uso se suponen acciones lógicas paso a paso. –
Charles Bailey tiene un more complete solution que implica compromisos y la gestión de posibles conflictos de resolución.
yo estaba tratando originalmente para utilizar sólo git stash
, a excepción de lo que inicialmente se pasa por alto fue que git stash
Guardar guardará tanto el índice (por etapas cambios) y los cambios unstaged (lo cual es un inconveniente cuando se desea cambiar el contenido del índice con los cambios no escalonados).
Así que modifica para el enfoque siguiente en su lugar:
git commit
-m "temp cometer" (crear un compromiso para el índice actual)git stash
(esconder, obviamente, lo que aún no se añade al índice)git reset --soft HEAD^
(preservar los archivos previamente comprometidos)git stash
nuevogit stash pop [email protected]{1}
(una pplying no es lo que acaba de escondiste, pero lo escondiste antes, es decir, los cambios iniciales que aún no se han agregado al índice)git add -A
git stash drop [email protected]{1}
para limpiar el alijo hemos aplicado anteriormente (escondite @ {0} sigue contiene lo que estaba originalmente en el índice)
al final:
- lo que no se agrega al índice ahora se añade.
- lo que era inicialmente en el índice termina siendo escondido
'git stash' implica un' git reset --hard' entonces 'git reset --mixed' es un no-operativo y el segundo' git stash' no tiene nada que hacer? –
@Charles: a la derecha. He actualizado la respuesta para usar 'git stash --keep-index'. De esa forma, el 'git reset --mixed' tiene algo que ver;) – VonC
OK, pero no' git drop stash @ {1} 'seguramente no es correcto y si el último paso en su proceso es' git add -A '¿Entonces no vas a terminar con ningún cambio sin escena? No estoy seguro de que el alijo sea la respuesta, parece muy complejo hacerlo bien ;-). –
La forma de manchas (que no funciona para cambios binarios):
Guardar parches para ambos protagonizaron y estados unstaged
git diff >> unstaged.patch
git diff --cached >> staged.patch
Aplicar cambios originalmente unstaged
git reset --hard
git apply unstaged.patch
Etapa de estos cambios, excepto los archivos de parche
git add -A
git reset -- staged.patch unstaged.patch
Aplicar organizaron originalmente cambios
git apply staged.patch
Eliminar archivos del parche
rm staged.patch unstaged.patch
Solución interesante también. +1. Solo por curiosidad, ¿volvió a probar la versión actualizada de mi respuesta 'git stash'? – VonC
Sí, lo he vuelto a probar, funciona bien a menos que haya algunos archivos nuevos (sin seguimiento antes) organizados. Mi variante con parches falla también en este caso. – whitered
Para una solución de nivel inferior, se puede usar un poco de plomería para hablar directamente con el índice:
INDEXTREE=`git write-tree`
git add -A
WORKTREE=`git write-tree`
git checkout $INDEXTREE -- .
git clean -f
git read-tree $WORKTREE
Lo que hace es construir un par de objetos de árbol temporales en la tienda de git, uno para el índice y otro para el copia de trabajo. Luego, restaura el índice anterior y lo revisa en el árbol de trabajo. Finalmente. restablece el índice a la versión que representa el árbol de trabajo anterior.
No he probado esto, así que no estoy seguro de qué tan bien maneja los archivos agregados en el índice o en el árbol de trabajo.
+1 para un enfoque interesante – sehe
¡Gracias por la respuesta! Esto me inspiró a hacer una mejor versión para secuencias de comandos, y también a crear otra secuencia de comandos que pueda esconder solo cambios por etapas. – JesusFreke
Esto se basa en Walter Mundt's answer, pero funciona mejor cuando se organizan nuevos archivos. Esto está destinado a ser usado como un script, p. git-invert-index
#!/bin/sh
# first, go to the root of the git repo
cd `git rev-parse --show-toplevel`
# write out a tree with only the stuff in staging
INDEXTREE=`git write-tree`
# now write out a tree with everything
git add -A
ALL=`git write-tree`
# get back to a clean state with no changes, staged or otherwise
git reset -q --hard
git clean -fd
# apply the changes that were originally staged, that we want to
# be unstaged
git checkout $INDEXTREE -- .
git reset
# apply the originally unstaged changes to the index
git diff-tree -p $INDEXTREE $ALL | git apply --index --reject
(Tenga en cuenta que, como está escrito, esto puede eliminar algunos subdirectorios vacíos de la copia de trabajo durante la limpieza de git. Dada la desatención general de git para los directorios vacíos, esto puede ser difícil de evitar.) –
¿Por qué está utilizando "diff-tree | apply; agregue -A "en lugar de" pagar $ INDEXTREE -. "? Tenga en cuenta que el pago con un árbol no cambia su sucursal, por lo que los dos deben tener el mismo efecto neto, pero el pago debe ser mucho más rápido ya que no tiene que construir y analizar un archivo de parche y luego volver a explorar el árbol de trabajo para rellenar el índice. –
Para el primer árbol diff, desea los cambios entre árboles INDEXTREE guardados y TODOS. Solo retirar no es lo que quieres. Para el segundo caso, el uso de git checkout agrega los cambios de INDEXTREE al índice, pero deben ser eliminados – JesusFreke
- 1. Git parciales de cometer por etapas cambios
- 2. Forma más corta de intercambiar dos archivos en bash
- 3. ¿Cuál es la forma más corta de contar la cantidad de elementos en un generador/iterador?
- 4. ¿Cuál es la forma más sencilla de intercambiar char en una cadena con Python?
- 5. ¿Cuál es la forma más corta de implementar una clase proxy o decorador en C#?
- 6. ¿Cuál es la forma más fácil en Git de "seleccionar" cambios no confirmados en un archivo individual?
- 7. ¿Cuál es la forma más corta de generar una dirección IP aleatoria en Ruby?
- 8. Actualizar archivos por etapas
- 9. ¿Cuál es la forma más corta/más idiomática de determinar si una variable es cualquiera de una lista de valores?
- 10. ¿Cuál es la forma más pitónica de calcular los cambios porcentuales en una lista de números?
- 11. ¿Cuál es la forma más corta de imprimir bastante un org.w3c.dom.Document a stdout?
- 12. ¿Cuál es una forma buena y funcional de intercambiar elementos de colección en Scala?
- 13. ¿Cuál es la forma idiomática de intercambiar dos elementos en un vector?
- 14. Git: Lista de todos los cambios sin combinar en git
- 15. archivos de conteo de git en el índice por etapas
- 16. ¿Cuál es la forma más corta de delegar métodos no implementados en un objeto contenido en Java?
- 17. ¿Cuál es la forma más eficiente de obtener un arenero limpio de git?
- 18. git actualización del índice --assume-sin cambios y git reset
- 19. ¿Calcula la forma más corta de rotar, derecha o izquierda?
- 20. Puesta en escena automática con Git
- 21. ¿Cuál es la mejor/más segura forma de reinstalar Homebrew?
- 22. forma más corta de escribir jQuery $ (document) La función ready
- 23. ¿Cuál es el camino más rápido para encontrar la distancia más corta entre dos cartesiano polígonos
- 24. ¿Cuál es más rápido y por qué?
- 25. ¿Cuál es la forma más fácil de aplicar las series de parches de Git desde Thunderbird
- 26. Herramienta Git para eliminar líneas de la escena si solo consisten en cambios en el espacio en blanco
- 27. Copia de fotos en etapas S3 (usando rieles y clips)
- 28. Forma más corta de imprimir el año actual en Javascript
- 29. ¿Cuál es la forma más directa de clonar un repositorio vacío, * bare * git?
- 30. git puesta en escena y cometiendo entre múltiples ramas
Aquí estaba mi solución final (originalmente publicada aquí http: // stackoverflow.com/a/20458127/1139784) –