Come la maggior parte delle persone nuove a Git, ho avuto la mia parte di confusione cercando di decifrare i casi d'uso applicabili a git merge e git rebase. Penso di aver finalmente deciso che, per quanto riguarda lo stato di copia di lavoro risultante, ti danno la stessa cosa. Inoltre, entrambi provocano gli stessi conflitti. Se questo non è corretto, si prega di fornire un esempio per illuminarmi.git: throwaway unisce e git-rerere: qual è il punto?
Dal mio punto di vista, il vantaggio principale di usare rebase invece di unire (se le modifiche non sono state inserite o tirate) è di mantenere lineare la cronologia. Quello che davvero non capisco è il ragionamento che sta dietro lo sviluppo di git-rerere.
Dalla manpage, si suppone che git-rerere ti aiuti nel caso in cui tu stia cercando di risolvere un conflitto che hai precedentemente risolto. L'esempio a cui mi riferisco si trova a http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html.
Se la politica del progetto non fonde continuamente le modifiche dalla linea principale al ramo dell'argomento (come il kernel di Linux), l'esempio sopra riportato dice di creare commit "throw-away". In sostanza, unisci il master al tuo argomento, esegui test per assicurarti che tutto funzioni ancora, quindi esegui un "git reset --hard HEAD ^", in pratica lanciando il merge commit away. In seguito, quando crei un altro commit "throw-away" di merge, git-rerere ti assiste nel risolvere i conflitti che hai già risolto nella prima fusione di lancio.
Qualcuno può spiegare perché, invece di affrontare tutti i problemi legati alla creazione di un commit temporaneo di merge, lo sviluppatore non dovrebbe semplicemente rebase il suo argomento sul master? Non è questo il punto di git-rebase: ottieni le modifiche, ma evita l'unione? Questo non porta a compimento la stessa cosa, e supponendo che nessuno abbia tirato le modifiche ai tuoi topic topic, non sarebbe un approccio molto più semplice? Il flusso di lavoro throw-away-merge + git-rerere è davvero solo per il caso in cui i tuoi cambiamenti sono stati spinti/tirati?
Un'ultima domanda - Linus è citato come dicendo "Ma se vedo un sacco di 'Merge branch linus' nei tuoi log, non ho intenzione di strapparti, perché il tuo albero ha ovviamente avuto schifezze casuali in esso che non dovrebbe essere lì ... "Linus avrebbe anche un problema con i rebases costanti?
Grande, grazie per la risposta. Il commento bugfix - derivato dall'ultimo commit che è un antenato di entrambi, era in realtà molto illuminante. Sembra un'idea semplice, ma ho avuto l'impressione che uno dovrebbe diramarsi dalla punta di un ramo di maintentance, e quindi scegliere la correzione del bug sul master.Questo approccio sembra però molto più pulito e previene necessariamente la rebasing. – Josh
@ user370562: Il principio qui è di unire upstream/upwards e di creare i tuoi rami in modo tale che sia possibile. (Per inciso, i branch di manutenzione abbastanza spesso possono essere riuniti direttamente in master, le correzioni di bug che hai fatto su v5 probabilmente si applicano ancora alla v6 in sviluppo.) La maggior parte dei suggerimenti dei workflow enfatizza la fusione verso l'alto - vedi 'man gitworkflows', per esempio . Felice di essere d'aiuto! – Cascabel