repositorio - git push example
Restablecer la rama del repositorio local para que sea igual que el repositorio remoto HEAD (18)
Aquí hay un script que automatiza lo que sugiere la respuesta más popular ... Consulte https://stackoverflow.com/a/13308579/1497139 para obtener una versión mejorada que admita sucursales
#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
git branch "auto-save-at-$timestamp"
fi
git fetch origin
git reset --hard origin/master
¿Cómo puedo restablecer mi sucursal local para que sea igual que la sucursal en el repositorio remoto?
Yo si:
git reset --hard HEAD
Pero cuando ejecuto un git status
,
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: java/com/mycompany/TestContacts.java
modified: java/com/mycompany/TestParser.java
¿Puedes decirme por qué tengo estos ''modificados''? No he tocado estos archivos? Si lo hice, quiero eliminar esos.
Esto es algo a lo que me enfrento regularmente, y he generalizado el script Wolfgang proporcionado anteriormente para trabajar con cualquier rama
También agregué un mensaje "¿estás seguro?", Y algunos resultados de comentarios
#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] ||
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
git branch "auto-save-$branchname-at-$timestamp"
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname
La única solución que funciona en todos los casos que he visto es eliminar y volver a clonar. Tal vez haya otra forma, pero obviamente de esta manera no hay posibilidad de que el estado se quede allí, así que lo prefiero. Bash one-liner puede configurarse como macro si a menudo desordena las cosas en git:
REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH
* asume que tus archivos .git no están dañados
La configuración de su rama para que coincida exactamente con la rama remota se puede hacer en dos pasos:
git fetch origin
git reset --hard origin/master
Si desea guardar el estado de su sucursal actual antes de hacer esto (por si acaso), puede hacer:
git commit -a -m "Saving my work, just in case"
git branch my-saved-work
Ahora su trabajo se guarda en la rama "mi trabajo guardado" en caso de que decida que lo quiere de nuevo (o si quiere verlo más tarde o lo difunda con su rama actualizada).
Tenga en cuenta que el primer ejemplo asume que el nombre del repositorio remoto es "origen" y que la rama llamada "maestro" en el repositorio remoto coincide con la rama actualmente retirada en su repositorio local.
Por cierto, esta situación en la que te encuentras se parece mucho a un caso común en el que se ha realizado un empuje en la rama que actualmente se está desprotegiendo de un repositorio no disponible. ¿Recientemente presionaste en tu repositorio local? Si no es así, no se preocupe, algo más debe haber causado que estos archivos se modifiquen inesperadamente. De lo contrario, debe tener en cuenta que no se recomienda ingresar en un repositorio no desnudo (y no en la rama actualmente retirada, en particular).
Las respuestas anteriores suponen que la rama que se va a restablecer es la rama actual (desprotegida). En los comentarios, OP hap497 aclaró que la sucursal está efectivamente retirada, pero esto no está explícitamente requerido por la pregunta original. Como hay al menos una pregunta "duplicada", restablecer la rama completamente al estado del repositorio , que no asume que la rama está activada, aquí hay una alternativa:
Si la rama "mybranch" no está actualmente activada, para restablecerla a la cabeza de la rama "myremote / mybranch" remota, puede usar este comando de low-level :
git update-ref refs/heads/mybranch myremote/mybranch
Este método deja la rama desprotegida tal como está, y el árbol de trabajo intacto. Simplemente mueve la cabeza de mybranch a otro commit, cualquiera sea el segundo argumento. Esto es especialmente útil si es necesario actualizar varias sucursales a nuevos cabezales remotos.
Sin embargo, gitk
cuidado al hacer esto y use gitk
o una herramienta similar para verificar la fuente y el destino. Si accidentalmente haces esto en la rama actual (y git no te impedirá esto), puedes confundirte, porque el nuevo contenido de la rama no coincide con el árbol de trabajo, que no cambió (para corregirlo, vuelve a actualizar la rama, a donde estaba antes).
Necesitaba hacer (la solución en la respuesta aceptada):
git fetch origin
git reset --hard origin/master
Seguido por:
git clean -f
para eliminar archivos locales
Para ver qué archivos se eliminarán (sin eliminarlos realmente):
git clean -n -f
Ninguna cantidad de reinicio y limpieza pareció tener ningún efecto en los archivos modificados y sin seguimiento en mi repositorio local de git (probé todas las opciones anteriores). Mi única solución para esto fue reagrupar el repositorio local y volver a clonarlo desde el control remoto.
Afortunadamente no tenía ninguna otra rama que me importara.
Primero, reinicie la HEAD
previamente recuperada de la rama ascendente correspondiente:
git reset --hard @{u}
La ventaja de especificar @{u}
o su forma detallada @{upstream}
es que el nombre del repositorio remoto y la rama no tienen que ser explícitamente especificados.
A continuación, según sea necesario, elimine los archivos sin seguimiento, opcionalmente también con -x
:
git clean -df
Finalmente, según sea necesario, obtén los últimos cambios:
git pull
Si desea que los cambios actuales se usen más adelante, entonces guarde los cambios de otra manera, puede usar estos dos comandos,
git fetch origin
git reset --hard origin/master
Si desea restablecer su sucursal local a la última confirmación en la rama ascendente, lo que me funciona hasta ahora es:
Verifique sus controles remotos, asegúrese de que su origen y su origen sean lo que usted espera; si no es como lo espera, use git remote add upstream <insert URL>
, por ejemplo, del repositorio original de GitHub del que formó el bifurcación, y / o git remote add origin <insert URL of the forked GitHub repo>
.
git remote --verbose
git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
O:
git fetch upstream master;
git reset --hard upstream/master;
git clean -d --force;
En GitHub, también puede retirar la rama con el mismo nombre que la local, para guardar el trabajo allí, aunque esto no es necesario si el desarrollo de origen tiene los mismos cambios que la rama local de trabajo guardado. Estoy utilizando la rama de desarrollo como ejemplo, pero puede ser cualquier nombre de rama existente.
git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop
Luego, si necesita fusionar estos cambios con otra rama mientras existe algún conflicto, conservando los cambios en desarrollo, use:
git merge -s recursive -X theirs develop
Mientras se usa
git merge -s recursive -X ours develop
para preservar los cambios conflictivos de branch_name. De lo contrario, use un mergetool con git mergetool
.
Con todos los cambios juntos:
git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;
Tenga en cuenta que en lugar de upstream / development puede usar un hash de confirmación, otro nombre de rama, etc. Use una herramienta CLI como Oh My Zsh para verificar que su rama esté verde, lo que indica que no hay nada que confirmar y que el directorio de trabajo está limpio ( lo cual es confirmado o también verificable por el git status
). Tenga en cuenta que esto puede agregar compromisos en comparación con el desarrollo en sentido ascendente si hay algo agregado automáticamente por un compromiso, por ejemplo, diagramas UML, encabezados de licencia, etc., por lo que, en ese caso, podría extraer los cambios en el origin develop
para origin develop
en upstream develop
, si necesario.
Si desea volver al estado HEAD
tanto para el directorio de trabajo como para el índice, debería git reset --hard HEAD
, en lugar de HEAD^
. (Esto puede haber sido un error tipográfico, al igual que el guión simple contra el doble para --hard
).
En cuanto a su pregunta específica sobre por qué esos archivos aparecen en el estado modificado, parece que quizás hizo un restablecimiento automático en lugar de un restablecimiento completo. Esto hará que los archivos que se modificaron en la confirmación HEAD
aparezcan como si estuvieran almacenados, lo que probablemente sea lo que está viendo aquí.
Si no le importa guardar sus cambios locales, pero aún desea actualizar su repositorio para que coincida con el origen / HEAD, simplemente puede esconder sus cambios locales y luego extraer:
git stash
git pull
Si tuvo un problema como yo, que ya ha realizado algunos cambios, pero ahora, por cualquier motivo que desee deshacerse de él, la forma más rápida es usar git reset
como este:
git reset --hard HEAD~2
Tenía 2 confirmaciones no necesarias, de ahí el número 2. Puede cambiarlo a su propia cantidad de confirmaciones para restablecer.
Entonces, respondiendo a su pregunta, si tiene 5 confirmaciones por delante del repositorio remoto HEAD, debe ejecutar este comando:
git reset --hard HEAD~5
Tenga en cuenta que perderá los cambios que ha realizado, así que tenga cuidado.
Siempre que el repositorio remoto sea de origin
y que esté interesado en branch_name
:
git fetch origin
git reset --hard origin/<branch_name>
Además, debes restablecer la rama de origin
actual a HEAD
.
git fetch origin
git reset --hard origin/HEAD
Cómo funciona:
git fetch origin
descarga lo último desde el control remoto sin intentar fusionar o volver a generar nada.
Luego, el git reset
restablece la rama <branch_name>
a lo que acabas de recuperar. La opción --hard
cambia todos los archivos en su árbol de trabajo para que coincidan con los archivos en origin/branch_name
.
Todas las sugerencias anteriores son correctas, pero a menudo para restablecer realmente su proyecto, también necesita eliminar incluso los archivos que se encuentran en su .gitignore
.
Para obtener el equivalente moral de borrar el directorio de su proyecto y volver a clonar desde el control remoto es:
git fetch
git reset --hard
git clean -x -d -f
Advertencia : git clean -x -d -f
es irreversible y puede perder archivos y datos (por ejemplo, cosas que ha ignorado utilizando .gitignore
).
Yo si:
git branch -D master
git checkout master
para restablecer totalmente la rama
nota, debes pagar en otra rama para poder eliminar la rama requerida
git reset --hard HEAD
realidad solo se restablece al último estado confirmado. En este caso HEAD se refiere a la HEAD de tu sucursal.
Si tienes varias confirmaciones, esto no funcionará ...
Lo que probablemente desee hacer es restablecer el encabezado de origen o como se llame a su repositorio remoto. Probablemente solo haria algo como
git reset --hard origin/HEAD
Pero ten cuidado. Los reinicios duros no se pueden deshacer fácilmente. Es mejor hacer lo que Dan sugiere, y ramificar una copia de sus cambios antes de restablecer.
La pregunta mezcla dos cuestiones aquí:
- cómo restablecer una rama local al punto donde se encuentra el control remoto
- cómo despejar su área de preparación (y posiblemente el directorio de trabajo), de modo que el
git status
nothing to commit, working directory clean.
diganothing to commit, working directory clean.
La respuesta de una sola parada es:
-
git fetch --prune
(opcional) Actualiza la instantánea local del repositorio remoto. Otros comandos son solo locales.
git reset --hard @{upstream}
Coloca el puntero de la rama local en el lugar donde se encuentra la instantánea del control remoto, y establece el índice y el directorio de trabajo en los archivos de esa confirmación. -
git clean -d --force
Elimina archivos y directorios sin seguimiento que dificultan que git diga "directorio de trabajo limpio".