Je viens d'écraser certains commits git rebase
et j'ai fait un git push --force
(ce qui est diabolique, je sais).
Maintenant, les autres ingénieurs logiciels ont une histoire différente et quand ils le font git pull
, Git fusionnera. Y a-t-il un moyen de résoudre ce problème, sauf en faisant un rm my-repo; git clone [email protected]:my-repo.git
?
J'ai besoin de quelque chose comme le contraire de git push --force
, mais je git pull --force
n'ai pas donné les résultats escomptés.
git checkout master && git branch -D test && git checkout -b test origin/test
Réponses:
Pour recevoir les nouveaux commits
Réinitialiser
Vous pouvez réinitialiser la validation d'une branche locale à l'aide de
git reset
.Pour modifier la validation d'une branche locale:
Attention cependant, comme le dit la documentation:
Si vous souhaitez conserver les modifications que vous avez localement, effectuez une
--soft
réinitialisation à la place. Ce qui mettra à jour l'historique de validation de la branche, mais ne changera aucun fichier dans le répertoire de travail (et vous pourrez ensuite les valider).Rebase
Vous pouvez rejouer vos validations locales au-dessus de toute autre validation / branche en utilisant
git rebase
:Cela invoquera le rebase en mode interactif où vous pourrez choisir comment appliquer chaque commit individuel qui ne fait pas partie de l'historique sur lequel vous rebasez.
Si les validations que vous avez supprimées (avec
git push -f
) ont déjà été extraites dans l'historique local, elles seront répertoriées en tant que validations qui seront réappliquées - elles devront être supprimées dans le cadre du rebase ou elles seront simplement réintégrées dans l'historique. pour la branche - et réapparaître dans l'historique à distance lors de la prochaine poussée.Utilisez l'aide
git command --help
pour plus de détails et d'exemples sur l'une des commandes ci-dessus (ou autres).la source
git reset origin/otherbranch --hard
reset --hard
, ou Option 2:reset --soft
+rebase
, non?git reset --soft origin/master
modifiera l'historique des validations pour faire correspondre les différences entre la télécommande et la scène à la télécommande qui sera ensuite validée . Il ne serait pas nécessaire de rebaser dans ce scénario (et vous seriez empêché de le faire en raison des modifications non validées) car il n'y a aucune différence dans l'historique des validations. Les deux options sont réinitialisées ou rebasées - pas une combinaison des deux. Veuillez poser une question si votre scénario est différent de celui auquel j'ai répondu ici.Cela ne résoudra pas les branches qui contiennent déjà le code que vous ne voulez pas (voir ci-dessous pour savoir comment le faire), mais si elles avaient tiré une branche et veulent maintenant qu'elle soit propre (et non "en avance" de origine / une branche), il vous suffit de:
Remarque: vous pouvez les combiner en mettant && entre eux
Note2: Florian l'a mentionné dans un commentaire, mais qui lit les commentaires lors de la recherche de réponses?
Remarque 3: Si vous avez des branches contaminées, vous pouvez en créer de nouvelles à partir de la nouvelle "branche muette" et simplement sélectionner les cerises.
Ex:
Maintenant, la nouvelle fonctionnalité est votre branche sans les commits supplémentaires (éventuellement mauvais)!
la source
git checkout -b base-branch origin/base-branch
avecgit checkout --track origin/base-branch
Tirez avec rebase
Un pull régulier est fetch + merge, mais ce que vous voulez c'est fetch + rebase. Ceci est une option avec la
pull
commande:la source