Quando devo fare "git pull", prima o dopo "git add, git commit"?


93

Qual è il modo giusto?

git add foo.js
git commit foo.js -m "commit"
git pull
git push

O

git pull
git add foo.js
git commit foo.js -m "commit"
git push

O

git add foo.js
git pull
git commit foo.js -m "commit"
git push

UPD:

Ho dimenticato di dire che in questo caso uso git addper mettere in scena un file tracciato e modificato . Non includere un file nuovo di zecca nel repository. Questo cambia un ordine dei comandi?


Risposte:


95

Penso che il modo migliore per farlo sia:

Conserva le tue modifiche locali:

git stash

Aggiorna il ramo al codice più recente

git pull

Unisci le modifiche locali al codice più recente:

git stash apply

Aggiungi, conferma e invia le tue modifiche

git add
git commit
git push

Nella mia esperienza questo è il percorso per la minor resistenza con Git (sulla riga di comando comunque).


4
Puoi spiegare perché è meglio? Quali problemi evita? In particolare, perché è meglio di un semplice commit> pull> push? (Penso che questa potrebbe essere la risposta migliore, ma al momento non ho abbastanza informazioni per essere considerata una buona risposta.)
dallin

7
Forse questo era troppo aneddotico, ma ho sempre trovato questo approccio (sulla riga di comando piuttosto che con qualcosa come sourcetree) molto più semplice. Fare un commit e poi tirare, mentre si lavora in un grande team, porta sempre a grandi conflitti di unione poiché git non era molto bravo a unire le mie modifiche a un file con il file in arrivo. Nascondendo, mi ha permesso di estrarre le nuove modifiche e quindi utilizzare il codice aggiornato come base per aggiungere le mie modifiche a. Affrontare i conflitti è stato più facile in quanto mi erano più chiari (poiché i miei cambiamenti ora erano i conflitti). Con il senno di poi, forse è stato più facile per la mia situazione.
johnjo

1
Quindi suona come una cosa tipo "Come si mangia un elefante? Un morso alla volta". cioè suddividere il processo in pochi passaggi in più per semplificare le unioni in modo da avere meno modifiche e possibilmente più chiare. Ha senso.
dallin

Git add è necessario qui? Se tutti i file sono già stati aggiunti allo staging!
Sharp Edge

E se non lo usi git stash?
Aaron Franke

76

pull = fetch + merge.

Devi impegnarti in ciò che hai fatto prima di unirti.

Quindi tira dopo il commit.


8
Questo significherebbe che finirai per fare un commit extra per ogni commit che fai e rendere il repo sciatto? Anche il tuo messaggio di commit iniziale finisce ogni volta seguito da un commento di unione. In tal caso, sarei propenso a utilizzare il metodo stash menzionato di seguito da @johnjo.
MondayPaper

3
@DanielM Sì, c'è un commit extra per l'unione (con un messaggio di commit predefinito esplicito). Questa è comunque una buona cosa perché ti permette di controllare il tuo ultimo commit o l'ultimo commit del tuo collega o il merge commit. Se vuoi evitarlo e se vuoi inserire i tuoi commit dopo i commit del tuo collega, puoi farlo rebaseinvece di merge. Puoi farlo con git commit && git rebaseo git pull --rebase.
Arnaud Denoyelle

Grazie per il suggerimento, @Arnaud. Dopo aver letto molte diverse domande SO, questo commento lo ha fatto. La mia opzione preferita quando i colleghi stanno lavorando su file diversi è git pulldopo aver messo in scena le mie modifiche, poiché lo trovo il più naturale. Anche se mi rendo conto che funzionano molti flussi di lavoro diversi (anche lo stash è bello), quindi è probabilmente una questione di gusti.
nipote

51

Suggerirei di eseguire il pull dal ramo remoto il più spesso possibile per ridurre al minimo fusioni di grandi dimensioni e possibili conflitti.

Detto questo, sceglierei la prima opzione:

git add foo.js
git commit foo.js -m "commit"
git pull
git push

Effettua il commit delle modifiche prima del pull, in modo che i tuoi commit vengano uniti alle modifiche remote durante il pull. Ciò può provocare conflitti che puoi iniziare a gestire sapendo che il tuo codice è già stato eseguito il commit se qualcosa va storto e devi interrompere l'unione per qualsiasi motivo.

Sono sicuro che qualcuno non sarà d'accordo con me, però, non penso che ci sia un modo corretto per fare questo flusso di unione, solo ciò che funziona meglio per le persone.


1
Potresti vedere il mio aggiornamento alla domanda? Ho dimenticato di spiegare a cosa git addserve esattamente nel mio esempio.
Verde

1
Non dovrebbe fare alcuna differenza se si tratta di un nuovo file o di un file tracciato / modificato. Ancora impegnati e poi tira.
Jasarien

7

Penso che git pull --rebasesia il modo più pulito per impostare i commit recenti a livello locale sopra i commit remoti che non hai a un certo punto.

Quindi in questo modo non devi tirare ogni volta che vuoi iniziare a fare modifiche.


Questo è quello che faccio anche io, ma solo per sottolineare che ci sono sicuramente due principali scuole di pensiero su questo (incentrate sul fatto che sia meglio risolvere i conflitti tra i singoli commit, o una volta nel commit di unione) con Linus stesso nel campo di unione . Per fortuna lo strumento in sé non è supponente, quindi
usalo

3

Vuoi che la tua modifica si trovi in ​​cima allo stato corrente del ramo remoto. Quindi probabilmente vuoi tirare subito prima di impegnarti. Dopodiché, invia nuovamente le modifiche.

I file locali "sporchi" non sono un problema fintanto che non ci sono conflitti con il ramo remoto. In caso di conflitti, tuttavia, l'unione fallirà, quindi non vi è alcun rischio o pericolo nel tirare prima di eseguire modifiche locali.


1
Non funzionerà, come ha detto Arnaud, il pull richiede che tu effettui prima le modifiche.
Jasarien

Il mio git sembra felice di tirare con molti cambiamenti locali. Ovviamente, se gli stessi file vengono modificati sul ramo remoto, la parte di unione del pull fallisce. Per creare un conflitto di unione appropriato, dovrei prima eseguire il commit, certo. Quindi, se l'insieme di file modificati localmente e in remoto è disgiunto, il pull e il commit vanno bene. Altrimenti, git non tirerà. Nessun danno da fare provando.
AlexE

Questa è la mia opzione preferita quando le persone lavorano su file diversi e la trovo la più naturale.
nipote
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.