2015-06-26 36 views
21

Sono l'amministratore del repository GitHub https://github.com/plison/opendial. Vorrei ridurre il numero di commit sul repository, dal momento che il repository ha già qualche migliaio di commit, molti dei quali sono deboli modifiche di debug che potrebbero facilmente essere schiacciati insieme (specialmente quelli che hanno pochi anni).Errore con git rebase ("impossibile applicare ...")

Sto quindi cercando di applicare il ribasso al fine di mettere insieme una parte dei miei commit. Tuttavia, ho riscontrato il seguente problema:

  1. Quando si digita ad es. git rebase -i HEAD~10, ottengo un numero piuttosto lungo di righe di commit (molto più di 10) nell'editor interattivo. Quale potrebbe essere la ragione? Ancora più importante, una volta che chiudo l'editor interattivo per iniziare il rebasing, ottengo sistematicamente il messaggio di errore "error: could not apply", anche se non applico alcuna modifica al commit (cioè se lascio tutto linee come 'prendere', senza alcuna modifica o riordino).

Come posso risolvere questi problemi? Si deve notare che il repository è stato importato automaticamente da un precedente SVN) repository (ospitato su Google Code. la conversione sembrava così lontano da aver funzionato bene, ma mi chiedo perché ottengo questi errori quando provo a rebase i miei commit

+2

Non farlo, è una pessima idea. Per i motivi vedere: http://superuser.com/a/667200/83759, e il libro Pro Git dice: "In generale, il modo migliore per ottenere il meglio da entrambi i mondi è di rebase alle modifiche locali che hai apportato ma che non hai condiviso ancora prima di spingerli al fine di ripulire la tua storia, ma mai rebase tutto ciò che hai spinto da qualche parte. " (https://git-scm.com/book/en/v2/Git-Branching-Rebasing) –

risposta

13

La storia o Se il tuo progetto sembra contenere un numero di commit di fusione recentemente (presumibilmente hai creato quelle). La presenza di unione si impegna in ciò che si desidera rebase in modo interattivo di solito causa problemi. (Un rebase interattivo assume praticamente una storia lineare, ma unire impegna a non sono lineari.)

La vostra storia del progetto anche sembra in qualche modo avere due storie parallele che vengono unite insieme nel commettere 11b3653 (utilizzare uno strumento come gitk o tig per vedere questo, non è mostrato bene nell'interfaccia web di Github).

Suggerisco di tentare innanzitutto di appiattire la cronologia per eliminare le cronologie parallele e rimuovere i commit di unione. Quindi, una volta che si dispone di una cronologia strettamente lineare, è possibile impostare la riscrittura della cronologia per rimuovere tutto il churn di debug.

+5

Interessante che la maggior parte delle risposte per appiattire la cronologia git raccomandino git rebase ma usare git rebase per risolvere l'errore con git rebase rende le cose complicate :) Mi piacerebbe raggruppare commit in pochi gruppi e solo le opzioni sembrano git squash fondersi con un determinato autore di commit originale. – kodstark

23

Come promemoria per me stesso su come risolvere questo:

Il messaggio di errore non è molto istruttiva. Se si digita

git rebase --continue 

ci si rende conto l'errore è a causa di un conflitto di unione che git non può risolvere da sola, e ha bisogno del tuo aiuto.

Risolvere i conflitti unione nel vostro editor preferito/IDE (suggerimento: questo dovrebbe iniziare con i e terminare con ntelliJ)

risoluzione

Marco con

git add . 

Se tutti i conflitti sono risolti, si dovrebbe vedere qualcosa del genere:

(all conflicts fixed: run "git rebase --continue") 

in modo da continuare la tua rebase con

git rebase --continue 

Speriamo che il vostro rebase dovrebbe ora avere successo

git status 

spettacoli:

On branch feature/DIG-19302-Upgrade-mockito-v2 
Your branch is behind 'origin/feature/your-feature-branch' by 2 commits, and can be fast-forwarded. 
(use "git pull" to update your local branch) 

nothing to commit, working directory clean 

non fare un git pull. Se lo fai, sovrascrivi solo i tuoi conflitti di fusione. Invece spingere le vostre risoluzioni di conflitto di fusione al ramo) con

git push --force 

Il gioco è fatto! Il tuo log git dovrebbe mostrare solo 1 commit ora (che è l'aggiornamento forzato che hai appena fatto)

+0

L'ultimo punto è la chiave. Ho provato a fare un git push, ottenendo un errore non aggiornato, facendo git pull e poi un file da unire di nuovo. git push --force ha risolto il problema per me. –

+6

Sono un po 'curioso; in che lingua inizia vim con i e finisce con ntelliJ? – Shuklaswag

+0

@Shuklaswag buon punto. Integravo intelliJ come editor di git, ma ora uso solo vim. –