Unire 2 rami insieme in GIT


132

Ho appena iniziato a usare GIT e penso che sia meraviglioso, tuttavia sono un po 'confuso su ciò che fa il mergecomando.

Supponiamo di avere un progetto funzionante nel ramo "A".

Torno a casa, apporto modifiche a questo ramo e lo salvo come "B". Un altro programmatore apporta modifiche a "A" e lo salva come "C".

C'è un modo per unire i due rami "B" e "C" insieme, quindi eseguire il commit delle modifiche come un nuovo ramo, ad esempio "D"?

O mi manca il punto di "fusione"?


non è necessario "salvare le modifiche" in un altro ramo. lavorare una A e poi unire insieme quelle diverse A
— lavorate a maglia il

Io non seguo A sarebbe sul mio computer locale, dev1 avrebbe una copia di A sul suo computer e dev2 ha una copia di A sul suo computer. Entrambi gli sviluppatori apportano modifiche, come faccio a unire queste modifiche insieme?
— dotty

vedere < kernel.org/pub/software/scm/git/docs/git-pull.html >. gli sviluppatori probabilmente devono prima spingere / caricare il loro repository da qualche parte
— knittl il

Risposte:


197

merge viene utilizzato per riunire due (o più) rami.

un piccolo esempio:

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

quindi ora ci sono tre rami separati (cioè AB e C) con teste diverse

per riportare le modifiche da B e C ad A, controlla A (già fatto in questo esempio) e poi usa il comando di unione:

# create an octopus merge
$ git merge B C

la tua cronologia sarà quindi simile a questa:

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

se vuoi unire i confini del repository / computer, dai un'occhiata al git pullcomando, ad esempio dal pc con il ramo A (questo esempio creerà due nuovi commit):

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C

ciò significa che entrambi i rami hanno cambiato lo stesso pezzo di codice. sistemare i conflitti git add conflicting_filese poigit commit
— Knittl

Diciamo che il file in A conteneva la parola "ciao", la A lo ha modificato in "CIAO" e B lo ha modificato in "Ciao mondo". Quale sarebbe il risultato dell'unione di questi file?
— dotty

Ops, voglio dire che B l'ha modificato e C l'ha modificato.
— dotty

fai attenzione con la parola 'modify' che significa qualcosa di diverso in git (cambiare i commit esistenti). la modifica di un file "ciao" in "CIAO" su un lato e "Hello World" sull'altro si tradurrà in un conflitto di unione
— Knittl

19
@dotty: sebbene git spesso sembri magico, in realtà non è in grado di leggere la tua mente: se due rami apportano due modifiche diverse allo stesso contenuto, solo un essere umano può capire come riconciliarli. Ecco cos'è un conflitto di unione.
— Cascabel

48

Se vuoi unire le modifiche in SubBranch a MainBranch

  1. dovresti essere su MainBranch git checkout MainBranch
  2. quindi eseguire il comando di unione git merge SubBranch

2
@luckytaxi: d'accordo, a volte meno è meglio
— Marcelo Scofano

Posso annullare questo?
— Yohanelly

0

Caso: se devi ignorare il commit di unione creato per impostazione predefinita , segui questi passaggi.

Supponiamo che un nuovo ramo di funzionalità venga estratto dal master con già 2 commit,

  • "Aggiunto A", "Aggiunto B"

Checkout a new feature_branch

  • "Aggiunta C", "Aggiunta D"

Feature branch aggiunge quindi due commit ->

  • "E aggiunta", "F aggiunta"

inserisci qui la descrizione dell'immagine

Ora se vuoi unire le modifiche di feature_branch al master, fai git merge feature_branchseduto sul master.

Questo aggiungerà tutti i commit nel ramo master (4 in master + 2 in feature_branch = totale 6) + un commit di unione extra qualcosa come 'Merge branch 'feature_branch''quando il master è divergente .

Se hai davvero bisogno di ignorare questi commit (quelli fatti in FB) e aggiungere tutte le modifiche apportate in feature_branch come un singolo commit come 'Integrated feature branch changes into master', Esegui git merge feature_merge --no-commit.

Con --no-commit, esegue l'unione e si ferma appena prima di creare un commit di unione, avremo tutte le modifiche aggiunte nel ramo delle funzionalità ora in master e avremo la possibilità di creare un nuovo commit come nostro.

Leggi qui per ulteriori informazioni: https://git-scm.com/docs/git-merge

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.