¿Es posible en Git cambiar a otra rama sin verificar todos los archivos?
Después de cambiar de rama, necesito eliminar todos los archivos, regenerarlos, confirmar y volver a cambiar. Por lo tanto, retirar archivos es solo una pérdida de tiempo (y hay alrededor de 14.000 archivos; es una operación larga).
Para dejarlo todo claro:
Necesito todo esto para cargar la documentación en GitHub.
Tengo un repositorio con la rama gh-pages . Cuando reconstruyo la documentación localmente, la copio al directorio del repositorio, la confirmo y la envío a GitHub. Pero no estaba contento, porque tenía dos copias de documentación localmente. Y decidí crear una rama vacía y después de comprometerme, cambiar a vacía y eliminar archivos. Pero volver a cambiar es una operación larga, así que hice esta pregunta.
Sé que puedo dejar la rama gh-pages y eliminar archivos, pero no me gustan los árboles de trabajo sucio.
fuente
Respuestas:
Sí, usted puede hacer esto.
Si necesita confirmar en esta rama, también querrá restablecer el índice, de lo contrario, terminará cometiendo algo basado en la última rama extraída.
fuente
echo "ebff34ffb665de0694872dceabe0edeaf50ec5a9" > .git/HEAD
seguido degit reset
para señalar una referencia en lugar de una rama.git update-ref HEAD refs/heads/otherbranch
git stash
2.git checkout -b otherBranch
3.git stash pop
git update-ref
es útil, pero también mueve la punta de la rama actual.Usando solo comandos básicos de git:
Esta respuesta es un poco más larga que la de Charles, pero consiste únicamente en comandos básicos de git que puedo entender y así recordar, eliminando la necesidad de seguir buscándola.
Marque su ubicación actual (confirme primero si es necesario):
Reinicia (mueve) el marcador a la otra rama sin cambiar el directorio de trabajo:
ahora temp y otra rama apuntan a la misma confirmación, y su directorio de trabajo está intacto.
dado que su HEAD ya apunta a la misma confirmación, el directorio de trabajo no se toca
Tenga en cuenta que estos comandos también están disponibles desde cualquier cliente gráfico.
fuente
git reset --soft <branch where you want to go>
evitar actualizar el índicePara beneficio del lector:
Si bien creo que la solución de Charles Bailey es correcta, esta solución necesita un ajuste al cambiar a algo, que no es una sucursal local. También debería haber alguna forma de cómo hacerlo con comandos regulares que sea fácil de entender. Esto es lo que se me ocurrió:
Explicado:
git checkout --detach
es el mismogit checkout HEAD^{}
que deja atrás la rama actual y entra en "estado de cabeza separada". Entonces, la próxima modificación deHEAD
no más afecta a ninguna rama. ExtracciónHEAD
no afecta a la worktree ni el índice.git reset --soft commitish
luego pasaHEAD
al SHA de lo dadocommitish
. Si también desea actualizar el índice, déjelo--soft
, pero no recomiendo hacerlo. Esto, de nuevo, no toca el árbol de trabajo y (--soft
) no el índice.git checkout commitish
luego se uneHEAD
a lacommitish
(rama) dada nuevamente. (Sicommitish
es un SHA, no pasa nada). Esto tampoco afecta al índice ni al árbol de trabajo.Esta solución acepta todo lo que se refiere a un compromiso, por lo que es ideal para algunos
git
alias. Lorev-parse
siguiente es solo una prueba para asegurarse de que nada se rompa en la cadena, de modo que los errores tipográficos no cambien accidentalmente al estado de la cabeza separada (la recuperación de errores sería mucho más compleja).Esto conduce al siguiente
git hop treeish
alias:Para su información, puede encontrarlo en mi lista de
git
alias .fuente
$@
lugar de$*
? La diferencia es que $ @ sin expandir los argumentos entre comillas, que tienen espacios dentro.$@
definitivamente no se refiere aquí.$*
se usa en lugar de$1
, de modo que segit switch -f b
convierta en lo mismogit switch '-f b'
que debería ser un error. De esta manera puedo acortar el alias dejando de lado algunos errores de manejo como!f() { [ 1 = $# ] || { echo 'WTF!'; return 1; }; ..
¿No sería una mejor solución tener dos directorios de trabajo (dos áreas de trabajo) con un repositorio, o incluso dos repositorios?
Hay una herramienta git-new-workdir en la
contrib/
sección para ayudarlo con esto.fuente
git-new-worktree
secuencia de comandos es anterior algit worktree
subcomando; este comando no estaba disponible cuando se escribió la respuesta. El script, por ejemplo, requiere soporte de enlace simbólico; En mi humilde opinión, es mejor utilizar soporte nativo.Creo que estás buscando el comando de plomería
git read-tree
. Esto actualizará el índice pero no actualizará ningún archivo en su directorio de trabajo. Por ejemplo, asumiendo quebranch
es el nombre de la rama a leer:Si desea luego comprometerse con la rama que acaba de leer, también deberá:
fuente
read-tree
genera el error:fatal: Not a valid object name branch
si no había ningunogit switch branch
todavíaPuede sobrescribir su archivo HEAD con un nombre de rama diferente:
echo "ref: refs / heads / MyOtherBranch"> .git / HEAD
fuente
git symbolic-ref HEAD refs/heads/MyOtherBranch
kernel.org/pub/software/scm/git/docs/git-symbolic-ref.htmlgit symbolic-ref
?Con tantos archivos, puede que sea mejor mantener dos repositorios, uno para cada rama. Puede realizar cambios hacia adelante y hacia atrás según sea necesario. Esto va a ser menos sorprendente que intentar jugar una mala pasada con git.
fuente
git-new-worktree
para eso en su lugar (encontrib/
)Si simplemente está intentando cambiar dónde apunta una rama remota, puede hacerlo con "git push" sin tocar su copia local.
http://kernel.org/pub/software/scm/git/docs/git-push.html
por ejemplo, para actualizar foo para confirmar c5f7eba, haga lo siguiente:
No estoy seguro de si eso es lo que buscabas o no.
fuente
puedes hacer uso de
previous-branch-commit-id es la confirmación desde donde desea copiar los datos antiguos.
fuente
O simplemente use un archivo de parche para parchear desde su otra rama a su maestro
fuente
Diga que quiere estar en la rama A, pero con los archivos de la rama B
encuentre la referencia de confirmación actual de la rama A con git log, por ejemplo, "99ce9a2",
ahora debería estar en la rama A, con una estructura de carpetas correspondiente a B, que se muestran como cambios sin etapas (un historial no ha cambiado).
fuente