J'ai deux branches:
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.
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.
C'est aussi simple que trois étapes:
git branch -d local_branch
git fetch Origin remote_branch
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>
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
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.
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
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.
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
Si vous souhaitez mettre à jour une branche qui n’est pas extraite actuellement, vous pouvez le faire.
git fetch -f Origin rbranch:lbranch
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
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.