2013-03-01 7 views
12

Recentemente ho iniziato a utilizzare GitHub for Windows.In conflitto, GitHub per Windows mi mette in stato "rebasing", come andare da lì?

Ho appena avuto un conflitto. Sulla linea di comando che sapere come gestire questo, ma GitHub for Windows scelto di mettermi in uno stato non ho familiarità con:

C:\Users\w\Documents\GitHub\CmisSync [(6026d18...)|REBASE +0 ~1 -0 !1 | +0 ~0 -0 !1]> git status 
# Not currently on any branch. 
# You are currently rebasing. 
# (fix conflicts and then run "git rebase --continue") 
# (use "git rebase --skip" to skip this patch) 
# (use "git rebase --abort" to check out the original branch) 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
... 

ho fissato il conflitto, ha impegnato i file, ma quando corro git push I Mi è stato detto:

fatal: You are not currently on a branch. 
To push the history leading to the current (detached HEAD) state now, use 

    git push origin HEAD:<name-of-remote-branch> 

Qual è il modo consigliato per ottenere il commit unione al master remoto?
Dubito che git push origin HEAD:master raggiungerà questo.

risposta

18

Come dicevamo con lo Simon Boudrias, se non sai veramente cosa hai fatto durante un rebase, la cosa migliore da iniziare è con un git rebase --abort. Come dice il verbo, interrompe l'attuale rebase e ti lascia con il tuo repository e la copia di lavoro nello stesso stato in cui era prima che il rebase iniziasse.

Dopodiché, dovresti fare tutto quello che hai fatto che ha avviato il processo di rebase (non credo che tu abbia detto cosa fosse, ma non credo sia davvero importante, neanche). Sicuramente il rebase ricomincerà da capo, ed è qui che la tua domanda iniziale inizia a ricevere una risposta.

Come dice l'output dello stato, sembra che ci siano conflitti. Dovresti risolverli (di solito uso git status --short più git mergetool per risolverli con meld), quindi i file git add. Quando lo stato è OK (ad esempio, ogni file che dovrebbe essere impegnato viene aggiunto, senza conflitti), è necessario git rebase --continue anziché git commit.

L'idea è che git rebase applica un gruppo di commit su un dato commit. Non so davvero quali siano i commit applicati in aggiunta a cosa, ma è importante averlo in mente. Tieni presente che possono essere visualizzati più conflitti, poiché i commit si applicano uno a uno. Usa git log per vedere quale è stato l'ultimo commit applicato e penso che ci debba essere un file nella tua directory .git/ con il messaggio di commit del commit attualmente applicato.

È un errore di newbie comune (siamo stati tutti lì :)) per provare ad includere le modifiche nei file durante la risoluzione del conflitto senza sapere (o dimenticare) che sarebbero stati applicati da un ultimo commit.

Quindi, si spera, dopo aver risolto alcuni conflitti, aggiungendo i file e git rebase --continue li, si dovrebbe arrivare a un felice repository funzionale, e sarete in grado di git push da lì su.

Infine, ma non meno importante: dopo tutto il materiale di rebase, utilizzare git log per verificare che non si stia modificando alcun commit pubblico.Supponi che il tuo nuovo ramo contenga il commit HEAD del telecomando. La rifondazione è potente e molto pericolosa. Non vuoi rebase di un commit pubblico - è forse l'unico dolore git che non vuoi affrontare :)

+0

cosa intendi con "verifica che non stai modificando alcun commit pubblico"? –

1

Per prima cosa è necessario terminare la modalità rebase chiamando git rebase --continue dopo aver risolto i conflitti. Questo dovrebbe quindi rimetterti sul ramo che stavi tirando (nel tuo caso master). Noterete che ciò accadrà quando la riga di comando (posh-git plugin) indicherà master anziché REBASE

Quindi è possibile utilizzare git push origin master. I parametri extra possono essere compilati automaticamente da Git, ma ciò dipenderà dalle tue impostazioni.

+1

A questo punto, probabilmente ha fatto un casino mentre cercava di eseguire commit e push durante un rebase. Eseguire 'git rebase --abort' e rifare le azioni che ti hanno lasciato con il rebase sembra essere una buona idea. – mgarciaisaia

+0

Buon punto, è sempre un buon momento per abortire e ricominciare da capo quando hai fatto un casino. Grazie per aver aggiunto questo. –

+0

Simon, ho provato a farlo, ma ho ottenuto "Nessuna modifica - hai dimenticato di usare 'git add'?", Quindi ho fatto esattamente ciò che ha fatto @ desert69, e questo ha funzionato. @ desert69, potresti postare la tua idea come risposta? Grazie! –