Question Comment remplacer la branche locale avec la branche distante entièrement dans Git?


J'ai deux branches:

  1. branche locale (celle avec laquelle je travaille)
  2. branche distante (public, seuls les commits bien testés y vont)

Récemment, j'ai sérieusement foiré ma branche locale (je suppose que tous les git-newbie ont été à ma place à un moment donné)

Comment est-ce que je remplacerais entièrement la branche locale par la branche distante, afin que je puisse continuer mon travail d'où la branche à distance est maintenant?

(J'ai déjà cherché SO et vérifier sur la branche distante localement n'a aucun effet)


519
2018-02-09 11:59


origine


Réponses:


  1. Assurez-vous d'avoir vérifié la branche que vous remplacez (de Zoltán commentaire).
  2. En supposant que master est la branche locale que vous remplacez, et que "origin / master" est la branche distante que vous voulez réinitialiser:

    git reset --hard origin/master
    

Cela met à jour votre branche HEAD locale pour avoir la même révision que l’origine / le maître, et --hard synchronisera cette modification dans l'index et l'espace de travail.


855
2018-02-09 12:19



C'est aussi simple que trois étapes:

  1. Supprimer votre succursale locale: git branch -d local_branch 
  2. Récupère la dernière branche distante: git fetch origin remote_branch 
  3. Reconstruisez la branche locale en fonction de celle distante: 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



Remplacer tout avec la branche distante; mais, seulement à partir du même commit votre branche locale est sur:

git reset --hard origin/some-branch

OU, obtenir le dernier de la branche distante et remplacer tout:

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

En aparté, si nécessaire, vous pouvez effacer les fichiers et les répertoires non suivis que vous n'avez pas encore engagés:

git clean -fd

7
2018-06-20 16:32



Le moyen le plus sûr et le plus complet de remplacer la branche locale actuelle par la télécommande:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

le stash line enregistre les modifications que vous n'avez pas validées. le branch line déplace votre branche vers un nom différent, libérant ainsi le nom d'origine. le fetch line récupère la dernière copie de la télécommande. le checkout line recrée la branche d'origine en tant que branche de suivi.

Ou en tant que fonction 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}
}

qui renomme la branche actuelle en quelque chose comme replace_master_98d258f.


3
2018-03-20 14:39



Vous pouvez faire comme @Hugo de @Laurent dit, ou vous pouvez utiliser git rebase pour supprimer les commits que vous souhaitez supprimer, si vous savez lesquels. J'ai tendance à utiliser git rebase -i head~N (où N est un nombre, vous permettant de manipuler les N derniers commits) pour ce type d'opérations.


2
2018-02-09 12:09



le la réponse sélectionnée est absolument correcte, mais il ne m'a pas laissé avec le dernier commit / pousse ...

Donc pour moi:

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

Depuis que je sais que je veux temporairement placer ma branche en amont pendant quelques semaines à une branche spécifique (même que celui que j'ai passé à / extrait plus tôt et fait une réinitialisation matérielle sur)

Alors APRÈS la réinitialisation

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 vous voulez mettre à jour une branche qui n'est pas actuellement extraite, vous pouvez le faire

git fetch -f origin rbranch:lbranch

0
2018-03-14 08:27



Comme prévu dans l'explication choisie, git reset est bon. Mais de nos jours, nous utilisons souvent des sous-modules: des référentiels à l'intérieur de référentiels. Par exemple, si vous utilisez ZF3 et jQuery dans votre projet, vous voulez probablement qu'ils soient clonés à partir de leurs dépôts d'origine. Dans ce cas git resetn'est pas assez. Nous devons mettre à jour les sous-modules à cette version exacte qui sont définis dans notre dépôt:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

il est le même que vous viendrez (cd) récursivement dans le répertoire de travail de chaque sous-module et s'exécutera:

git submodule update

Et c'est très différent de

git checkout master
git pull

parce que les sous-modules pointent non pas sur la branche mais sur le commit.

Dans ce cas, lorsque vous vérifiez manuellement une branche pour 1 ou plusieurs sous-modules tu peux courir

git submodule foreach git pull

0
2017-08-18 12:55



La façon laide mais la plus simple: supprimer votre dossier local, et cloner le dépôt distant à nouveau.


-7
2018-02-09 12:07