Sam & Max » history http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 Annuler les derniers commits avec Git 16 http://sametmax.com/inverser-les-derniers-commits-avec-git/ http://sametmax.com/inverser-les-derniers-commits-avec-git/#comments Sun, 29 Jun 2014 08:59:06 +0000 http://sametmax.com/?p=11208 (Amélioration de ce dont je parle ici)

Use case typique : on a merdé les derniers commits, et on veut oublier tout ce qu’on a fait et retourner à l’état d’il y a x commits précédents.

Par exemple, là je veux revenir à mon commit 85711ad... :

commit 093bab5aa9d41f580037d51421b7c5d0db73e2ce
Author: sam 
Date:   Sat Jun 28 09:37:55 2014 +0700

    Ok, c'est la merde internationale

commit 0b768f1c0e37a6141e6cd4c472eb3f369f4334d7
Author: sam 
Date:   Sat Jun 28 09:37:36 2014 +0700

    Je commence à merder

commit 85711ad1e8c54f3fd3048d405addef48921e90fd
Author: sam 
Date:   Sat Jun 28 09:37:20 2014 +0700

    J'adore ce commit

Il y a plein de manières de faire, et on voit sur la toile beaucoup de solutions à base de checkout et de reset. La plupart sont dangereuses ou ont un résultat inattendu, présuppose un état de votre repo ou va vous mettre dans une situation que vous ne maîtrisez pas.

Devinez quoi ? Il y a plus simple, et plus propre.

Etape 1: avoir une copie de travail propre

Avant d’inverser des commits, assurez vous que votre copie de travail est nette. Pas de fichiers modifiés en attente d’être commités. Le moins de fichiers non trackés par git possible (idéalement zéro, soit c’est commité, soit c’est dans le .gitignore).

Si vous avez des fichiers modifiés, vous pouvez soit les mettre de côté temporairement avec git stash, soit annuler toutes les modifications avec git reset --hard HEAD. Attention, cette dernière commande n’est pas réversible et va mettre à plat votre copie de travail pour qu’elle soit l’exacte copie du dernier commit de votre histo.

Etape 2

???

Etape 3: profit !

git revert --no-commit 85711ad1..HEAD

Ceci va modifier la copie de travail (donc les fichiers que vous avez sur le disque dur en direct, pas l’histo git) en appliquant des patchs qui contiennent les différences entre HEAD et le commit avec ce hash.

En clair : vos fichiers vont être dans l’état dans lequel ils étaient à ce commit. En prime, l’index est mis à jour.

Vous pouvez alors faire les derniers ajustements que vous le souhaitez. Il faut ensuite finaliser la procédure par un commit avec un message significatif :

git commit -m "Abort ! Abort ! Inversion des 2 derniers commits, retour à 85711a"

Si vous aviez fait un stash, c’est le moment de faire un stash apply derrière.

Maintenant, si vous matez l’histo, vous verrez qu’on n’a pas effacé les commits précédents, on a juste fait un commit qui inverse tout ce qu’ils avaient fait :

commit 03e55de36ad29a26a461874988d4066ebf6fe6be
Author: sam 
Date:   Sat Jun 28 09:43:32 2014 +0700

    Abort ! Abort ! Inversion des 2 derniers commits, retour à 85711a

commit 093bab5aa9d41f580037d51421b7c5d0db73e2ce
Author: sam 
Date:   Sat Jun 28 09:37:55 2014 +0700

    Ok, c'est la merde internationale

commit 0b768f1c0e37a6141e6cd4c472eb3f369f4334d7
Author: sam 
Date:   Sat Jun 28 09:37:36 2014 +0700

    Je commence à merder

commit 85711ad1e8c54f3fd3048d405addef48921e90fd
Author: sam 
Date:   Sat Jun 28 09:37:20 2014 +0700

    J'adore ce commit

Ce qui évite bien des problèmes : pas de réécriture de l’histo, possibilité de récupérer du code dans les commits inversés plus tard, claire indication de ce qui s’est passé…

N’oubliez pas que souvent, revenir à un commit précédent est overkill. Il est généralement beaucoup plus simple de juste récupérer un ou deux fichiers dans l’état de l’époque avec :

git checkout [hash] -- chemin/vers/fichier
]]>
http://sametmax.com/inverser-les-derniers-commits-avec-git/feed/ 16
Quand Mechanize bouffe toute votre RAM et que vous ne savez pas pourquoi…. 1 http://sametmax.com/quand-mechanize-bouffe-toute-votre-ram-et-que-vous-ne-savez-pas-pourquoi/ http://sametmax.com/quand-mechanize-bouffe-toute-votre-ram-et-que-vous-ne-savez-pas-pourquoi/#comments Wed, 21 Mar 2012 17:36:52 +0000 http://sametmax.com/?p=282 En revenant de Bangla Road l’autre soir, je me connecte sur l’admin d’un de nos serveurs et je m’aperçois qu’un script de grabbing bouffait à lui tout seul plus de 30% de la mémoire. Après quelques recherches, Sam me fait part d’un article sur Mechanize et sa tendance à avoir un history plutôt vorace en RAM.

Le coupable était Mechanize avec le chandelier dans le salon :

En effet, Mechanize par défaut sauve tout l’historique de votre navigation, donc imaginez le carnage quand vous avez un script qui est censé scanner des milliers de pages internet…

Pour lui couper le sifflet on peut utiliser cette méthode :

 
import mechanize
from mechanize import History
 
class MaxHistory(History):
    """
        History implementation with a size limit.
    """
    def __init__(self, max_history=None):
        self._history = []  # LIFO
        self.max_history = max_history
 
    def add(self, request, response):
        self._history.append((request, response))
 
        if (self.max_history is not None and self._history
            and self.max_history <= len(self._history)):
            self._history.pop(0)
 
br = mechanize.Browser(history=MaxHistory(max_history=10))
Browser.open("http://sametmax.com/")

Et voilà !
Plus de problème de mémoire. Merci bibi.

]]>
http://sametmax.com/quand-mechanize-bouffe-toute-votre-ram-et-que-vous-ne-savez-pas-pourquoi/feed/ 1