En git, ¿es posible crear un alijo, empujar el alijo a un repositorio remoto, recuperar el alijo en otra computadora y aplicar el alijo?
O son mis opciones:
- Cree un parche y cópielo a la otra computadora, o
- ¿Crear una rama menor y comprometer el trabajo incompleto a esa rama?
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
elgit stash apply some-remote/stash
. Pero no puede obtener escondites más antiguos porque están almacenados en el registro que no es recuperable. Ver stackoverflow.com/questions/2248680/…Nota: Acabo de reescribir esta respuesta con 24 horas más de git-fu en mi haber :) En mi historial de shell, todo el shebang ahora tiene tres frases ingeniosas. Sin embargo, los he condensado para su conveniencia.
De esta manera, espero que puedas ver cómo hice las cosas, en lugar de tener que copiar / pegar cosas a ciegas.
Aquí está paso a paso.
Supongamos que es fuente en ~ / OLDREPO que contiene escondites. Cree un clon de PRUEBA que no contenga escondites:
Empuja todos los escondites como ramas temporales:
Bucle en el extremo receptor para transformar de nuevo en escondites:
Limpia tus ramas temporales si quieres
Haz una lista de git stash y obtendrás algo como esto:
En el repositorio original, el mismo parecía
fuente
git add .
antes delgit stash save ...
paso ya que segit stash
niega a guardar nuevos archivos a menos que hayan sido organizados. Además, canalizar el resultado agit rev-list ...
través detac
invierte el orden de los escondites para que salgan en el mismo orden.for
bucle final congit branch -D stash_$a
(limpiar a medida que se crean las reservas) para que si algo sale mal y volvemos a intentarlo, no reprocesamos las confirmaciones que ya se almacenaron correctamente.git stash save "$(git log --format='%s' -1 HEAD@{1})"
congit update-ref --create-reflog -m "$(git show -s --format=%B $rev)" refs/stash $rev
, obtendrá el mensaje de escondite original (update-ref
es lo que haygit stash save
detrás de escena).Llego un poco tarde a la fiesta, pero creo que encontré algo que funciona para mí con respecto a esto y que podría hacerlo también para usted si sus circunstancias son las mismas o similares.
Estoy trabajando en una función en su propia rama. La rama no se fusionó en master y se presionó hasta que finalizó o hice compromisos que me siento cómodo mostrando al público. Entonces, lo que hago cuando quiero transferir cambios no organizados a otra computadora es:
[non-commit] FOR TRANSFER ONLY
", con el contenido que desea transferir.Entonces hazlo:
git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb
La URL puede diferir para usted si accede a su repositorio de una manera diferente. Esto extraerá los cambios de esa URL desde la rama remota "rb" a la rama local "lb". Tenga en cuenta que tengo un servidor ssh ejecutándose en mi propia computadora, y puedo acceder al repositorio de esa manera.
git reset HEAD^
(implica--mixed
)Esto restablece el HEAD para apuntar al estado antes del compromiso "[sin compromiso]".
From git-reset (1): "
--mixed
: restablece el índice pero no el árbol de trabajo (es decir, los archivos modificados se conservan pero no se marcan para confirmar) [...]"Por lo tanto, tendrá sus cambios en los archivos al final, pero no se realizan confirmaciones para dominar y no es necesario un alijo.
Sin embargo, esto requerirá que lo haga
git reset --hard HEAD^
en el repositorio en el que realizó el "[no compromiso]", ya que ese compromiso es basura.fuente
Es un poco tarde, pero esta respuesta podría ayudar a alguien. Quería saber esto porque quería poder impulsar una función / error / lo que sea en progreso y trabajar desde el mismo punto en otra computadora.
Lo que funciona para mí es confirmar mi código en progreso (en una rama en la que estoy trabajando solo). Cuando llegue a mi otra computadora, haga un tirón, luego deshaga la confirmación con:
Continúa trabajando como eras, con todos tus cambios en progreso allí, sin compromiso y sin etapas.
Espero eso ayude.
fuente
Parece que hay un truco muy bueno para resolver esto. puede usar
git diff > file.diff
(y confirmar el archivo), luego restaurar los cambios usandogit apply file.diff
(desde cualquier lugar) para lograr el mismo resultado.Esto fue explicado aquí también.
fuente
Iría con un segundo enfoque, aunque no tengo idea de por qué no puedes comprometerlo a la rama maestra / destacada. Es posible hacer la recolección de cerezas también.
fuente
AFAIK toda la idea de esconder es esconder algo no tan importante debajo de la alfombra local . Nadie debería saber sobre tu basura favorita ;-) El único "pero" es: ¿Pero si me desarrollo en un par de estaciones de trabajo? Entonces
scp
es mucho mejor.fuente
La respuesta actualmente aceptada es técnicamente correcta, no puede decirle directamente a Git que empuje todas sus reservas a un control remoto y luego tire todo a sus reservas locales en otra computadora.
Y aunque la respuesta votada en la actualidad debería funcionar, no me gustó que cree un montón de ramas temporales, y que requiera verificar manualmente la confirmación de almacenamiento y guardarla como un alijo, lo que puede conducir a problemas como este comentario mencionado , y conduce a un duplicado
On (no branch): On testing:
. ¡Seguramente debe haber una mejor manera!Por lo tanto, si bien no puede empujar escondites directamente, un escondite es solo una confirmación (en realidad dos confirmaciones), y según la
git push
página de manual, puede empujar confirmaciones:Elegí empujar los escondites para
refs/stashes/*
no abarrotar mi control remoto con ramas adicionales. Entonces puedo hacer eso con:(El
rev-parse
comando obtiene el hash corto del alijo, que será único para el repositorio).A continuación, necesito buscar el alijo de la otra computadora. Git solo busca ramas de forma predeterminada, por lo que necesito buscar las reservas específicamente:
Ahora, para convertir el alijo, vuelva a comprometerse en un alijo real. Como se mencionó, si bien podría verificar el compromiso de ocultamiento, restablecimiento y ocultamiento como de costumbre, no me gusta que requiera pasos adicionales o que no pueda mantener el estado de índice para el ocultamiento. Estaba buscando en línea una forma de hacerlo automáticamente, pero mi búsqueda fué fallando. Finalmente busqué en la página del manual
git stash
, donde encontré esto:Como ya tengo el commit,
store
suena como lo que quiero. Entonces puedo hacer:Reemplazar
<SHA>
con el alijo que acaba de ser traído.(El
git show
comando obtiene el mensaje de confirmación del depósito oculto, para usarlo como mensaje para el registro oculto).El alijo ahora aparece como normal en mi repositorio local:
Para limpiar el control remoto, las reservas se pueden eliminar del control remoto de la siguiente manera:
Este método también tiene el beneficio de ser idempotente: si ejecuta el
push
comando nuevamente, informaráEverything up-to-date
. Elfetch
comando también se puede ejecutar de forma segura repetidamente. Si bienstash store
saltará el almacenamiento del alijo si es el mismo que el alijo más reciente, no evita duplicados de alijos más antiguos. Sin embargo, esto se puede solucionar, como lo hago en migit-rstash
script, ver a continuación.Para completar, también puede empujar fácilmente todos los escondites (con intento):
o importar todos los escondites recuperados:
He creado un intentoscript que se puede llamar como un subcomando (por ejemplo
git rstash push 0
) para que no tenga que recordar todo esto.git-rstash
Se puede encontrar aquí.fuente
Lo siguiente no funciona con el alijo, sino con los cambios no confirmados en el directorio de trabajo. Crea una rama, confirma automáticamente todos los cambios actuales y empuja al control remoto:
Usar como:
fuente
Simplemente crearía una nueva rama oculta y la eliminaría siempre que esa rama no sea necesaria.
fuente
Solo usa Dropbox como lo hizo este tipo. De esa manera, no tiene que preocuparse por empujar escondites ya que todo su código estaría respaldado.
http://blog.sapegin.me/all/github-vs-dropbox
fuente