Come fare in modo che git merge gestisca le modifiche senza commit al mio albero di lavoro?

StackOverflow https://stackoverflow.com/questions/813822

  •  03-07-2019
  •  | 
  •  

Domanda

Un collaboratore e io stiamo entrambi lavorando al ramo principale al momento. Ho un po 'di codice nel mio albero di lavoro che non voglio impegnare (istruzioni di debug e simili). Ora se commette modifiche ad alcuni di quegli stessi file, non posso unirli:

$ git merge origin/master
Updating 1b8c5c6..eb44c23
error: Entry 'blah.java' not uptodate. Cannot merge.

Proveniente da uno sfondo di sovversione, sono abituato a far fondere automaticamente il mio albero di lavoro quando estraggo le modifiche dal repository e, in caso di conflitti, le risolvo manualmente.

Il modo più veloce che ho trovato per farlo in git è:

$ git stash
$ git merge origin/master
$ git stash pop

Essenzialmente, rimuovendo le mie modifiche non impegnate, facendo l'unione e quindi riapplicando le modifiche. Come posso dire a merge di unire automaticamente il mio albero di lavoro con le modifiche che sto cercando di inserire?

È stato utile?

Soluzione

Per quanto ne so, il meglio che puoi fare è quello che hai già con git stash . Anch'io trovo strano che l'unione voglia trattare solo con alberi puliti.

Altri suggerimenti

Dimentica tutto ciò che hai imparato dalla sovversione.

Commetti sempre prima di introdurre modifiche esterne.

Immagina di avere un albero prevalentemente funzionante, forse non perfetto, ma stai facendo progressi. Quindi vai a fare un'unione e il codice che stai portando in un caos devastato (era il buggy stesso, troppi conflitti da affrontare, ecc ...). Non sarebbe bello se potessi semplicemente annullarlo?

Se ti impegni, puoi farlo. Se non lo fai, soffrirai e basta.

Ricorda: ciò che commetti non deve essere ciò che spingi, ma ciò che non commetti può facilmente perdere.

Fai semplicemente la cosa facile e sicura e commetti in anticipo e commetti spesso.

  • Se il lavoro locale è senza impegno
    • E hai introdotto file completamente nuovi che non esistono nel ramo remoto:
    • O i file interessati dal tuo lavoro locale si sovrappongono a ZERO con i file interessati dalle modifiche che devi estrarre dal telecomando:
      • Sei fortunato: git pull " funzionerà solo "
    • In caso contrario:
      • Se le modifiche locali NON si sovrappongono alle modifiche che stai estraendo:
        • git stash funzionerà:
          • git stash save
          • git pull
          • git stash pop
      • Se le tue modifiche locali hanno QUALCHE sovrapposizione con le modifiche che stai estraendo:
        • git stash richiederà la risoluzione manuale dei conflitti:
          • git stash save
          • git pull
          • git stash pop
          • risolvi i conflitti di unione
          • git reset
          • git stash drop
  • Se viene eseguito il lavoro locale
    • E i file interessati dal tuo lavoro locale si sovrappongono a ZERO con i file interessati da
      • Sei fortunato: git pull " funzionerà solo "
      • Tuttavia: git pull --rebase " funzionerà ancora meglio " a causa di una storia più pulita
      • non esiste un commit di unione; le modifiche verranno eseguite dopo le modifiche a monte
    • In caso contrario:
      • git pull richiederà la risoluzione manuale dei conflitti:
        • git pull
        • risolvi i conflitti di unione
        • git aggiungi FILE per ogni FILE in conflitto
        • git commit
      • git pull --rebase potrebbe ancora "funzionare ancora meglio" a causa di una storia più pulita
        • tuttavia, risolvere i conflitti di unione potrebbe essere molto più difficile

Per una spiegazione dettagliata, consultare: https://happygitwithr.com/pull-tricky.html

Non puoi dire a git merge di unire le modifiche ai file che hanno delle modifiche rispetto al tuo repository locale. Questo ti protegge dal perdere le modifiche in quei momenti in cui una fusione va male.

Con l'approccio CVS e SVN alla fusione, se non hai copiato manualmente i tuoi file prima dell'aggiornamento e li ha mescolati al loro interno, devi riedificarli manualmente per tornare a un buono stato.

Se esegui il commit delle modifiche o le nascondi prima di eseguire l'unione, tutto è reversibile. Se l'unione non va bene, puoi provare diversi modi per farlo funzionare e andare con quello che funziona meglio.

Se si commettono modifiche sperimentali o di debug, è possibile utilizzare git rebase per spostarle dopo le commit ottenute tramite git merge per semplificare la rimozione di o per evitare di spingerli accidentalmente in un repository.

Nota che l'uso di git rebase su un ramo che hai inviato a un repository condiviso provocherà dolore per tutti coloro che stanno eseguendo il pull da quel repository.

In questi casi preferisco usare git stash , ma lo uso solo se l'unione modifica i file che ho modificato e non eseguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top