417 votes

git pull après mise à jour forcée

J’ai juste écrasé quelques validations avec et a fait une (qui est mal, je sais).

Maintenant les autres codeurs ont une histoire différente et quand ils font un , git va fusionner. Est-il possible de corriger cela, sauf faire une ?

J’ai besoin de quelque chose comme le contraire de , mais n’a pas donné les résultats escomptés.

627voto

AD7six Points 22679

Pour recevoir les nouveaux commits

git fetch

Réinitialiser

Vous pouvez réinitialiser l'engager pour une des branches locales à l'aide de git reset

Pour changer de la validation d'une branche locale

git reset origin/master --hard

Soyez prudent, car les docs:

Réinitialise l'index et de l'arbre de travail. Toute modification des dossiers dans l'arbre de travail depuis sont rejetés.

Si vous souhaitez conserver les changements que vous avez localement - faire un --softde réinitialisation de la place. qui sera mise à jour de la validation de l'histoire, pour la direction, mais pas de modifier les fichiers dans le répertoire de travail (et vous pouvez ensuite les valider).

Rebase

Vous pouvez relire votre local s'engage ontop de toute autre commit/branche à l'aide de git rebase

git rebase -i origin/master

cela va appeler rebase en mode interactif où vous pouvez choisir la manière de les appliquer à chaque individu de commettre ce n'est pas dans l'histoire que vous êtes la relocalisation sur le dessus de.

Si les changements que vous avez supprimés ( git push -f) ont déjà été tiré dans l'histoire locale, ils seront indiqués comme s'engage à ce que va être réappliqué - ils doivent être supprimés dans le cadre de la rebase ou ils vont tout simplement être de nouveau inclus dans l'histoire de la branche - et réapparaît dans l'histoire à distance sur la prochaine poussée.

Utilisez l'aide git command --help pour plus de détails et des exemples sur l'un des ci-dessus (ou d'autres) des commandes.

19voto

TMP Points 1665

Ce ne sera pas corrigé les branches qui ont déjà le code que vous ne voulez pas en eux (voir ci-dessous pour savoir comment faire), mais si ils avaient tiré quelques-branche et que vous voulez qu'elle soit propre (et non pas "en avance" d'origine/quelques-branche), alors il vous suffit de:

git checkout some-branch   # where some-branch can be replaced by any other branch
git branch base-branch -D  # where base-branch is the one with the squashed commits
git checkout -b base-branch origin/base-branch  # recreating branch with correct commits

Remarque: Vous pouvez combiner ces tout en mettant && entre eux

Note2: Florian mentionné dans un commentaire, mais qui lit les commentaires lors de la recherche de réponses?

Nota 3: Si vous avez contaminé branches, vous pouvez en créer de nouveaux en fonction de la nouvelle "bête de la branche" et juste cherry-pick engage plus.

Ex:

git checkout feature-old  # some branch with the extra commits
git log                   # gives commits (write down the id of the ones you want)
git checkout base-branch  # after you have already cleaned your local copy of it as above
git checkout -b feature-new # make a new branch for your feature
git cherry-pick asdfasd   # where asdfasd is one of the commit ids you want
# repeat previous step for each commit id
git branch feature-old -D # delete the old branch

Maintenant fonctionnalités nouvelles est votre branche sans supplémentaire (éventuellement bad) s'engage!

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