Ho la seguente situazione:Git ripristinare il comportamento
Il maestro ramo aveva una versione stabile di applicazione.
Developer Un recentemente fatto una caratteristica-ramo chiamato ramo-a con diversi commit (servano da a-1, a-2, a-3). Le funzionalità implementate qui sono basate sul codice aggiornato dal master e sono ben testate per il momento.
Sviluppatore B aveva una funzione di ramo chiamato ramo-b con diversi commit (per esempio, b-1, b-2, b-3). Per qualche ragione, il signor B aveva una versione obsoleta (basata sullo stato del master di una settimana o due fa) nel suo branch e non aveva affatto testato il codice.
Entrambi gli sviluppatori fusero la loro caratteristica-rami di padroneggiare con:
- maestro git checkout
- git maestro origine tirare
- ramo-X git merge (dove X = a, b)
- git push origin master
Non è stato utilizzato alcun comando rebase. In primo luogo questa sequenza è stato fatto da B, il prossimo - di A.
Quando ho (sviluppatore C) tirato da maestro, ho visto in git log qualcosa di simile:
- un'unione: fondersi con maestro dallo sviluppatore un
- a-3
- a-2
- a-1
- B-3 (sì, questo commit viene subito dopo quella che si fonde)
- b-unione-conflitti: fondersi con il maestro dallo sviluppatore B (migliaia di file in conflitto)
- b-2
- b-1
- master-stabile: stabile precedente commette
Come risultato Mr. B in qualche modo aveva forzato la vecchia versione del codice a sovrascrivere la versione stabile durante l'unione (risultato in commit b-merge-conflict).
ora voglio riscrivere la storia e salvare b-1 + B-3 + a-1 + A-2 + A-3 modifiche e annullare B-2 , b-merge-conflict e a-merge.
La mia idea è quella di annullare diversi top impegna fino b-1 e quindi di utilizzare cherry-pick patch per applicare b-3, a-1, a-2, a-3 si impegna nel nuovo master.
ma quando provo: resettare
git HEAD --hard ~ 7 riesco a vedere una storia che contiene solo vecchie commit (prima del master-stabile), senza quelle di ramo-a e ramo-b.
quando provo:
git azzerato HEAD --hard ~ 2
posso vedere nella storia unico master-stabile impegnarsi in alto, ma non a-2 come voglio .
Sembra che git reset non traduca una cifra dopo HEAD come un numero di commit da reimpostare (come avevo sott'occhio dalla documentazione), ma come un numero di HEAD-changes da git pull (nei miei esempi ci sono 2).
Come posso annullare correttamente i primi 7 commit b-2 .. un-merge e riscrivere una cronologia a partire da b-1?
UPDATE chiesto nei commenti
ho usato (senza --all per escludere ulteriori informazioni)
git Log --oneline --decorate --graph
* ef7d93f Merge with master by Developer A
|\
| * 2b9dd31 b-4
| * 924a452 b-3
| * 1f9489d b-2
| * e3cd7a6 Merge by Developer B [2]: Merge branch 'master' from https://github.com ....
| |\
| * | aece506 Merge by Developer B [1]: merge branch
| * | 487e7ee b-1
* | | d9404f8 a-1
| |/
|/|
* | 9b202ce master-stable last commit
Per quanto riguarda l'ordine, riprovare con --topo-order. L'ordine normale di log è l'ordine delle date, e se sei su Windows gli orologi delle varie macchine sono probabilmente abbastanza fuori sincrono. – jthill
Invece di eseguire semplicemente 'git log', provare a eseguire' git log --oneline --decorate --graph --all'. Questo ti darebbe un'idea migliore dello stato del repository. – Jubobs
@jthill bene .. Vuoi dire che è solo un problema basato sull'ordine? Ma allora come spiegare il comportamento di git resettato --hard HEAD ~ 2? –