Comment remplacer une branche locale par une branche distante entièrement en Git?

j'ai deux branches:

  1. branche locale (celle où je travaille). "la 151940920"
  2. branche distante (public, seul le bien-testé commet y aller)

récemment j'ai sérieusement foiré ma branche locale (devinez chaque git-internaute novice a été chez moi à un moment donné)

comment remplacer entièrement la branche locale par la distante, pour que je puisse continuer mon travail d'où la distante direction générale est maintenant?

(j'ai déjà effectué une recherche et la vérification sur la branche distante localement n'a aucun effet)

548
git
demandé sur Flip 2012-02-09 15:59:28

10 réponses

  1. assurez-vous que vous avez 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
    

ceci met à jour votre branche principale locale pour être la même révision que origin/master, et --hard synchronisera ce changement en de l'index et de l'espace de travail.

896
répondu araqnid 2018-01-29 00:35:47

C'est aussi simple que trois étapes:

  1. supprimer votre succursale locale: git branch -d local_branch
  2. récupération de la dernière branche à distance: git fetch origin remote_branch
  3. Reconstruire la branche locale basée sur la distance: git checkout -b local_branch origin/remote_branch
171
répondu adamsmith 2013-01-07 07:35:56
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
31
répondu Sailesh 2017-08-14 16:57:47

remplacer tout par la branche distante; mais , seulement à partir de la même commit votre branche locale est sur:

git reset --hard origin/some-branch

OU , obtenir le plus tard à partir de la télécommande de la branche et de tout remplacer:

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

de côté, si nécessaire, vous pouvez effacer les fichiers et répertoires Non tracés que vous n'avez pas encore engagés:

git clean -fd
7
répondu bit-less 2017-06-20 16:32:38

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

la ligne stash enregistre les changements que vous n'avez pas commis. La ligne branch déplace votre succursale à un nom différent, libérant le nom original. La ligne fetch récupère la dernière copie de la télécommande. La ligne checkout recrée la branche originale comme une branche de suivi.

ou comme fonction 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}
}

qui renomme la branche courante comme replaced_master_98d258f.

5
répondu Joshua S 2017-12-12 16:03:21

Vous pouvez faire comme @Hugo de @Laurent dit, ou vous pouvez utiliser git rebase pour supprimer les commits que vous voulez vous débarrasser, si vous voyez de qui. J'ai tendance à utiliser git rebase -i head~N (où N est un nombre, vous permettant de manipuler le dernier n commet) pour ce genre d'opérations.

2
répondu ksol 2012-02-09 12:09:50

la réponse choisie est absolument correcte , mais elle ne m'a pas laissé avec le dernier commit/pushes ...

Donc pour moi:

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

puisque je sais que je veux régler Temporairement ma branche amont pour quelques semaines sur une branche spécifique (comme celle que j'ai activée / cochée plus tôt et que j'ai fait une réinitialisation dure)

So après réinitialisation

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 
2
répondu Tom Stickel 2016-10-20 04:30:36

Si vous voulez mettre à jour la branche qui n'est pas cochée, vous pouvez le faire

git fetch -f origin rbranch:lbranch
0
répondu kqr 2017-03-14 08:27:22

comme fourni dans l'explication choisie, git reset est bon. Mais de nos jours, nous utilisons souvent des sous-modules: des dépôts à l'intérieur de dépôts. 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 originaux. Dans ce cas git reset n'est pas suffisant. Nous avons besoin de mettre à jour les sous-modules à la 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 sera exécuté:

git submodule update

et c'est très différent de

git checkout master
git pull

parce que les sous-modules pointent non pas vers la branche mais vers la propagation.

dans les cas où vous vérifiez manuellement une branche pour 1 ou plusieurs sous-modules vous pouvez lancer

git submodule foreach git pull
0
répondu Eugene Kaurov 2017-09-07 10:07:55

le moche mais plus simple: supprimez votre dossier local, et clonez à nouveau le dépôt distant.

-8
répondu Hugo 2012-02-09 12:07:18