remota - Git checkout y fusionar sin tocar el árbol de trabajo
git push example (4)
Digamos que tengo una rama de función, en la que fusiono los cambios anteriores antes de rechazar mis cambios
git branch feature1
... [edit my code]
... [commit]
git fetch origin master
git merge fetch_head [or rebase]
... [resolve conflicts]
... [build and test code]
En este punto quiero empujar mis cambios. La forma normal de hacer esto sería:
git checkout master [changes a bunch of working tree files]
git merge feature1 [changes the same files right back]
Esto funciona bien, pero hará que el compilador (verificando la fecha) piense que una gran cantidad de archivos están sucios y necesita una reconstrucción a pesar de que el contenido es el mismo. ¿Hay una forma de pago y combinación que no modifique el árbol de trabajo en este caso?
Algo como:
git checkout master --merge-branch feature1
EDITAR:
Solo estoy hablando de combinaciones de avance rápido que, por definición, no cambiarían el estado de los archivos.
No hay forma de que la combinación (o la reorganización) funcione sin tocar el directorio de trabajo (y el índice), ya que puede haber conflictos de combinación que deben resolverse utilizando el directorio de trabajo (y / o el índice).
Siempre puede tener otro clon (tal vez utilizando alternativamente, o el directorio de objetos symlinking, para ahorrar espacio en el disco), u otro directorio de trabajo con contrib/workdir/git-new-workdir
. O usa una herramienta como ccache .
Si solo le importan un par de archivos y está usando Unix, puede cambiar manualmente el mtime después del hecho usando touch -d <timestamp>
. Asegúrese de usar ls --full-time
para obtener la marca de tiempo, ya que la pantalla predeterminada carece de precisión.
Por ejemplo, imagine que está usando Docker para crear una imagen para una aplicación web basada en Python. Si el archivo Requirements.txt cambia, se tarda mucho tiempo en reconstruirse, ya que tiene que descargar un montón de bibliotecas de terceros y compilarlas. Simplemente reinicia el archivo mtime de ese archivo después de fusionar
ls -og --full-time src/requirements.txt
# -rw-r--r-- 1 282 2015-11-04 20:03:28.918979065 +0400 src/requirements.txt
git checkout master
git merge --no-ff feature-foo
touch src/requirements.txt -d "2015-11-04 20:03:28.918979065 +0400"
Una forma simple y segura de hacer esto, sin un empuje o una actualización forzada, es obtener la característica 1 en el maestro:
(feature1)$ git fetch . feature1:master
From .
4a6000d..8675309 feature1 -> master
El truco está usando .
para obtener la característica local 1 ref. Esto es más seguro que la actualización forzosa de la rama maestra, ya que garantiza que la actualización sea un avance rápido. (Consulte el parámetro <refspec> en la documentación de git-fetch para obtener más información).
Ahora que feature1 y master son iguales, cambiar entre ellos no tocará ningún archivo:
(feature1)$ git checkout master
Switched to branch ''master''
(master)$
[Editar] Esto es solo una solución / solución parcial. Vea la respuesta real por @djpohly a continuación.
En primer lugar, puede empujar desde cualquier lugar. No importa lo que haya comprobado, o si las confirmaciones que desea empujar están en maestro.
git push REMOTE_REPO feature1:master
ver git help push
Sugerencia: git push remoteRepo localRef:remoteRef
En cuanto a llevar al maestro a donde estás ahora sin jugar con tu copia de trabajo ... Puedes forzarlo así:
# (while still on feature1 branch)
git checkout -B master origin/master
Pero esto hace un reinicio duro en el maestro. es decir, no comprueba el avance rápido.