web-dev-qa-db-fra.com

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

J'ai deux branches:

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

Récemment, j'ai sérieusement bousillé ma branche locale.

Comment pourrais-je remplacer entièrement la branche locale par la branche distante afin de pouvoir continuer mon travail là où se trouve la branche distante?

J'ai déjà effectué une recherche dans SO et l'extraction locale de la branche distante n'a aucun effet.

671
YemSalat
  1. Assurez-vous que vous avez vérifié la branche que vous remplacez (d'après Zoltán commentaire ).
  2. En supposant que ce maître est la branche locale que vous remplacez et que "Origine/maître" est la branche distante que vous souhaitez réinitialiser:

    git reset --hard Origin/master
    

Ceci met à jour votre branche locale HEAD pour qu'elle corresponde à la même révision que Origin/master, et --hard synchronisera également cette modification dans l'index et l'espace de travail.

1109
araqnid

C'est aussi simple que trois étapes:

  1. Supprimer votre branche 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 vous basant sur celle distante: git checkout -b local_branch Origin/remote_branch
194
adamsmith
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
38
Sailesh

Remplacez tout par la branche distante. mais , uniquement à partir du même commit, votre branche locale est sur:

git reset --hard Origin/some-branch

OU, récupérez le dernier depuis la branche distante et remplacez tout:

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

Par ailleurs, si nécessaire, vous pouvez supprimer les fichiers et répertoires non suivis que vous n'avez pas encore validés:

git clean -fd
13
bit-less

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 modifications que vous n'avez pas effectuées. La ligne branch déplace votre branche vers un autre nom, libérant ainsi le nom d'origine. La ligne fetch récupère la dernière copie de la télécommande. La ligne checkout recrée la branche d'origine en tant que branche de suivi.

Ou comme une 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.

7
Joshua S

Le réponse sélectionnée est tout à fait correct, cependant il ne m'a pas laissé le dernier commit/push ...

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 configurer temporairement ma branche en amont pendant quelques semaines sur une branche spécifique (identique à celle sur laquelle j'ai basculé/extrait plus tôt et effectué une réinitialisation matérielle)

Donc APRES réinitialisation

git branch --set-upstream-to=Origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 
2
Tom Stickel

Vous pouvez faire comme @Hugo de @Laurent, 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, ce qui vous permet de manipuler les N derniers commits) pour ce type d'opérations.

2
ksol

Cela peut être fait de plusieurs manières, en continuant à modifier cette réponse pour diffuser une meilleure perspective de connaissance.

1) Réinitialiser dur

Si vous travaillez depuis une branche de développement distante, vous pouvez réinitialiser HEAD au dernier commit sur la branche distante, comme indiqué ci-dessous:

git reset --hard Origin/develop

2) Supprimez la branche actuelle et extrayez-vous à nouveau du référentiel distant

Considérant que vous travaillez sur la branche de développement dans le référentiel local, qui se synchronise avec la branche à distance/de développement, vous pouvez procéder comme suit:

git branch -D develop
git checkout -b develop Origin/develop

) Abort Merge

Si vous êtes entre deux mauvaises fusions (faites par erreur avec une mauvaise branche), et que vous voulez éviter la fusion, revenez à la dernière branche comme ci-dessous:

git merge --abort

4) Abort Rebase

Si vous êtes entre deux bases rebase, vous pouvez abandonner la demande de rebase comme suit:

git rebase --abort
1
Anamika

Si vous souhaitez mettre à jour une branche qui n’est pas extraite actuellement, vous pouvez le faire.

git fetch -f Origin rbranch:lbranch
1
kqr

Comme indiqué dans l'explication choisie, git reset est bon. Mais de nos jours, nous utilisons souvent des sous-modules: des référentiels dans des référentiels. Par exemple, si vous utilisez ZF3 et jQuery dans votre projet, vous souhaiterez probablement qu'ils soient clonés à partir de leurs référentiels d'origine. Dans ce cas git reset n'est pas suffisant. Nous devons mettre à jour les sous-modules avec la version exacte définie dans notre référentiel:

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

git submodule foreach git submodule update

git status

c'est la même chose que vous arriverez (cd) récursivement dans le répertoire de travail de chaque sous-module et vous lancerez:

git submodule update

Et c'est très différent de

git checkout master
git pull

parce que les sous-modules ne pointent pas vers une branche mais vers la validation.

Dans ce cas, lorsque vous extrayez manuellement une branche d’un ou plusieurs sous-modules, vous pouvez l’exécuter.

git submodule foreach git pull
0
Eugene Kaurov
git reset --hard
git clean -fd

Cela a fonctionné pour moi - propre a montré tous les fichiers supprimés aussi. S'il vous dit que vous allez perdre des modifications, vous devez le cacher.

0
Travis Heeter