git rebase merge conflitto


93

Ho biforcato un repository GitHub e ho lavorato al mio repository GitHub.
Ho effettuato richieste pull ed è stato completato.

Dopo di che l'upstream ha avuto altri commit, quindi ora voglio rebase, immagino che sia quello che devo fare.
Ma sto ottenendo questi conflitti di unione:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

Non so come risolverli, per favore aiutatemi.


Dai un'occhiata alla mia risposta in questo post: stackoverflow.com/questions/48307297/…
Abhishek

Risposte:


125

Ribasare può essere un vero mal di testa. Devi risolvere i conflitti di unione e continuare a ribasare. Ad esempio puoi utilizzare lo strumento di unione (che differisce a seconda delle tue impostazioni)

git mergetool

Quindi aggiungi le modifiche e vai avanti

git rebase --continue

In bocca al lupo


2
si ribasare è mal di testa, posso usare git pull upstream master?
pahnin

2
Sì, puoi provarlo. La differenza è che i tuoi commit non vengono quindi aggiunti a quelli a monte. Potenzialmente ci sono meno conflitti di unione.
iltempo

7
@iitempo Non è necessario eseguire un commit. Basta un git add per consentire al rebase di continuare.
enigmaticPhysicist

47

Quando hai un conflitto durante il rebase hai tre opzioni:

  • Puoi correre git rebase --abortper annullare completamente il rebase. Git ti riporterà allo stato del tuo ramo com'era prima che git rebase fosse chiamato.

  • Puoi correre git rebase --skipper saltare completamente il commit. Ciò significa che nessuna delle modifiche introdotte dal commit problematico sarà inclusa. È molto raro che tu scelga questa opzione.

  • Puoi risolvere il conflitto come ha detto iltempo. Quando hai finito, dovrai chiamare git rebase --continue. Il mio mergetool è kdiff3 ma ce ne sono molti altri che puoi usare per risolvere i conflitti. Devi solo impostare lo strumento di unione nelle impostazioni di git in modo che possa essere richiamato quando chiami git mergetool https://git-scm.com/docs/git-mergetool

Se nessuna delle opzioni precedenti funziona per te, fai una passeggiata e riprova :)


2
Sì, ma come risolvere il conflitto? questa è la domanda. Che cosa c'è tra "aggiusta il conflitto" e "quando hai finito"
KansaiRobot

@KansaiRobot Un'opzione per eseguire la correzione manuale: apri il file in conflitto in un editor di testo e cerca<<<<<
spinup

18

Se hai molti impegni da ribasare, e alcune parti di essi danno conflitti, fa davvero male. Ma posso suggerire un approccio meno noto come "schiacciare tutti i conflitti".

Innanzitutto, controlla il ramo temporaneo e avvia l'unione standard

git checkout -b temp
git merge origin/master

Dovrai risolvere i conflitti, ma solo una volta e solo quelli reali. Quindi prepara tutti i file e termina l'unione.

git commit -m "Merge branch 'origin/master' into 'temp'"

Quindi torna al tuo ramo (lascia che sia alpha ) e inizia a rebase, ma con la risoluzione automatica di eventuali conflitti.

git checkout alpha
git rebase origin/master -X theirs

Il ramo è stato ribasato, ma il progetto è probabilmente in uno stato non valido. Va bene, abbiamo un passaggio finale. Dobbiamo solo ripristinare lo stato del progetto, quindi sarà esattamente come nel ramo "temp". Tecnicamente abbiamo solo bisogno di copiare il suo albero (stato della cartella) tramite il comando di basso livello git commit-tree . Inoltre, l'unione nel ramo corrente ha appena creato il commit.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

Ed elimina il ramo temporaneo

git branch -D temp

È tutto. Abbiamo eseguito un rebase tramite unione nascosta.

Inoltre ho scritto uno script, in modo che possa essere fatto in modo dialogico, lo puoi trovare qui .


13

Nota: con Git 2.14.x / 2.15 (Q3 2017), il git rebase messaggio in caso di conflitti sarà più chiaro.

Vedi commit 5fdacc1 (16 luglio 2017) di William Duclot ( williamdclt) .
(Fuso da Junio ​​C Hamano - gitster- nel commit 076eeec , 11 agosto 2017)

rebase: rendere il messaggio di risoluzione più chiaro per gli utenti inesperti

Prima:

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort"

Dopo:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

L'interfaccia utente di git può essere migliorata indirizzando i messaggi di errore a coloro che aiutano: utenti git inesperti e casuali.
A tal fine, è utile assicurarsi che i termini utilizzati in quei messaggi possano essere compresi da questo segmento di utenti e che li guidino nella risoluzione del problema.

In particolare, la mancata applicazione di una patch durante un rebase git è un problema comune che può essere molto destabilizzante per l'utente inesperto.
È importante guidarli verso la risoluzione del conflitto (che è un processo in 3 fasi, quindi complesso) e rassicurarli sul fatto che possono sfuggire a una situazione che non possono gestire " --abort".
Questo commit risponde a questi due punti specificando il processo di risoluzione ed evitando criptico git linguo.


1
Bello! La pagina della guida dice di risolvere il conflitto eseguendo la modifica, ma no! Qui dobbiamo saltare il commit e continuare invece l'unione! (pagina della guida: help.github.com/articles/… )
Jerther
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.