tutorial - git stash untracked files
''git stash apply'' con modo interactivo (3)
¿Es posible?
¡Sí lo es!
git checkout -p stash@{0}
Donde puede reemplazar el 0
en el stash@{0}
con el índice del alijo que desea aplicar.
Use git stash list
y git show -p stash@{n}
si no está seguro de cuál n
es el alijo que desea aplicar.
No se olvide de git stash drop stash@{n}
cuando sepa que ya no necesita ese alijo, ya que, obviamente, el proceso de git checkout
no lo hará por usted.
¿Por qué funciona?
La clave es darse cuenta de que los escondites son, en esencia, references a commits al igual que etiquetas y ramas.
De hecho, se almacenan en .git/refs/stash
, una línea por hash stash.
Advertencias
Como @mgadda mencionó en los comentarios a continuación, git checkout -p
intenta aplicar toda la diferencia entre un compromiso y el espacio de trabajo actual.
En el caso de un alijo de git, si el alijo que intentas aplicar se realizó contra un compromiso diferente, entonces git checkout -p stash@{n}
intentará aplicar interactivamente todas las diferencias entre el stash@{n}
compromiso stash@{n}
y la confirmación del espacio de trabajo actual, incluidas todas las confirmaciones principales que son diferentes .
Por ejemplo, si está intentando aplicar un alijo que se guardó "hace muchos compromisos" en el espacio de trabajo actual, git checkout -p stash@{n}
intentará aplicar no solo los cambios en el alijo adecuado, sino que también intente revertir todos los cambios que ocurrieron entre la confirmación en la que se basa el alijo y la confirmación actual.
Por el contrario, si está tratando de aplicar un alijo "del futuro", es decir, en una rama que es un número de confirmaciones anteriores al compromiso en el que se basa el alijo, entonces git checkout -p stash@{n}
intentará para aplicar también todos los otros cambios que ocurrieron entre el compromiso actual y el compromiso del futuro, además de los cambios del propio alijo.
(En caso de que se lo pregunte, git checkout -p stash@{n}
un alijo de una rama paralela intentará revertir todos los cambios entre el compromiso actual y el punto de bifurcación original y también aplicará todos los cambios entre el punto de bifurcación y el otro Rama, además del cambio en el alijo).
Soluciones
Hay algunas soluciones alternativas, ninguna de ellas es perfecta para cada situación:
- Tenga mucho cuidado con los parches que acepta cuando realiza
git checkout -p stash@{n}
- Tenga mucho cuidado con los parches que acepta cuando realiza
- Haga un
git stash pop
, luegogit stash
nuevamente antes de hacergit checkout -p ...
Pero si desea hacer una aplicación parcial de su alijo para evitar conflictos, esto realmente no ayudará. En ese caso, vea la solución 4 a continuación.
- Haga un
Si tiene una herramienta de diferencias gráficas soportada por git (como meld ), puede usar
git difftool
y "aplicar a la izquierda" solo los cambios que le interesan:git difftool -d stash@{n}
para comparar un stash completo y todos sus archivosgit difftool stash@{n} -- path/to/file
para comparar un solo archivo
- (Basado en la respuesta de @andrew) En una cabeza separada, vuelva al compromiso "principal" del alijo que le interesa, aplique el alijo, vuelva a esconder interactivamente solo las partes en las que está interesado, regrese y vuelva a aplicar el alijo más pequeño.
Paso a paso:
git checkout stash@{n}^ # notice the "^".
# Now you''re in a detached head in the parent commit of the stash.
# It can be applied cleanly:
git stash apply stash@{n}
# Now save only the diffs you''re interested in:
git stash -p
# remove the rest of the old stash
git checkout -- . # be careful or you could remove unrelated changes
# go back to the branch where you want to apply the smaller stash
git checkout <my previous branch>
# apply the smaller stash
git stash pop
Tengo una serie de archivos en un alijo ( stash{0}
) y me gustaría git apply
algunas partes / trozos de estos archivos (generalmente conocido como modo interactivo ).
¿Es posible?
He visto que es posible realizar una
git stash save -p ''Stash name''
Pero parece que no es posible hacerlo.
git stash apply -p ''Stash name''
¿Conoces una forma de lograrlo?
No creo que haya una manera de aplicar los cambios por parte de los hunks (o incluso por el archivo). Tendrá que aplicar el alijo, luego esconder los cambios que no desea interactivamente (con git stash save -p
). Si está preocupado por los conflictos, puede esconder primero cualquier cambio no confirmado, aplicar su alijo, esconder cualquier tío en conflicto y luego aplicar el otro alijo.
Una forma posible es restablecer el índice y luego usar el complemento interactivo
# 0. ensure there are no uncommitted changes
git status
# 1. apply a changeset as is
git stash apply stash@{n}
# ... fix or discard conflicts if any
# 2. reset the index
git reset
# 3. interactively add the required chunks (except new files)
git add -p
# 4. stash all other changes
git stash save --keep-index "comment"
# 4. or just discards all other changes in the working tree
git checkout-index -f -a
# 5. commit
git commit -m "comment"
Otra forma es usar el reinicio interactivo en lugar del complemento interactivo.
# 0. ensure the working tree does not have unstaged changes
git status
# 1. apply a changeset as is
git stash apply stash@{n}
# ... fix or discard conflicts if any
# 2. interactively exclude the unneeded chunks from the index
git reset -p
# 3. stash all other changes
git stash save --keep-index "comment"
# 3. or just discards all other changes in the working tree
git checkout-index -f -a
# 4. commit
git commit -m "comment"