tag - presentación git
¿Cómo reemplazar una sucursal local por una sucursal remota completamente en Git? (10)
Tengo dos ramas:
- sucursal local (con la que trabajo)
- sucursal remota (pública, solo las confirmaciones bien probadas van allí)
Hace poco estropeé mi sucursal local (supongo que cada git-novato ha estado en mi lugar en algún momento)
¿Cómo reemplazaría la sucursal local por completo con la remota, para poder continuar mi trabajo desde donde se encuentra la sucursal remota ahora?
(Ya busqué en SO y verifiqué localmente la sucursal remota no tiene ningún efecto)
- Asegúrese de haber revisado la sucursal que está reemplazando (del comment de Zoltán).
Suponiendo que el maestro es la rama local que está reemplazando, y que "origen / maestro" es la rama remota a la que desea restablecer:
git reset --hard origin/master
Esto actualiza su rama HEAD local para que sea la misma revisión que origin / master, y --hard
sincronizará este cambio también en el índice y el área de trabajo.
Como se proporciona en la explicación elegida, git reset es bueno. Pero hoy en día a menudo usamos submódulos: repositorios dentro de repositorios. Por ejemplo, si usa ZF3 y jQuery en su proyecto, probablemente querrá que se clonen desde sus repositorios originales. En tal caso, git reset no es suficiente. Necesitamos actualizar los submódulos a esa versión exacta que se definen en nuestro repositorio:
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule foreach git submodule update
git status
es lo mismo que vendrá (cd) recursivamente al directorio de trabajo de cada submódulo y ejecutará:
git submodule update
Y es muy diferente de
git checkout master
git pull
porque los submódulos no apuntan a la rama sino a la confirmación.
En esos casos, cuando verifica manualmente alguna rama para 1 o más submódulos puede ejecutar
git submodule foreach git pull
Eso es tan fácil como tres pasos:
- Elimina tu sucursal local:
git branch -d local_branch
- Obtenga la última rama remota:
git fetch origin remote_branch
- Reconstruye la rama local basada en la remota:
git checkout -b local_branch origin/remote_branch
La respuesta seleccionada es absolutamente correcta , sin embargo, no me dejó con las últimas confirmaciones / empujes ...
Así que para mí:
git reset --hard dev/jobmanager-tools
git pull ( did not work as git was not sure what branch i wanted)
Ya que sé que quiero configurar temporalmente mi rama en sentido ascendente durante unas semanas para una rama específica (igual que la que cambié / verifiqué antes e hice un reinicio completo)
Así que después de reiniciar
git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status ( says--> on branch dev/jobmanager-tools
La forma más fea pero más sencilla: elimine su carpeta local y vuelva a clonar el repositorio remoto.
La forma más segura y completa de reemplazar la sucursal local actual con el control remoto:
git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch
La línea de stash
oculta los cambios que no ha confirmado. La línea de branch
mueve su sucursal a un nombre diferente, liberando el nombre original. La línea de recuperación recupera la última copia del control remoto. La línea de checkout
recrea la rama original como una rama de seguimiento.
O como una función de bash:
replaceWithRemote() {
yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
git stash
git merge --abort
git rebase --abort
git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
git fetch origin ${yourBranch}:${yourBranch}
git checkout ${yourBranch}
}
que cambia el nombre de la rama actual a reemplazado con algo_master_98d258f.
Puede hacer lo que dice @Hugo de @Laurent, o puede usar git rebase
para eliminar los compromisos de los que desea deshacerse, si sabe cuáles. git rebase -i head~N
a usar git rebase -i head~N
(donde N es un número, lo que te permite manipular los últimos N confirmados) para este tipo de operaciones.
Reemplace todo con la rama remota; pero , solo desde el mismo compromiso, su sucursal local está en:
git reset --hard origin/some-branch
O BIEN , obtenga lo último de la sucursal remota y reemplace todo:
git fetch origin some-branch
git reset --hard FETCH_HEAD
Además, si es necesario, puede eliminar los archivos y directorios sin seguimiento que aún no ha confirmado:
git clean -fd
Si desea actualizar la rama que no está actualmente activada, puede hacerlo
git fetch -f origin rbranch:lbranch
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>