Domanda

    

Questa domanda ha già una risposta qui:

    
            
  •              Modifica la radice commettere in Git?                                      5 risposte                          
  •     
    

voglio cambiare qualcosa nel primo commit del mio progetto con fuori perdendo tutti i commit successive. Esiste un modo per fare questo?

Ho elencato accidentalmente la mia email prime in un commento all'interno del codice sorgente, e mi piacerebbe cambiare come mi sto spammato dal bots indicizzazione GitHub.

È stato utile?

Soluzione

Come già detto da ecdpalma sotto , git 1.7.12+ (agosto 2012) ha migliorato l'opzione per la --root git rebase:

"git rebase [-i] --root $tip" può ora essere utilizzato per riscrivere tutta la storia che porta a "$tip" fino alla radice commit.

Questo nuovo comportamento è stato inizialmente discusso qui :

  

Personalmente ritengo "git rebase -i --root" dovrebbe essere fatto per funzionare senza richiedere "--onto" e lasciare che "modifica", anche il primo nella storia.
  E 'comprensibile che nessuno si preoccupa, come le persone sono molto meno spesso riscrivere vicino fin dall'inizio della storia rispetto a quello altrimenti.

La patch seguito .


(risposta originale, febbraio 2010)

Come indicato nella Git FAQ (e questo domanda SO ), l'idea è:

  1. Crea nuovo ramo temporaneo
  2. riavvolgerlo per il commit che si desidera modificare utilizzando git reset --hard
  3. Cambia che commit (sarebbe superiore della testa corrente, ed è possibile modificare il contenuto di qualsiasi file)
  4. REBASE ramo in cima cambiato impegnarsi, utilizzando:

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

Il trucco è quello di essere che le informazioni che si desidera rimuovere non viene reintrodotto da una successiva commettere qualche altra parte nel file. Se si sospetta che, allora è necessario utilizzare filter-branch --tree-filter per assicurarsi che il contenuto di tale file non contiene in alcun commettere l'informazioni sensibili.

In entrambi i casi, si finisce per riscrivere la SHA1 di ogni commit, quindi fate attenzione se avete già pubblicato il ramo si sta modificando il contenuto del. Probabilmente non dovrebbe fare a meno che il progetto non è ancora pubblica e le altre persone non hanno basato il lavoro fuori i commit che si sta per riscrivere.

Altri suggerimenti

Come indicato nel Note 1.7.12 uscita , si può usare

$ git rebase -i --root

git rebase -i consente di modificare facilmente qualsiasi commit precedenti, ad eccezione della radice commit . I comandi seguenti mostrano come fare questa operazione manualmente.

# 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

Se si desidera modificare solo la prima di impegnarsi, si può provare git rebase e modificare il commit, che è simile a questo post: Come modificare un determinato impegnarsi in git?

E se si desidera modificare tutti i commit che contengono l'e-mail prima, filtro-ramo è la scelta migliore. V'è un esempio di come cambiare l'indirizzo di posta elettronica a livello globale sul libro Pro Git , e si può trovare questo link utile http://git-scm.com/book/en/Git-Tools-Rewriting-History

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top