567 votes

Modifier la première validation de projet avec Git?

Je veux changer quelque chose dans la première validation de mon projet avec perdant tous les commits. Est-il possible de faire cela?

J'ai accidentellement répertorié mes brutes e-mail dans un commentaire dans le code source, et j'aimerais le changer comme je suis spammé contre les robots d'indexation GitHub.

867voto

VonC Points 414372

Comme mentionné par ecdpalma ci-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 toute l'histoire menant à "$tip" à la racine de la validation.

Que nouveau comportement a d'abord été discuté ici:

Personnellement, je pense que "git rebase -i --root" doit être fait simplement, sans exiger "--onto" et laissez-vous "modifier" même le premier dans l'histoire.
Il est compréhensible que personne n'a pris la peine, comme les gens sont beaucoup moins souvent la réécriture de près le début de l'histoire que du contraire.

Le patch suivi.


(réponse originale à cette question, février 2010)

Comme mentionné dans le Git FAQ (et ce DONC, la question), l'idée est la suivante:

  1. Créer de nouveaux temporaire de la branche
  2. Rembobiner à la livraison que vous souhaitez modifier à l'aide de git reset --hard
  3. Le changement qui s'engagent (ce serait le début de la TÊTE, et vous pouvez modifier le contenu de n'importe quel fichier)
  4. Rebase branche sur le dessus d'un changement de commettre, à l'aide de:

    git rebase --onto <tmp branch> <commit after changed> <branch>`
    

Le truc est d'être sûr que les informations que vous souhaitez supprimer n'est pas réintroduite par un plus tard commettre quelque part d'autre dans votre fichier. Si vous pensez cela, alors vous devez utiliser filter-branch --tree-filter afin de s'assurer que le contenu de ce fichier ne contient pas de toute commettre des informations sensibles.

Dans les deux cas, vous réécrire le SHA1 de chaque livraison, donc soyez prudent si vous avez déjà publié la direction générale, vous êtes en train de modifier le contenu de. Vous ne devriez probablement pas le faire sauf si votre projet n'est pas encore public et d'autres gens n'ont pas de travail hors de la commits que vous êtes sur le point de réécrire.

266voto

ecdpalma Points 1568

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

$ git rebase -i --root

90voto

Casey Points 19286

git rebase -i vous permet de facilement modifier une précédente s'engage, sauf pour la racine s'engager. Les commandes suivantes vous montrer comment le faire 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

-2voto

ZelluX Points 15836

Si vous souhaitez modifier uniquement le premier commit, vous pouvez essayer de git rebase et de modifier les commettre, qui est similaire à ce post: Comment modifier un certain engager?

Et si vous souhaitez modifier tous les commits qui contiennent de l'électronique brut, filter-branch est le meilleur choix. Il est un exemple de comment changer l'adresse email dans le monde sur le livre Pro Git, et vous pouvez trouver ce lien utile http://git-scm.com/book/en/Git-Tools-Rewriting-History

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