web-dev-qa-db-fra.com

Faire git master HEAD pointer vers le courant HEAD de la branche

Je dois admettre que je n'ai pas joué avec les fonctionnalités avancées de gits mais sur mon projet actuel, je devais le faire.

La situation: quelqu'un a essayé d'implémenter certaines fonctionnalités et les a envoyées au maître, maintenant j'ai été appelé à faire ce que cette autre personne a essayé de faire (mais a échoué), donc la première chose que j'ai faite a été

git checkout -b clean_start HASH

Le hachage est un hachage SHA1 correct d'environ 20 validations avant le maître actuel et cela a fonctionné. J'ai maintenant apporté quelques modifications à cette branche et j'en suis maintenant au point où je voudrais changer la branche principale actuelle du référentiel distant (qui a les modifications apportées par l'autre personne) en ma branche locale.

En d'autres termes, je voudrais déplacer la tête du master 20 commits en arrière, puis y fusionner ma nouvelle branche propre.

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

32
Maxem

Vous pouvez le faire si le référentiel distant accepte les push forcés:

git Push --force Origin clean_start:master

Notez que si quelqu'un d'autre a le référentiel cloné, n Push de leur part pourrait potentiellement annuler cela. Si vous souhaitez fusionner votre branche principale locale et la branche principale distante, mais conserver l'arborescence des fichiers de votre branche (en supprimant l'arborescence des fichiers 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 créera une validation de fusion avec les deux branches (votre maître et le maître d'origine) comme parent, mais l'arborescence sera identique à votre pointe de branche actuelle. En d'autres termes, cela créera une fusion symbolique où aucune fusion de code réelle ne s'est produite.

Si cela ne vous dérange pas que d'autres personnes travaillant dans le référentiel 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.

29
cdhowie
  1. Vous pouvez spécifiquement pointer master vers où vous voulez qu'il soit avec:

    git update-ref refs/heads/master clean_start
    

    (si vous suivez les nouvelles modifications dans clean_start et que le maître pointe là)

    Sachez que tout ce que le maître pointait (environ 20 commits valent) sera "perdu".

    Vous devrez forcer le Push of master pour cette raison:

    git Push Origin master -f
    
  2. Si vous souhaitez laisser votre maître local où il se trouve à la place et pousser la place de clean_start vers le maître distant, faites simplement ceci:

    git Push Origin clean_start: master -f

    j'espère que cela t'aides.

    PS. Courir gitk --all & d'abord pour que vous puissiez voir visuellement ce qui se passe.

26
Adam Dymitruk

La commande git reset existe pour changer ce que HEAD pointe vers.

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
17
jtdubs