Pregunta ¿Cómo reemplazar la sucursal local con la sucursal remota por completo en Git?


Tengo dos ramas:

  1. sucursal local (con la que trabajo)
  2. sucursal remota (pública, solo confirmaciones bien probadas van allí)

Recientemente, arruiné seriamente mi sucursal local (supongo que cada git-newbie ha estado en mi lugar en algún momento)

¿Cómo reemplazaría la rama local por completo con la remota, para poder continuar mi trabajo desde donde está ahora la rama remota?

(Ya busqué SO y el hecho de verificar localmente en la sucursal remota no tiene ningún efecto)


519
2018-02-09 11:59


origen


Respuestas:


  1. Asegúrate de haber comprobado la sucursal que estás reemplazando (de Zoltán's comentario)
  2. Suponiendo que el maestro es la rama local que está reemplazando, y que "origen / principal" 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 origen / maestro, y --hard sincronizará este cambio en el índice y el espacio de trabajo también.


855
2018-02-09 12:19



Eso es tan fácil como tres pasos:

  1. Eliminar su sucursal local: git branch -d local_branch 
  2. Obtener la última rama remota: git fetch origin remote_branch 
  3. Reconstruya la sucursal local basándose en la remota: git checkout -b local_branch origin/remote_branch 

165
2018-02-09 12:24



git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

30
2018-02-09 12:19



Reemplace todo con la rama remota; pero, solo desde el mismo compromiso en el que se encuentra su sucursal local:

git reset --hard origin/some-branch

O, consigue el último desde la sucursal remota y reemplazar todo:

git fetch origin some-branch
git reset --hard FETCH_HEAD

Como comentario adicional, si es necesario, puede eliminar los archivos y directorios no rastreados que aún no ha confirmado:

git clean -fd

7
2018-06-20 16:32



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

los stash línea guarda los cambios que no ha cometido. los branch línea mueve su rama a un nombre diferente, liberando el nombre original. los fetch línea recupera la última copia del control remoto. los checkout línea recrea la rama original como una rama de seguimiento.

O como una función 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 algo como replace_master_98d258f.


3
2018-03-20 14:39



Puedes hacer lo que @Hugo de @Laurent dijo, o puedes usar git rebase para eliminar las confirmaciones de las que desea deshacerse, si sabe cuáles. Tiendo a usar git rebase -i head~N (donde N es un número, lo que le permite manipular las últimas N confirmaciones) para este tipo de operaciones.


2
2018-02-09 12:09



los la respuesta seleccionada es absolutamente correcta, sin embargo, no me dejó con los últimos commit / push ...

Entonces para mí:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

Como sé que quiero establecer temporalmente mi rama ascendente durante unas pocas semanas en una sucursal específica (la misma que cambié / quité antes y realicé un restablecimiento completo)

Asi que Después del reinicio

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

2
2017-10-20 04:30



Si desea actualizar una rama que no está actualmente desprotegida, puede hacer

git fetch -f origin rbranch:lbranch

0
2018-03-14 08:27



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 utiliza ZF3 y jQuery en su proyecto, lo más probable es que desee que se clonen desde sus repositorios originales. En tal caso git resetno es suficiente. Necesitamos actualizar los submódulos a esa versión exacta que se define 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 se ejecutará:

git submodule update

Y es muy diferente de

git checkout master
git pull

porque los submódulos apuntan no a la bifurcación, sino a la confirmación.

En esos casos, cuando se realiza una extracción manual de alguna rama para 1 o más submódulos Tu puedes correr

git submodule foreach git pull

0
2017-08-18 12:55



La manera más fea pero más simple: elimine su carpeta local y vuelva a clonar el repositorio remoto.


-7
2018-02-09 12:07