remota - cambiar la rama de git sin archivos de pago
git push example (9)
¿No sería una mejor solución tener dos directorios de trabajo (dos áreas de trabajo) con un repositorio, o incluso dos repositorios?
Hay git-new-workdir herramienta git-new-workdir en contrib/
section para ayudarte con esto.
¿Es posible en Git cambiar a otra sucursal sin revisar todos los archivos? Después de cambiar de rama, necesito eliminar todos los archivos, regenerarlos, confirmar y volver a abrir. Por lo tanto, revisar archivos es una pérdida de tiempo (y hay aproximadamente 14000 archivos, es una operación larga).
Para aclarar todo:
Necesito todo esto para subir la documentation a github.
Tengo un repo con la rama gh-pages. Cuando reconstruyo la documentación localmente, la copio al directorio repo, commit y push a github. Pero no estaba contento porque tenía dos copias de la documentación a nivel local. Y decidí crear una rama vacía y después de activar el interruptor para vaciar y eliminar archivos. Pero volver atrás es una operación larga, así que hice esta pregunta.
Sé que puedo irme en la sucursal de gh-páginas y eliminar archivos, pero no me gustan los árboles sucios que funcionan)
Con tantos archivos, es mejor que solo conserve dos repositorios, uno para cada sucursal. Puede hacer cambios hacia adelante y hacia atrás según sea necesario. Esto va a ser menos sorprendente que tratar de jugar trucos escorbuto con git.
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 branch
es el nombre de la rama para leer:
git read-tree branch
Si quieres comprometerte con la sucursal que acabas de leer, también necesitarás:
git symbolic-ref HEAD refs/heads/branch
Para el beneficio del lector:
Si bien creo que share es correcta, esta solución necesita un ajuste cuando se cambia a algo, que no es una sucursal local. También debería haber alguna forma de hacerlo con comandos regulares, lo cual es fácil de entender. Aquí es lo que se me ocurrió:
git checkout --detach
git reset --soft commitish
git checkout commitish
Explicado:
-
git checkout --detach
es lo mismo quegit checkout HEAD^{}
que deja atrás la rama actual y entra en "estado de cabeza separada". Entonces la próxima modificación deHEAD
no afecta más a ninguna rama. SepararHEAD
no afecta el árbol de trabajo ni el índice. -
git reset --soft commitish
luego mueveHEAD
al SHA delcommitish
dado. Si desea actualizar el índice, también, deje--soft
distancia, pero no lo recomiendo. Esto, nuevamente, no toca el árbol de trabajo, y (--soft
) no el índice. -
git checkout commitish
luego uneHEAD
a lacommitish
dada (branch) 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 alias de git
. El siguiente rev-parse
es solo una prueba para asegurarse de que nada se rompa en la cadena, de modo que los errores tipográficos no se cambian accidentalmente a un estado principal separado (la recuperación de errores sería mucho más compleja).
Esto lleva al siguiente git switch treeish
alias:
git config --global alias.switch ''!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f''
Puede sobrescribir su archivo HEAD con un nombre de rama diferente:
echo "ref: refs / heads / MyOtherBranch"> .git / HEAD
Sí, usted puede hacer esto.
git symbolic-ref HEAD refs/heads/otherbranch
Si necesita comprometerse en esta rama, también querrá restablecer el índice, de lo contrario terminará comprometiendo algo en función de la última rama desprotegida.
git reset
Si simplemente intenta cambiar el punto de una rama remota, puede hacerlo con "git push" sin tocar su copia local.
http://kernel.org/pub/software/scm/git/docs/git-push.html
El formato de un parámetro <refspec> es un plus + opcional, seguido de la fuente ref <src>, seguido de dos puntos:, seguido de la referencia de destino <dst>. Se utiliza para especificar con qué objeto <src> se actualizará la <dst> ref en el repositorio remoto.
Por ejemplo, para actualizar foo para cometer c5f7eba, haga lo siguiente:
git push origin c5f7eba:foo
No estoy seguro de si eso es lo que buscabas o no.
puedes hacer uso de
1. git checkout -f <new-branch>
2. git cherry-pick -x <previous-branch-commit-id>
previous-branch-commit-id es la confirmación desde donde desea copiar los datos antiguos.
Usando comandos básicos de git solo:
Esta respuesta es un poco más larga que la de Charles, pero consiste únicamente en comandos git básicos que puedo entender y recordar así, eliminando la necesidad de seguir buscándolo.
Marque su ubicación actual (comprométase primero si es necesario):
git checkout -b temp
Restablece (mueve) el marcador a la otra rama sin cambiar el directorio de trabajo:
git reset <branch where you want to go>
ahora la temperatura y otras ramificaciones apuntan a la misma confirmación, y su directorio de trabajo permanece intacto.
git checkout <branch where you want to go>
dado que su HEAD ya está apuntando a la misma confirmación, no se toca el directorio de trabajo
git branch -d temp
Tenga en cuenta que estos comandos también están disponibles en cualquier cliente gráfico.