Come faccio a impedire a un automerge utilizzando Git?

Sto cercando di unire un locale di ramo in ramo master senza avere Git per fare un automerge. Vorrei “scegliere” quello che vorrei essere uniti nel master.

Quando ho l’uso di Git difftool comando, io sono in grado di diff e selezionare quello che voglio essere aggiunti nel branch master. Ma poi quando faccio un merge, perdo ciò che ho scelto prima perché Git fare un automerge. Posso eseguire il commit delle modifiche in master prima dell’unione, ma, così facendo, sembra innaturale.

E di Git mergetool è disponibile solo quando ci sono conflitti da un’unione. Ma se Git fa un automerge quindi di solito non ci sono conflitti, così sono in grado di eseguire il mergetool comando.

Aggiornamento:

Sto cominciando a pensare che quello che sto cercando di realizzare è cattiva pratica o non è possibile. Che è, per unire un ramo e solo di tipo merge che cosa ho bisogno da diffing. E in aggiunta, per avere questo riflette nella storia. In ogni caso, la domanda che ho postato emerse durante la sperimentazione con Git.

  • Dove sono queste modifiche “selezione preventiva” provenienti da? Sono le modifiche nel tuo lavoro di albero prima di fare il merge? Stai cercando di unire un ramo e mantenere solo alcune delle modifiche da esso?
  • Jefromi, per rispondere alla tua prima domanda, sono modifiche da diffing il ramo. E ‘ quello che ho detto, secondo comma, prima frase. Una risposta alla tua seconda domanda, sì sono le modifiche che vengono apportate. Ecco perché se faccio un merge (senza commettere prima) vorrei perdere quei diff. E per rispondere alla tua terza domanda, sì. Sto cercando di unire un ramo e mantenere solo alcune delle modifiche da esso scegliendo quello che voglio, utilizzando un diff strumento (es. KDiff3).
  • Con rispetto per il tuo aggiornamento: questa è davvero cattiva pratica se mai intenzione di unire il resto di quel ramo. Una volta che si registra un merge, è un’indicazione che avete il contenuto dell’unita commit(s). Si può certamente fare quello che hai iniziato a fare, anche se – applicare in modo selettivo alcune linee di diff con il ramo, e di impegnarsi a coloro che sono direttamente (non come unione). Che dovrebbe (si spera) non sfociare in conflitti, se poi unire l’intero argomento.
  • Si prega di accettare una risposta qui.
InformationsquelleAutor marckassay | 2011-03-08



4 Replies
  1. 76

    Si sta tentando di ignorare Git da farsi coinvolgere nel processo di unione e di apprendere ogni riga di ogni file modificato per essere unite. Questa non e ‘ la stessa git cherry-pick. Né git merge --no-commit, etc. aiuto. È necessario fare:

    $ git checkout master
    $ git difftool -t kdiff3 local-branch HEAD
    

    In KDiff3 finestra, la mano sinistra (A) è locale-filiale di e il lato destro (B) è branch corrente (master).

    Selezionare Merge | Merge Current File dal menu o premere il colorato a forma di diamante icona con lo stesso titolo).

    Vi verrà mostrato un diff e i conflitti (se possibile) per ogni file. E si avrà la possibilità di scegliere il lato destro o sinistro (A o B), o entrambi, e/o di modificare manualmente il file unito.

    In un’altra nota, qualcosa mi dice che si hanno più problemi con il vostro flusso di lavoro.

    • Scegliere LA risposta!!!
    • -t kdiff3 non è necessaria o utile se avete già impostato correttamente il tuo difftool utilizzando git config.
    • Non c’è nulla di necessariamente sbagliato con OP del flusso di lavoro. Egli potrebbe essere solo di fronte a un complicato unione. Git piace decidere che alcune unioni sono “sicuro” e di eseguire automaticamente quando sono veramente al sicuro.
    • Questo non è un corretto flusso di lavoro in git manualmente spostare il contenuto da un ramo all’altro, su base regolare. Questo farà in entrambi i rami divergenti e fare in modo che git perdere qualsiasi possibilità di tracciare la cronologia delle modifiche in relazione all’altro ramo. Ci sono tuttavia casi in cui si vuole fare questo, questo, e.g il vecchio ramo diventa obsoleto ed è necessario recuperare alcune parti del codice.
    • Grazie @stackzofZtuff per le modifiche.
    • quando si ottiene un conflitto di unione, si sta raccogliendo e scegliendo come bene. Se pensate di raccolta e la scelta è un processo difettoso, non è peggio (e forse meglio) di “sperare per il meglio” auto-merge.
    • Coda ti manca il punto. Quando git fa unire e non ci sono conflitti, non puoi scegliere nulla. git si fonde magicamente il file, che è quello che l’op vuole evitare.
    • Che è l’unione di “direzione” in questa risposta? Non unire master in locale-filiale locale o di ramo in master?
    • Come posso migliorare questo in modo che i nuovi file (creato nel “locale-branch”) sono sempre trasferiti all’unione risultato, bypassando il difftool?
    • L’unione di direzione è local-branch per master
    • Questo funziona bene se faccio il merge dei file che già esistono in entrambi i rami, ma cosa succede se io sono completamente nuovi file nel ramo voglio unire? Se copio il file utilizzando il difftool (io uso bcompare) non sono presi da la temp la directory di lavoro.
    • Sarà necessario copiare manualmente tutti i nuovi file di destinazione. e.g è possibile utilizzare difftool da sola (senza git) di fare una directory confrontare e copiare i file necessari.
    • Su Windows, io uso vsdiffmerge invece di kdiff3.

  2. 17
    git merge --no-commit --no-ff <local-branch>
    

    fa.

    Quando si esegue, le modifiche da local-branch sono applicate, ma non ancora messa in scena.

    Quindi, si potrebbe guardare le modifiche da applicare e  nel caso in cui si desidera prendere tutti  – si applicano con

    git commit -a 
    

    In caso contrario, selezionare il file da prendere, stage con git add e, infine, impegnarsi con git commit. Ripristinare i file indesiderati, quindi con git checkout -- filename.

    • Ho provato il comando e sembra che ha fatto un automerge e messo in scena il file. Dopo aver eseguito il primo comando che ho ricevuto il seguente messaggio: unione Automatica è andato bene; fermato prima di impegnarsi come richiesto
    • Ma si potrebbe quindi git reset HEAD e git add -p per selezionare ciò che si desidera.
    • Per spegnere l’unione iniziale completamente, aggiungere -s ours.
    • Ho voluto realizzare lo stesso obiettivo e, dopo git merge --no-commit --no-ff <local-branch> mi sono imbattuto in un git reset HEAD. In questo modo, tutte le modifiche”, in scena per commettere” è diventato “unstaged”. Ora con git diff posso vedere il differenziale completo, posso add e commit quello che voglio e scartare le modifiche indesiderate
  3. 6

    Posso vedere si potrebbe desiderare di fare questo se non ti fidi di auto-merge, perché due modifiche in luoghi diversi in un file (che sono di fatto su rami diversi) non può causare auto-merge di sollevare un conflitto, ma non può effettivamente lavorare insieme.

    Si può dare un’occhiata a utilizzando un custom unione driver. Questa pagina descrive come andare su di esso.

    Git – come forza di conflitto di unione e unione manuale sul file selezionato

    Un’alternativa potrebbe essere quella di trovare il file che differiscono tra i rami in primo luogo, prima di eseguire la stampa unione, quindi estrarre il file nell’apposito ramo per garantire che si ottiene un pulito unione e funzionale codice che contiene uno o l’altro dei due modifiche.

    git diff --name-only <branch1> <branch2> 
    git checkout <branch1> -- <paths>
    
  4. -1

    Penso che si desidera cherry-pick singole modifiche:

    git checkout master
    git log --reverse --oneline topic ^master
    

    e quindi richiamare git cherry-pick per ogni commit si desidera che il branch master.

    Se le altre modifiche in tema ramo deve essere conservato, si potrebbe anche voler rebase questo ramo superiore del nuovo master:

    git rebase master topic
    
    • Interessante, non ho mai saputo di comando cherry-pick. Speravo di selezionare manualmente un paio di righe di codice da un commit con un diff strumento (es. KDiff3). Sembra che si unisce tutto il commit.
    • Se si git cherry-pick --no-commit; git reset HEAD si potrebbe quindi fase solo quello che si vuole con git add -p.

Lascia un commento