2013-05-31 26 views
13

Io di solito uso git pull --rebase se sto lavorando direttamente su master (che cerco di non fare comunque). Nel caso in cui ho dimenticato di fare un rebase e ho appena fatto git pull, c'è un modo per annullarlo e renderlo lineare, piuttosto che avere un'unione? Fare un rebase a questo punto sarebbe una cattiva idea (se questo porterebbe a qualcosa)?git rebase dopo pull

So che posso abilitare la possibilità di rebasing su pull in modo predefinito, quindi non dimentico, ma questo è più un problema di capire cosa fare in questo caso.

+3

immagino 'git resettare --hard' indietro a prima del tiro e rifare la trazione è la via. – Alex

+0

Grazie. Puoi postare questo come risposta piuttosto che un commento? –

risposta

3

immagino git reset --hard indietro a prima del tiro e rifare il tiro è il modo

14

Risposta breve (già data dal @alex nei commenti): git reset --hard HEAD^, ma solo se c'è un merge commit (altrimenti sei solo il backup di un impegno dal fast-forward).

Versione lunga con la spiegazione:

git pull è in realtà solo git fetch seguito da git merge (a meno che non si sostituisce con --rebase, come si nota). Quindi non vi resta che vedere se hai un merge reale commettere o no:

$ git pull 
Updating 171ce6f..523bacb 
Fast-forward 
mp.py | 24 ++++++++++++++++++++++++ 
1 files changed, 24 insertions(+), 0 deletions(-) 
create mode 100644 mp.py 

In questo caso non vi era alcuna fusione commettere, solo un fast-forward, quindi, nessun problema-non ci sono cambiamenti di Rebase! Se fai un git log vedrai il mancato-di-merge-commit, specialmente se fai il grafico qui sotto.

Forza unione.

$ git reset --hard HEAD^ 
HEAD is now at 171ce6f ignore *.log files 

[ora sono uno dietro remotes/origin/master]

$ echo '# pointless comment' >> selfref.py 
$ git add selfref.py 
$ git commit -m 'added to force merge' 
[master 260e129] added to force merge 
1 files changed, 1 insertions(+), 0 deletions(-) 
$ git pull 
Merge made by recursive. 
mp.py | 24 ++++++++++++++++++++++++ 
1 files changed, 24 insertions(+), 0 deletions(-) 
create mode 100644 mp.py 

Possiamo vedere che questo è accaduto, anche se il testo di cui sopra manca, con:

$ git log --graph --decorate --abbrev-commit --pretty=oneline 
* c261bad (HEAD, master) Merge branch 'master' of [ssh url] 
|\ 
| * 523bacb (origin/master, origin/HEAD) add multiprocessing example 
* | 260e129 added to force merge 
|/ 
* 171ce6f ignore *.log files 

Vogliamo ottenere il nome della filiale locale master in modo che punti (in questo caso) 260e129 nuovamente. Per fortuna che è veramente facile da nome:

$ git rev-parse HEAD^ 
260e1297900b903404c32f3706b0e3139c043ce0 

(L'altro genitore della corrente, con due genitori, merge commit è HEAD^2.) Quindi:

$ git reset --hard HEAD^ 
HEAD is now at 260e129 added to force merge 

e ora possiamo rebase su remotes/origin/master (I 'll utilizzare il nome davvero breve, origin, per citarne che):

$ git rebase origin 
First, rewinding head to replay your work on top of it... 
Applying: added to force merge 

Ora il grafico-y spettacoli del registro una linea:

$ git log --graph --decorate --abbrev-commit --pretty=oneline 
* 4a0b2e2 (HEAD, master) added to force merge 
* 523bacb (origin/master, origin/HEAD) add multiprocessing example 
* 171ce6f ignore *.log files 

Da tutto questo, si dovrebbe essere in grado di capire cosa fare se si esegue git pull e si lamenta che l'unione non riesce. :-)

0

Voglio dare qualche consiglio che aiuti a mantenere lineare la storia. Imposta la seguente configurazione git per ribasare automaticamente il ramo quando fai il pull.

$ git config branch.autosetuprebase always 

Dopo l'applicazione di questa impostazione non è necessario digitare il comando completo di tiro con --rebase parametro, basta git pull.

Maggiori informazioni si possono ottenere in questo articolo http://stevenharman.net/git-pull-with-automatic-rebase

+0

Come affermato nella mia domanda, so che posso farlo. Sto solo cercando di imparare cosa fare in questo caso. –