Comment remplacer une branche locale par une branche distante entièrement en Git?
j'ai deux branches:
- branche locale (celle où je travaille). "la 151940920"
- 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)
10 réponses
- assurez-vous que vous avez vérifié la branche que vous remplacez (de Zoltán commentaire ).
-
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.
C'est aussi simple que trois étapes:
- supprimer votre succursale locale:
git branch -d local_branch
- récupération de la dernière branche à distance:
git fetch origin remote_branch
- Reconstruire la branche locale basée sur la distance:
git checkout -b local_branch origin/remote_branch
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
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
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.
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.
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
Si vous voulez mettre à jour la branche qui n'est pas cochée, vous pouvez le faire
git fetch -f origin rbranch:lbranch
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
le moche mais plus simple: supprimez votre dossier local, et clonez à nouveau le dépôt distant.