Menggabungkan 2 cabang menjadi satu di GIT

132

Saya baru saja mulai menggunakan GIT dan menurut saya luar biasa, namun saya agak bingung tentang apa yang dilakukan mergeperintah tersebut.

Katakanlah kita memiliki proyek yang bekerja di cabang "A".

Saya pulang dan membuat perubahan pada cabang ini dan menyimpannya sebagai "B". Programmer lain membuat perubahan ke "A" dan menyimpannya sebagai "C".

Apakah ada cara untuk menggabungkan dua cabang "B" dan "C" bersama-sama, lalu mengkomit perubahan sebagai cabang baru, katakan "D"?

Atau saya kehilangan inti dari 'merge'?

kotor
sumber
tidak perlu 'menyimpan perubahan' di cabang lain.
buat
Saya tidak mengikuti. A akan ada di komputer lokal saya, dev1 akan memiliki salinan A di komputernya, dan dev2 memiliki salinan A di komputernya. Kedua pengembang membuat perubahan, bagaimana cara menggabungkan perubahan ini?
sinting
lihat < kernel.org/pub/software/scm/git/docs/git-pull.html >. pengembang mungkin perlu mendorong / mengunggah repositori mereka ke suatu tempat terlebih dahulu
knittl

Jawaban:

197

merge digunakan untuk menyatukan dua (atau lebih) cabang.

sedikit contoh:

# 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"

jadi sekarang ada tiga cabang terpisah (yaitu AB dan C) dengan kepala berbeda

untuk mendapatkan perubahan dari B dan C kembali ke A, checkout A (sudah dilakukan dalam contoh ini) lalu gunakan perintah merge:

# create an octopus merge
$ git merge B C

riwayat Anda akan terlihat seperti ini:

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

jika Anda ingin menggabungkan lintas repositori / batas komputer, lihat git pullperintahnya, misalnya dari pc dengan cabang A (contoh ini akan membuat dua komit baru):

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C
rajutan
sumber
itu berarti bahwa kedua cabang mengubah bagian kode yang sama. perbaiki konfliknya, git add conflicting_filesdan kemudiangit commit
knittl
Ucapkan file di A berisi kata "hello", A mengubahnya menjadi "HELLO" dan B mengubahnya menjadi "Hello world". Apa hasil dari menggabungkan file-file ini?
sinting
Ups, maksud saya B mengubahnya dan C mengubahnya.
sinting
hati-hati dengan kata 'amend' yang artinya berbeda di git (mengubah komit yang ada). mengubah file 'halo' menjadi 'HELLO' di satu sisi dan 'Halo Dunia' di sisi lain akan mengakibatkan konflik penggabungan
knittl
19
@dotty: Meskipun git sering kali tampak seperti sihir, ia tidak dapat benar-benar membaca pikiran Anda - jika dua cabang membuat dua perubahan berbeda pada konten yang sama, hanya manusia yang dapat menemukan cara untuk menyatukannya. Itulah yang dimaksud dengan konflik gabungan.
Cascabel
48

Jika Anda ingin menggabungkan perubahan di SubBranch ke MainBranch

  1. Anda harus berada di MainBranch git checkout MainBranch
  2. lalu jalankan perintah merge git merge SubBranch
Mohamed Shaban
sumber
2
@luckytaxi: Setuju, terkadang kurang lebih
Marcelo Scofano
Bisakah saya membatalkan ini?
Yohanelly
0

Kasus: Jika Anda perlu mengabaikan komit gabungan yang dibuat secara default , ikuti langkah-langkah berikut.

Katakanlah, cabang fitur baru diperiksa dari master yang sudah memiliki 2 komit,

  • "Menambahkan A", "Menambahkan B"

Checkout a new feature_branch

  • "Menambahkan C", "Menambahkan D"

Cabang fitur kemudian menambahkan dua komit ->

  • "Menambahkan E", "Menambahkan F"

masukkan deskripsi gambar di sini

Sekarang jika Anda ingin menggabungkan perubahan feature_branch ke master, lakukan git merge feature_branchduduk di master.

Ini akan menambahkan semua komit ke dalam cabang master (4 di master + 2 di feature_branch = total 6) + komit tambahan melakukan sesuatu seperti 'Merge branch 'feature_branch''saat master terpecah .

Jika Anda benar-benar perlu mengabaikan komit ini (yang dibuat di FB) dan menambahkan seluruh perubahan yang dibuat di feature_branch sebagai komit tunggal seperti 'Integrated feature branch changes into master', Jalankangit merge feature_merge --no-commit .

Dengan --no-commit, ini melakukan penggabungan dan berhenti sebelum membuat komit gabungan, Kita akan memiliki semua perubahan yang ditambahkan di cabang fitur sekarang di master dan mendapatkan kesempatan untuk membuat komit baru sebagai milik kita.

Baca lebih lanjut di sini: https://git-scm.com/docs/git-merge

kisHoR
sumber