tutorial remota rama example español comandos cambiar and git

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.