L'altro giorno è successo qualcosa di molto strano che non posso spiegare, che quasi sicuramente si traduce in una mancanza che ho nella comprensione di git e GitHub.
Sto lavorando a un progetto su GitHub usando il Flusso GitHub modello. C'erano due rami di funzioni su cui si lavorava attivamente: li chiameremo A e B. Entrambi stavano progredendo felicemente con i propri commit, fino a quando uno di loro non ha letto:
Unisci il ramo di monitoraggio remoto "origine / b in b"
Da quel momento, la richiesta pull peril ramo A mostrava i commit sia per A che per B. Non avevo notato che, e unendo la richiesta pull per A in master, contemporaneamente chiudeva la richiesta pull per B in GitHub. Guardando indietro alla richiesta pull per B dopo ha chiuso, sembrava che avesse "perso" tutti i suoi commit tranne due.
Come è successo? Quali comandi git possono collegare branch (e PR) in questo modo? Mi piacerebbe riuscire a riproporlo a partire da un repository pulito come esempio di apprendimento per il team.
risposte:
0 per risposta № 1Come sono arrivati i commit di B in A?
Sembra che tu abbia estratto o unito le modifiche dal ramo B al ramo A, quindi hai spinto il ramo A (che ora contiene i commit da A e B) in GitHub. Ecco un esempio minimo possibile:
git clone <your repo clone url>; cd <reponame>
git commit --allow-empty -m "first commit guarantees shared history"
git checkout -b B
touch bar; git add bar; git commit -m "commit on branch B"
git push origin B
git checkout master
git checkout -b A
touch foo; git add foo; git commit -m "Commit on branch A"
git push origin A
# Create PR from A into master using GitHub UI
git status
On branch A
nothing to commit, working directory clean
git merge B
# your editor opens and you make a commit
git push origin A
Ora tutti i commit che erano sul ramo B quando hai digitato git merge B
siamo fuse nel ramo A. Quando li spingi nel ramo A, verranno visualizzati nella richiesta pull da A al master, poiché GitHub presume che i successivi commit in un ramo debbano indirizzare il feedback di revisione su un PR.
Perché il PR da B a master è stato chiuso?
Anche se probabilmente sei abituato a unire PRil pulsante nell'interfaccia utente, eseguendo un'unione sulla riga di comando, fa esattamente la stessa cosa. Il modo in cui GitHub decide se un PR è stato unito manualmente o meno è quello di confrontare gli ID dei commit nel PR con gli ID dei commit nel ramo con cui hai creato il PR (in questo caso, master). Poiché tutti i commit dal ramo B sono stati uniti in master come parte del PR dal ramo A, sembrava esattamente lo stesso a GitHub come se il ramo B fosse stato unito a mano, quindi il PR era contrassegnato come "unito" e non più si presenta come "aperto".
Quali comandi git possono "collegare" rami / PR?
git merge otherbranch; git push remotename PRbranch
git pull remotename branchname; git push remotename PRbranch
git cherry-pick <commit range>; git push remotename PRbranch
se selezioni tutti gli commit da qualche altra PRgit apply <patchfile>; git push remotename PRbranch
se per qualche motivo l'intero contenuto di un'altra PR ti è stato inviato via e-mail come patch
Fondamentalmente, qualsiasi comando che porta commit di un altro ramo nella tua storia ha il potenziale per causare il comportamento che hai visto.