Richiesta pull di GitHub che mostra i commit che sono già nel ramo di destinazione


136

Sto cercando di rivedere una richiesta pull su GitHub a un ramo che non è master. Il ramo di destinazione era dietro il master e la richiesta pull mostrava i commit dal master, quindi ho unito master e l'ho spinto su GitHub, ma i commit e le differenze per loro appaiono ancora nella richiesta pull dopo l'aggiornamento. Ho raddoppiato verificato che il ramo su GitHub abbia i commit dal master. Perché vengono ancora visualizzati nella richiesta pull?

Ho anche verificato la richiesta pull localmente e mostra solo i commit non uniti.


Ciò influisce sul comportamento della fusione del PR?
Nathan Hinchey,

No, solo il diff su Github.
lobati,

Qualcuno sa se Gitlab ospitato autonomamente soffre dello stesso comportamento?
Jeff Welling,

2
Suggerisco a tutti di contattare GitHub per esprimere il nostro interesse a modificare questo comportamento ( support.github.com/contact ). Se non ci sentono, non sapranno quanto questo sia importante e sarà così per sempre.
steinybot,

Risposte:


107

Sembra che la richiesta pull non tenga traccia delle modifiche al ramo di destinazione (ho contattato il supporto di GitHub e ho ricevuto una risposta il 18 novembre 2014 affermando che questo è di progettazione).

Tuttavia, puoi ottenerlo per mostrarti le modifiche aggiornate procedendo come segue:

http://githuburl/org/repo/compare/targetbranch...currentbranch

Sostituire githuburl, org, repo, targetbranch, e currentbranch, se necessario.

O come ha sottolineato hexsprite nella sua risposta, puoi anche forzarlo ad aggiornarlo facendo clic Editsul PR e cambiando temporaneamente la base in un altro ramo e viceversa. Questo produce l'avvertimento:

Sei sicuro di voler cambiare la base?

Alcuni commit dal vecchio ramo di base potrebbero essere rimossi dalla sequenza temporale e i vecchi commenti di revisione potrebbero diventare obsoleti.

E lascerà due voci di registro nel PR:

inserisci qui la descrizione dell'immagine


4
Sì, ho contattato l'assistenza qualche tempo fa e ho avuto la stessa risposta. Non ottimizzano per questa situazione. È un po 'frustrante. Il nostro modo di aggirare il problema è semplicemente rifare e forzare il push up, oppure chiudere il pull e crearne uno nuovo.
lobati,

4
Questa risposta non risolve il problema, ma consente all'utente di vedere il vero diff.
FearlessFuture,

4
La domanda era "Perché appaiono ancora nella richiesta pull?". Risponde a questa domanda.
Adam Millerchip,

3
Guarda il mio commento per una buona soluzione. Puoi semplicemente usare il pulsante di modifica PR per passare a un altro ramo e poi tornare al ramo di base originale e ricalcolerà il diff.
hexsprite,

11
Esiste una richiesta cara-github per ottenere questo cambiato?
vossad01

88

Ecco una buona soluzione. Utilizzare il Editpulsante quando si visualizza il PR in GitHub per modificare il ramo di base in qualcosa di diverso da master. Quindi ripristinalo mastere ora mostrerà correttamente solo le modifiche degli commit più recenti.


4
Sono sorpreso che più persone non riconoscano questa soluzione. Ho il sospetto che la richiesta pull originale non aggiornata andrebbe bene, ma GitHub non mostra tutti i file scaduti, quindi l'ho usato ed entrambi mantengono il commento e mostrano solo le modifiche effettive che stanno per essere unite . Grazie!
Taranaki,

2
Non ha funzionato per me.
Shashank,

Accidenti funziona!
Anurag Hazra,

Tre anni dopo e questa è ancora un'ottima soluzione. E guarda qualcuno appena commentato qualche ora fa ^^^
Ricardo Saporta il

32

Per riassumere, GitHub non modifica automaticamente la cronologia di commit nelle richieste pull. Le soluzioni più semplici sono:

Soluzione 1: Rebase

Supponiamo che si desidera unire in masterda feature-01:

git fetch origin
git checkout feature-01
git rebase origin/master
git push --force

Se stai lavorando su una forcella, potrebbe essere necessario sostituirla origincon upstream. Vedi Come aggiorno un repository biforcato GitHub? per ulteriori informazioni sul tracciamento di rami remoti del repository originale.

Soluzione 2: creare una nuova richiesta pull

Supponiamo di voler unire intro masterda feature-01:

git checkout feature-01
git checkout -b feature-01-rebased
git push -u origin feature-01-rebased

Ora apri una richiesta pull feature-01-rebasede chiudi quella per feature-01.


4
Un rebase modifica gli hash di commit, quindi finirebbe per cestinare i commenti delle recensioni esistenti?
Haridsv,

@haridsv Probabilmente sì.
Mateusz Piotrowski,

Qualcosa a cui prestare attenzione quando si fa push - force?
Paul Bendevis,

1
@haridsv non è la mia esperienza. Rifaccio spesso la revisione intermedia e i commenti non vanno persi. Anche se perdo la storia dei cambiamenti nel PR
joel

@JoelBerkeley Nel frattempo ho sperimentato un paio di recensioni in cui l'autore ha ribadito e osservato che i commenti sono intatti. Tuttavia, perdiamo la possibilità di rivedere in modo incrementale e per le recensioni di grandi dimensioni è una penalità enorme per i revisori. Ora abbiamo alcune linee guida per i nostri PR e uno di questi non potrà mai essere modificato dopo l'apertura della recensione (a meno che non si sia sicuri che nessuno abbia ancora iniziato la revisione). La fusione va bene, ma la nostra linea guida è quella di non mescolare il cambiamento di unione con qualsiasi altro cambiamento diverso dalle risoluzioni del conflitto.
Haridsv,

17

Devi aggiungere quanto segue al tuo ~/.gitconfigfile:

[rebase]
    autosquash = true

Ciò otterrà automaticamente lo stesso di quello che mostra questa risposta .

L'ho preso da qui .


2
accidenti, ho cliccato sul voto per errore. questa risposta mi ha aiutato. lasciami cambiare per favore.
Ettore,

@hosein Go for it. Dovresti essere in grado di farlo ora.
Mateusz Piotrowski,

1
Penso che questa dovrebbe essere la risposta accettata o inclusa nella risposta accettata. Questo raggiunge il risultato che stavo cercando!
Ronald Rey,

1
@RonaldRey git rebasing non è una soluzione universale, perché comporta la modifica della cronologia. Se tutti lavorano su fork privati ​​che non vengono mai clonati da altri, allora va bene, ma appena qualcuno clona il tuo repository e poi modifichi la storia, finisci con storie diverse.
Adam Millerchip

14

Per chiunque si imbatta in questo e confuso dal comportamento della richiesta pull di GitHub, la causa principale è che un PR è un diff della punta del ramo di origine rispetto al progenitore comune del ramo di origine e del ramo di destinazione. Mostrerà quindi tutte le modifiche sul ramo di origine fino all'antenato comune e non terrà conto di eventuali modifiche che potrebbero essersi verificate sul ramo di destinazione.

Maggiori informazioni disponibili qui: https://developer.atlassian.com/blog/2015/01/a-better-pull-request/

I diff diffusi basati su antenati sembrano pericolosi. Vorrei che GitHub avesse un'opzione per creare un PR basato su unione a 3 vie più standard.


1
Il motivo che hai citato sembra corretto, ma sono confuso perché generalmente ogni volta che il master viene aggiornato, unisco le modifiche al mio ramo ... git checkout my-branch -> git merge master . La richiesta pull viene aggiornata immediatamente. Anche l'antenato comune viene aggiornato?
G. Uno

2
Questo comportamento sembra verificarsi quando si fa rebase invece di unire
G.One

1
@ G.One, risposta davvero in ritardo, ma sì - se si unisce da quel ramo principale al ramo di origine, per definizione è stato aggiornato l'antenato comune. È il commit sul master da cui ti sei unito.
David K. Hess,

13

Un modo per risolvere questo problema è git rebase targetbranchin quel PR. Quindi git push --force targetbranch, quindi Github mostrerà i giusti commit e diff. Fai attenzione se non sai cosa stai facendo. Magari controlla prima un ramo di prova per fare il rebase poi git diff targetbranchper assicurarti che sia ancora quello che vuoi.


10

Questo succede con GitHub quando i commit di squash vengono uniti dal ramo di destinazione.

Avevo usato squash e merge con Github come strategia di unione predefinita, comprese le fusioni dal ramo di destinazione. Questo introduce un nuovo commit e GitHub non riconosce che questo commit schiacciato è lo stesso di quelli già presenti nel master (ma con hash diversi). Git lo gestisce correttamente, ma vedi di nuovo tutte le modifiche in GitHub, rendendolo fastidioso da rivedere. La soluzione è fare una fusione regolare di questi commit a monte invece di uno squash e unire. Quando vuoi unirti in un altro ramo nel tuo come dipendenza, git merge --squashe ripristinare quel singolo commit prima di estrarre dal master una volta che l'altro ramo è effettivamente arrivato al master.

EDIT: un'altra soluzione è rebase e forzare la spinta. Storia pulita ma riscritta


1
Grazie @achille, questo è stato davvero il problema dalla mia parte. Dopo aver disabilitato l'unione di squash, viene risolto.
Ashvin777,

0

Non sono esattamente sicuro della teoria alla base di questo. Ma l'ho preso diverse volte e sono riuscito a risolvere il problema nel modo seguente.

git pull --rebase

In questo modo verranno recuperate e unite le modifiche dal ramo master repository originale (se si ha il punto)

Quindi invii forzatamente le modifiche al repository clonato di github (target)

git push -f origin master

Questo assicurerà che il tuo clone github e il tuo repository genitore siano allo stesso livello di commit github e non vedrai alcuna modifica non necessaria tra i rami.


0

Prova i comandi seguenti, uno per uno.

git pull "latest

git reset --hard master

-1

Approccio sicuro se sei troppo preoccupato per rovinare le cose: vai al file e rimuovi manualmente le modifiche, quindi schiaccia con l'ultimo commit usando

git add .  && git commit -a --allow-empty-message -m '' && git reset --soft HEAD~2 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Io non ci sono conflitti, sei a posto!

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.