web-dev-qa-db-fra.com

Changer le premier commit du projet avec Git?

Je veux changer quelque chose dans le premier commit de mon projet sans perdre tous les commit ultérieurs. Est-ce qu'il y a un moyen de faire ça?

J'ai accidentellement répertorié mon email brut dans un commentaire dans le code source, et j'aimerais le modifier au fur et à mesure que des bots indexant GitHub me font spammer.

460
Michael

Comme mentionné par ecdpalmaci-dessous , git 1.7.12 + (août 2012) a amélioré l'option _--root_ pour _git rebase_:

"_git rebase [-i] --root $tip_" peut maintenant être utilisé pour réécrire tout l'historique menant à "_$tip_" jusqu'à la validation racine.

Ce nouveau comportement était initialement discuté ici :

Personnellement, je pense que "_git rebase -i --root_" devrait être conçu pour fonctionner sans nécessiter "_--onto_" et vous permettre de "modifier" même le premier de l'historique.
Il est compréhensible que personne ne l’ennuie, car les gens récrivent beaucoup moins souvent au tout début de l’histoire qu’autre chose.

Le suivi du patch .


(réponse originale, février 2010)

Comme mentionné dans le Git FAQ (et ceci SO question ), l’idée est la suivante:

  1. Créer une nouvelle branche temporaire
  2. Rembobinez-le sur le commit que vous voulez modifier en utilisant _git reset --hard_
  3. Changer ce commit (ce serait le top de HEAD actuel, et vous pouvez modifier le contenu de n'importe quel fichier)
  4. Rebassez la branche au-dessus du commit modifié, en utilisant:

    _git rebase --onto <tmp branch> <commit after changed> <branch>`
    _

L'astuce consiste à vous assurer que les informations que vous souhaitez supprimer ne sont pas réintroduites par une validation ultérieure, quelque part dans votre fichier. Si vous le soupçonnez, vous devez alors utiliser filter-branch --tree-filter pour vous assurer que le contenu de ce fichier ne contient aucune information sensible dans un commit.

Dans les deux cas, vous finissez par réécrire le SHA1 de chaque livraison, soyez donc prudent si vous avez déjà publié la branche dont vous modifiez le contenu. Vous ne devriez probablement pas le faire à moins que votre projet ne soit pas encore public et que d’autres personnes ne se basent pas sur le travail que vous êtes sur le point de réécrire.

693
VonC

Comme indiqué dans Notes de version 1.7.12 , vous pouvez utiliser

$ git rebase -i --root
208
ecdpalma

git rebase -i vous permet d'éditer facilement tous les commits précédents, sauf pour le commit racine. Les commandes suivantes vous montrent comment procéder manuellement.

# tag the old root, "git rev-list ..." will return the hash of first commit
git tag root `git rev-list HEAD | tail -1`

# switch to a new branch pointing at the first commit
git checkout -b new-root root

# make any edits and then commit them with:
git commit --amend

# check out the previous branch (i.e. master)
git checkout @{-1}

# replace old root with amended version
git rebase --onto new-root root

# you might encounter merge conflicts, fix any conflicts and continue with:
# git rebase --continue

# delete the branch "new-root"
git branch -d new-root

# delete the tag "root"
git tag -d root
80
cmcginty

Si vous souhaitez modifier uniquement le premier commit, vous pouvez essayer git rebase et modifier le commit, qui est similaire à cet article: Comment modifier un commit spécifié dans git?

Et si vous souhaitez modifier tous les commits contenant l’e-mail brut, branche-filtre est le meilleur choix. Il existe un exemple de modification globale de l'adresse électronique dans le livre de Pro Git . Ce lien peut vous être utile http: // git-scm.com/book/fr/Git-Tools-Rewriting-History

0
ZelluX