J'ai deux branches:
- branche locale (celle avec laquelle je travaille)
- branche distante (publique, seuls les commits bien testés y vont)
Récemment, j'ai sérieusement gâché ma succursale locale.
Comment pourrais-je remplacer entièrement la branche locale par la branche distante, afin de pouvoir continuer mon travail à partir de l'emplacement actuel de la branche distante?
J'ai déjà recherché SO et la vérification de la succursale distante localement n'a aucun effet.
Réponses:
En supposant que le maître est la branche locale que vous remplacez et que "origine / maître" est la branche distante que vous souhaitez réinitialiser:
Cela met à jour votre branche HEAD locale pour qu'elle soit la même révision que origin / master et
--hard
synchronise également cette modification dans l'index et l'espace de travail.la source
git reset
par défaut, vous rejoindrez votre branche actuelle et synchroniserez l'index.--soft
sautera la mise à jour de l'index,--hard
synchronisera également l'espace de travail. Ma propre expérience utilise la--hard
plupart du temps, sauf quand je veux annuler le dernier commit (qui est justegit reset HEAD^
)git fetch origin remote_branch
master
, alors assurez-vous d'avoir vérifié la branche que vous remplacez en premier.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
la source
git branch -D local_branch
dans la première étape si votre branche n'est pas fusionnée.la source
git help branch
dit--track
.When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out.
J'ai corrigé cette commande dans la réponse. Merci d'avoir soulevé ce point.git status
, il signalera si votre succursale locale est devant ou derrière la succursale distante si vous les avez associés. De plus, vous pouvez fairegit pull
(oupush
) au lieu de pleingit pull <remote> <branch>
si vous avez déjà configuré votre branche pour suivre<remote/branch>
.Remplacez tout par la branche distante; mais , à partir du même commit, votre branche locale est activée:
OU , obtenez les dernières nouvelles de la succursale distante et remplacez tout:
En passant, si nécessaire, vous pouvez effacer les fichiers et répertoires non suivis que vous n'avez pas encore validés:
la source
git clean
commande l'a fait pour moi.git reset hard origin/master
n'effacez pas les fichiers non suivis. Merci!La façon la plus sûre et la plus complète de remplacer la branche locale actuelle par la télécommande:
La
stash
ligne enregistre les modifications que vous n'avez pas validées. Labranch
ligne déplace votre branche vers un nom différent, libérant ainsi le nom d'origine. Lafetch
ligne récupère la dernière copie de la télécommande. Lacheckout
ligne recrée la branche d'origine en tant que branche de suivi.Ou comme fonction bash:
qui renomme la branche actuelle en quelque chose comme replace_master_98d258f.
la source
git stash pop
dans ce flux de travail. Si vous souhaitez réappliquer vos fichiers cachés.Je suis un peu surpris que personne n'en ait encore parlé; Je l'utilise presque tous les jours:
Fondamentalement, il
@{u}
s'agit simplement d'un raccourci pour la branche en amont que votre branche actuelle suit. Par exemple, cela équivaut généralement àorigin/[my-current-branch-name]
. C'est bien parce que c'est indépendant de la branche.Assurez-vous d'
git fetch
abord d'obtenir la dernière copie de la branche distante.la source
Cela peut être fait de plusieurs façons, en continuant à modifier cette réponse pour diffuser une meilleure perspective de connaissances.
1) Réinitialiser dur
Si vous travaillez à partir de la branche de développement à distance, vous pouvez réinitialiser HEAD sur le dernier commit sur la branche à distance comme ci-dessous:
2) Supprimez la branche en cours et passez à nouveau à la caisse du référentiel distant
Considérant que vous travaillez sur le développement d'une branche dans le référentiel local, qui se synchronise avec la branche distante / développement, vous pouvez faire comme ci-dessous:
3) Annuler la fusion
Si vous êtes entre une mauvaise fusion (effectuée par erreur avec une mauvaise branche) et que vous souhaitez éviter la fusion pour revenir à la dernière branche comme ci-dessous:
4) Abandonner le rebase
Si vous êtes entre une mauvaise rebase, vous pouvez abandonner la demande de rebase comme ci-dessous:
la source
Vous pouvez faire comme @Hugo de @Laurent l'a dit, ou vous pouvez utiliser
git rebase
pour supprimer les commits que vous souhaitez supprimer, si vous savez lesquels. J'ai tendance à utilisergit rebase -i head~N
(où N est un nombre, vous permettant de manipuler les derniers N commits) pour ce type d'opérations.la source
La réponse choisie est absolument correcte , mais elle ne m'a pas laissé les derniers commit / pushs ...
Donc pour moi:
Étant donné que je sais que je souhaite temporairement définir ma branche en amont pour quelques semaines sur une branche spécifique (la même que celle vers laquelle j'ai basculé / vérifié plus tôt et effectué une réinitialisation matérielle)
Donc , après la réinitialisation
la source
Si vous souhaitez mettre à jour une branche qui n'est pas actuellement extraite, vous pouvez faire:
la source
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 souhaitez très probablement qu'ils soient clonés à partir de leurs référentiels d'origine. Dans ce cas, la réinitialisation de git ne suffit pas. Nous devons mettre à jour les sous-modules vers cette version exacte définie dans notre référentiel:
c'est la même chose que vous arriverez (cd) récursivement au répertoire de travail de chaque sous-module et exécuterez:
Et c'est très différent de
parce que les sous-modules pointent non pas sur une branche mais sur la validation.
Dans ce cas, lorsque vous extrayez manuellement une branche pour un ou plusieurs sous-modules, vous pouvez exécuter
la source
git reset --hard
. Cela ajoute peu de valeur.Cela a fonctionné pour moi - propre a également montré tous les fichiers supprimés. S'il vous indique que vous perdrez les modifications, vous devez vous cacher.
la source
La façon la plus simple mais laide: supprimez votre dossier local et clonez à nouveau le référentiel distant.
la source