git pull VS git fetch Vs git rebase


294

Un'altra domanda detta git pullè come un git fetch+ git merge.

Ma qual è la differenza tra git pullVS git fetch+ git rebase?


2
qualcuno dovrebbe ripulire il link ... e sono stupito da quanti voti ha ottenuto quell'altra domanda.
xenoterracide,

13
@xeno: penso che sia solo un conteggio di quante persone fanno "Ho avuto anche questa domanda"
bobobobo,

45
Un giorno troverò il tempo di leggere davvero la documentazione git, ma fino ad allora aggiungerò i miei voti a questo tipo di domande
Eran Medan,

Risposte:


336

Dovrebbe essere abbastanza ovvio dalla tua domanda che in realtà stai solo chiedendo della differenza tra git mergee git rebase.

Quindi supponiamo che tu sia nel caso comune: hai fatto un po 'di lavoro sul tuo ramo principale e tiri fuori da quello di origine, che ha anche fatto un po' di lavoro. Dopo il recupero, le cose sembrano così:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

Se ti unisci a questo punto (il comportamento predefinito di git pull), supponendo che non ci siano conflitti, finisci con questo:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

Se d'altra parte hai fatto il rebase appropriato, finiresti con questo:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

Il contenuto del tuo albero di lavoro dovrebbe finire lo stesso in entrambi i casi; hai appena creato una storia diversa che porta ad essa . Il rebase riscrive la tua storia, facendola sembrare come se ti fossi impegnata in cima al nuovo ramo principale di origine ( R), invece che nel punto in cui avevi commesso ( H). Non dovresti mai usare l'approccio rebase se qualcun altro ha già estratto dal tuo ramo principale.

Infine, tieni presente che puoi effettivamente impostare git pullun determinato ramo per usare rebase invece di unire impostando il parametro config branch.<name>.rebasesu true. Puoi anche farlo per un singolo pull usando git pull --rebase.


39
Cosa succederebbe se ti dovessi ribattere dopo che qualcuno si era già ritirato dal tuo ramo principale? Ciò spezzerebbe il pronti contro termine?
Didier A.

12
Come fai a sapere se qualcuno si è ritirato dal tuo ramo principale?
Frank,

29
Se non sai per certo che qualcuno non l'ha fatto , dovresti presumere che lo abbiano fatto.
Chris Down,

4
Stavo solo pensando che, a meno che tu non stia spingendo anche cambiamenti in un posto diverso da origin / master, non vedo mai imbattersi nel problema di qualcun altro che ha tirato i cambiamenti in questione, perché se hai già spinto questi cambiamenti in origin / maestro, non ci sarebbe nulla da rifare in primo luogo. Mi sembra che l'avvertimento sia importante solo nei casi in cui hai qualcosa di più complesso di X -> origin / X, ma potrei sbagliarmi. Se qualcuno sa di uno scenario che sto trascurando, per favore condividi.
Neverfox,

1
@SteveChambers No, non è questo il risultato. Le linee rappresentano semplicemente la provenienza del commit, ovvero A è il genitore di B. Non ci sono implicazioni sul fatto che Q o B sia stata la prima volta in tempo. Tutte queste operazioni si basano su grafici di commit, non sul tempo. Rebase semplicemente trapianta alcuni commit, con il risultato che ho mostrato indipendentemente dai timestamp di commit.
Cascabel,

9

TLDR:

git pullè come correre git fetchallora git merge
git pull --rebaseè come git fetchalloragit rebase

In risposta alla tua prima affermazione,

git pullè come un git fetch+ git merge.

"Nella sua modalità predefinita, git pull è una scorciatoia git fetchseguita da git mergeFETCH_HEAD" Più precisamente, git pullviene eseguito git fetchcon i parametri indicati e quindi chiama git mergeper unire le teste di ramo recuperate nel ramo corrente "

(Rif: https://git-scm.com/docs/git-pull )


Per la tua seconda affermazione / domanda:

'Ma qual è la differenza tra git pullVS git fetch+ git rebase'

Ancora una volta, dalla stessa fonte:
git pull --rebase

"Con --rebase, esegue git rebase invece di git merge."


Ora, se volessi chiedere

'la differenza tra mergee rebase'

anche qui viene fornita una risposta:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(la differenza tra l'alterazione del modo in cui viene registrata la cronologia delle versioni)


2
Vorrei menzionare che "git pull --rebase" è come "git fetch then git rebase" il più delle volte - ma non sempre. In alcune situazioni, "git pull --rebase" fa un po 'di più. Vedi questo esempio spesso referenziato qui: gitolite.com/git-pull--rebase
Daniel K.

1
Grazie mille per la tua risposta Comprendo davvero come git fetch + git rebasefunzionano i comandi da ora. Non ci sono più o meno conflitti sul nostro git tree da ora :)
Travis Le
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.