88 votes

Comment réinitialiser une branche vers une autre branche avec git ?

Disons que nous avons un hotfixes qui a été créée à partir de master . nous avons ajouté des commits à hotfixes mais ces commits n'étaient pas utiles, donc maintenant nous voulons commencer à partir d'une nouvelle copie de master encore.

pour mieux préciser, il s'agit du flux de travail de référence : http://nvie.com/posts/a-successful-git-branching-model/

disons aussi que nous avons poussé hotfixes au origin à distance parce que nous avons une mise en place terrible et que c'est la seule façon de tester quelque chose, donc nous devons réinitialiser la branche également sur le serveur distant.

comment réinitialiser hotfixes à une copie de master ?

144voto

danza Points 657

Voici comment j'ai procédé avec des commandes Git de base :

git checkout hotfixes
git reset --hard master
git push --force origin hotfixes

bien sûr, il est important d'informer tous ceux qui travaillent sur hotfixes . il est fort probable qu'ils devront supprimer leur copie locale et repartir de zéro. une autre idée, moins envahissante, consiste à créer une nouvelle branche :

git checkout master
git branch -tb hotfixes-2 # this creates branch `hotfixes-2` from a copy of `master`
git push origin HEAD # this creates `hotfixes-2` on the remote server

47voto

Michael Wild Points 6612

Vous voulez dire que vous voulez pousser votre local master à la télécommande hotfixes branche ? Comme ceci :

git push origin +master:hotfixes

Toutefois, cela suppose que vous soyez autorisé à réécrire l'historique du côté distant.

11voto

Tuxdude Points 8652

Si j'ai bien compris votre question, ce que vous cherchez est un moyen de déplacer le pointeur de branche de origin/hotfixes pour pointer vers la révision actuelle de origin/master .

Si c'est le cas, cet ensemble de commandes devrait fonctionner (en supposant que vous avez déjà vérifié hotfixes dans votre dépôt git local à tout moment dans le passé) :

# git branch -f does not allow modifying the currently checked out
# branch, so checkout any other branch than hotfixes
git checkout <SOME_OTHER_BRANCH_THAN_HOTFIXES>

# Move the branch pointer of hotfixes to the commit currently
# pointed by origin/master
git branch -f hotfixes origin/master

# Force push the history rewrite in the hotfixes branch
# into origin
git push -f origin hotfixes

4voto

Aaron Wortham Points 123

Les réponses ici sont solides. J'ai eu besoin de ce changement exact lors de la réinitialisation de ma branche d'essai en master. Dans ce cas, je veux à la fois réinitialiser l'origine pour qu'elle corresponde à master et aussi réinitialiser ma branche locale pour qu'elle corresponde à master. Voici donc un alias git qui vous permet de passer le nom de la branche et de faire les deux commandes en un seul mouvement. (C'est un peu dangereux)

reorient = "!f() { git push origin +master:$1 && git reset --hard origin/$1 ; }; f"

Alors utilise-le comme ça :

git reorient hotfixes

Les réponses ci-dessus étaient tout à fait correctes. Mais cela permet simplement de réduire le nombre de frappes au clavier et d'accélérer le processus ! J'espère que cela vous aidera.

1voto

Robert Molina Points 177

En me basant sur quelques réponses dans ce fil de discussion, j'ai fait le script suivant avec quelques invites pour réduire le risque de foirer des trucs :

#!/bin/bash
# Questions for loop:
for value in {1..3}
do
  # Asking if user wants to reset hotfix:
  if [ "$value" == "1" ] ;then
    echo -n "Are you sure you want to hard reset the hotfix branch (y/n)? "
    read answer
    if [ "$answer" == "${answer#[Yy]}" ] ;then
        echo 'Okay, maybe next time.'
        exit
    fi
  fi
  # Asking if user is in void:
  if [ "$value" == "2" ] ;then
    echo -n "Are you in the void branch (y/n)? "
    read answer
    if [ "$answer" == "${answer#[Yy]}" ] ;then
        echo 'You should checkout to the void branch.'
        exit
    fi
  fi
  # Asking if user has any uncommited changes:
  if [ "$value" == "3" ] ;then
    echo -n "Do you have any uncommited changes (y/n)? "
    read answer
    if [ "$answer" == "${answer#[Nn]}" ] ;then
        echo 'You should commit your changes to avoid losing them.'
        exit
    fi
  fi
done

echo 'Resetting...'
git checkout void
git branch -f hotfix origin/master
git push -f origin hotfix

100% ouvert à tout retour pour améliorer ce script.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X