2010-11-24 51 views
32

Je dois admettre que je n'ai pas joué avec des fonctionnalités avancées gits mais sur mon projet actuel que je devais.Rendez le point HEAD maître git à la tête actuelle de la branche

La situation: Quelqu'un a essayé de mettre en œuvre certaines fonctionnalités et les comitted au maître, maintenant je suis appelé à faire ce que cette autre personne a essayé de le faire (mais a échoué), par conséquent, la première chose que je ne faisais

git checkout -b clean_start HASH 

Hash est un hachage SHA1 correct d'environ 20 validations avant le maître actuel et qui a fonctionné. J'ai maintenant apporté quelques modifications à cette branche et je suis maintenant à un point où je voudrais changer la branche maîtresse courante du dépôt à distance (qui a les changements faits par l'autre personne) à ma branche locale. En d'autres termes, je voudrais déplacer la tête du maître 20 en arrière, puis fusionner ma nouvelle branche propre à l'intérieur.

Est-ce exactement ce que je dois faire? Avec revenir HEAD ~ 20 etc. ou y at-il une commande qui fait exactement un tel mouvement de tête?

Répondre

28

Vous pouvez faire cela, si le dépôt distant accepte forcé pousse:

git push --force origin clean_start:master 

Notez que si quelqu'un d'autre a le dépôt cloné, une poussée d'eux pourrait annuler cette. Si vous souhaitez fusionner la branche master locale et la branche principale à distance, mais gardez l'arborescence de fichiers de votre branche (jeter l'arborescence de fichiers du maître d'origine), vous pouvez le faire comme ceci:

git merge -s ours --no-commit origin/master 
git commit # Separate step so that you can use your own commit message. 
git checkout master 
git merge clean_start # Fast-forward 
git push origin master 

Cela va créer une fusion avec les deux branches (votre maître et le maître d'origine) en tant que parent, mais l'arbre sera identique à votre branche actuelle. En d'autres termes, il va créer une fusion symbolique où aucune fusion de code réelle s'est produite.

Si cela ne vous dérange pas que d'autres personnes travaillant dans le repo soient interrompues, vous pouvez utiliser la première approche. Mais si vous travaillez avec d'autres personnes qui ont déjà ces commits, la deuxième approche sera plus infaillible et gardera l'histoire.

+0

avez-vous modifier votre message pour inclure "clean_start: maître"? –

+0

Oui, j'ai oublié qu'il se développait à partir d'une seconde branche, pas de maître. J'ai mis à jour mon autre liste de commandes pour compenser cet oubli. – cdhowie

24
  1. Vous pouvez spécifiquement indiquer maître à l'endroit où vous voulez qu'il soit avec:

    git update-ref refs/heads/master clean_start 
    

    (si vous suivez les nouveaux changements dans clean_start et que vous voulez maître pour pointer là-bas)

    Prenez garde que tout ce que montrait le maître (environ 20 commits) sera "perdu".

    Vous devrez forcer la poussée du maître à cause de cela:

    git push origin master -f 
    
  2. Si vous voulez laisser votre maître local où il est au lieu et pousser la place de clean_start au maître à distance, faire ceci:

    git poussée origine clean_start: maître -f

    espérons que cette aide.

    PS. Lancez d'abord gitk --all & afin de voir ce qui se passe visuellement pendant que vous faites cela.

16

La commande git reset existe pour modifier les points HEAD.

Dans votre cas, vous pouvez le faire:

git checkout master    # switch to the master branch 
git reset --hard clean_start  # point HEAD to the clean_start branch 
git push -f origin master:master # force push the new HEAD to server 
+0

Cela a fonctionné pour moi, merci. –

+0

Ceci est une commande simple et fonctionne comme un charme. – lastboy

+0

A travaillé, merci :) –