git guida - ramo principale e 'origine / padrone' sono divergenti, come 'separare' i rami '?




pdf commit (9)

Per visualizzare le differenze:

git difftool --dir-diff master origin/master

Questo mostrerà le modifiche o le differenze tra i due rami. In araxis (il mio preferito) lo visualizza in uno stile di cartella. Mostrando ognuno dei file modificati. Posso quindi fare clic su un file per vedere i dettagli delle modifiche nel file.

In qualche modo il mio master e il mio master / origine sono divergenti. In realtà non voglio che siano divergenti. Come posso visualizzare queste differenze e "unirle"?


git pull --rebase origin/master 

è un singolo comando che può aiutarti la maggior parte del tempo.

Modifica: estrae i commit dall'origine / master e applica le modifiche alla cronologia di succursale appena estratta.


Ho avuto lo stesso messaggio quando stavo provando a modificare l'ultimo messaggio di commit, di commit già premuto, usando: git commit --amend -m "New message" Quando ho spinto le modifiche usando git push --force-with-lease repo_name branch_name lì non c'erano problemi


Ho avuto questo e sono confuso su cosa l'abbia causato, anche dopo aver letto le risposte di cui sopra. La mia soluzione era di fare

git reset --hard origin/master

Quindi, ripristina semplicemente la mia copia (locale) del master (che presumo sia avvitata) al punto corretto, come rappresentato da (remoto) origine / master.

ATTENZIONE : perderete tutte le modifiche non ancora inviate origin/master .


Nel mio caso ciò è stato causato dal non aver commesso la risoluzione del conflitto.

Il problema è stato causato dall'esecuzione del comando git pull . I cambiamenti all'origine hanno portato a conflitti con il mio repository locale, che ho risolto. Tuttavia, non li ho commessi. La soluzione a questo punto è di eseguire il commit delle modifiche ( git commit del file risolto)

Se hai anche modificato alcuni file dopo aver risolto il conflitto, il comando git status mostrerà le modifiche locali come modifiche locali non bloccate e la risoluzione di unione come modifiche locali a stadi. Questo può essere risolto correttamente commettendo le modifiche dall'unione prima con git commit , quindi aggiungendo e confermando le modifiche non previste come di consueto (es. Da git commit -a ).


Nel mio caso ho spinto le modifiche origin/master e poi ho realizzato che non avrei dovuto farlo :-( Questo è stato complicato dal fatto che i cambiamenti locali erano in una sottostruttura, quindi sono tornato all'ultimo commit valido prima del " cattive "modifiche locali (usando SourceTree) e poi ho ricevuto il" messaggio di divergenza ".

Dopo aver sistemato il mio pasticcio localmente (i dettagli non sono importanti qui) volevo "tornare indietro nel tempo" del ramo di origin/master remoto in modo che fosse di nuovo sincronizzato con il master locale. La soluzione nel mio caso era:

git push origin master -f

Nota l'interruttore -f (forza). Questo ha cancellato i "cattivi cambiamenti" che erano stati spinti origin/master per errore e ora i rami locali e remoti sono sincronizzati.

Tieni presente che si tratta di un'operazione potenzialmente distruttiva, quindi eseguila solo se sei sicuro al 100% che "lo spostamento" nel tempo del master remoto è OK.


Mi sono trovato in questa situazione quando ho provato a rebase un ramo che stava monitorando un ramo remoto, e stavo cercando di rebase su master. In questo scenario, se provi a rebase, molto probabilmente troverai il tuo ramo divergente e potresti creare un casino che non è per git nuvolees!

Diciamo che sei sul ramo my_remote_tracking_branch, che era derivato dal master

$ git status

# Sul ramo my_remote_tracking_branch

niente da commettere (directory di lavoro pulita)

E ora stai provando a rebase dal master come:

git rebase master

FERMATI ORA e risparmia qualche problema! Invece, usa l'unione come:

git merge master

Sì, finirai con altri commit sul tuo ramo. Ma a meno che non si vogliano rami "non divergenti", questo sarà un flusso di lavoro molto più fluido rispetto alla ridefinizione. Vedi questo blog per una spiegazione molto più dettagliata.

D'altra parte, se il tuo ramo è solo un ramo locale (cioè non ancora spinto a nessun telecomando) dovresti assolutamente fare un rebase (e il tuo ramo non divergerà in questo caso).

Ora se stai leggendo questo perché sei già in uno scenario "divergente" a causa di tale rebase, puoi tornare all'ultimo commit da origine (cioè in uno stato non divergente) usando:

git reset --hard origin / my_remote_tracking_branch


So che ci sono molte risposte qui, ma penso che git reset --soft HEAD~1 merita una certa attenzione, perché ti permette di mantenere le modifiche nell'ultimo commit locale (non spinto) mentre risolvi lo stato divergente. Penso che questa sia una soluzione più versatile di pull con rebase , perché il commit locale può essere rivisto e persino spostato su un altro ramo.

La chiave sta usando --soft , invece di harsh --hard . Se c'è più di un commit, una variazione di HEAD~x dovrebbe funzionare. Quindi ecco tutti i passaggi che hanno risolto la mia situazione (ho avuto 1 commit locale e 8 commit nel telecomando):

1) git reset --soft HEAD~1 per annullare il commit locale. Per i prossimi passi, ho usato l'interfaccia in SourceTree, ma penso che i seguenti comandi dovrebbero funzionare anche:

2) git stash per nascondere le modifiche da 1). Ora tutti i cambiamenti sono sicuri e non c'è più alcuna divergenza.

3) git pull per ottenere le modifiche remote.

4) git stash pop o git stash apply per applicare le ultime modifiche nascoste, seguito da un nuovo commit, se lo si desidera. Questo passaggio è facoltativo, insieme a 2) , quando si desidera eliminare le modifiche nel commit locale. Inoltre, quando si desidera eseguire il commit su un altro ramo, questo passaggio dovrebbe essere eseguito dopo il passaggio a quello desiderato.


1. Rinomina

Se è il tuo attuale ramo, fallo e basta

git branch -m new_name

Se è un altro ramo che si desidera rinominare

git branch -m old_name new_name

2. Traccia un nuovo ramo remoto

- Se il tuo ramo è stato inserito, dopo averlo rinominato devi eliminarlo dal repository Git remoto e chiedere al tuo nuovo locale di tenere traccia di un nuovo ramo remoto:

git push origin :old_name
git push --set-upstream origin new_name




git branch