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.