Cara menggabungkan cabang saat ini ke cabang lain

182

Saya memiliki dua cabang, master dan dev. Saya selalu bekerja pada dev dan hanya memeriksa kode ke cabang master setelah disetujui untuk penggunaan produksi. Ketika saya melakukannya, saya harus melakukan hal berikut:

git checkout master
git merge dev
git checkout dev

Itu sangat bertele-tele, dan karena saya sering melakukannya, saya ingin menguranginya. Apakah ada satu perintah git yang bisa saya gunakan untuk menggabungkan dari dev cabang saya saat ini ke master cabang lain tanpa harus checkout cabang master terlebih dahulu? Sesuatu yang mungkin seperti:

git merge dev to master

akan menjadi hebat. Saya melihat-lihat dokumentasi git dan tidak melihat apa-apa.

Chris
sumber
1
Sudahkah Anda mencoba menggunakan git push untuk ini?
Jay Sullivan
11
Ada apa dengan saran push? Itu untuk memperbarui remote , bukan penggabungan dalam repositori sendiri.
Cascabel
4
Jefromi benar, push tidak berguna di sini. Saya berbicara tentang cabang lokal lain, bukan cabang terpencil.
Chris
2
Bahkan lebih buruk adalah ketika Anda memiliki perubahan lokal tidak terikat: git stash, git checkout master, git merge dev, git checkout dev, git stash pop.
Mu Mind
2
Pertanyaan yang bagus Saya menginginkan ini juga karena saya ingin menarik cabang yang tidak ada. Saya ingin menghindari beralih cabang karena saya memiliki proses yang memulai membangun jika ada file di pohon kerja berubah.
Kelvin

Jawaban:

94

1. Tambahkan alias jarak jauh untuk repositori lokal Anda, mis:

git remote add self file:///path/to/your/repository

(Atau di windows git remote add self C:\path\to\your\repository)

2. Dorong ke remote sendiri, mis:

git push self dev:master
nol
sumber
2
Submodules! Ini tidak hanya memecahkan masalah pertanyaan yang diajukan, tetapi juga memecahkan masalah beralih cabang ketika hanya memiliki submodule. Tip yang bagus!
eddiemoya
2
+1 Ini kreatif, dan tidak menyentuh pohon kerja sama sekali. Hanya klarifikasi: /path/to/your/repositoryini adalah jalur ke pohon kerja Anda, yaitu jangan sertakan .gitdirektori. Juga, ini harus dilakukan tanpa mengatakan: remote harus diperbarui jika Anda memindahkan repo.
Kelvin
Saya tidak beruntung mendapatkan ini berfungsi di windows ... git remote add self file:///c/projectshanya datang kembali dengan catatan penggunaan
Maslow
2
@ JosephK.Strauss Pertama-tama Anda bisa menggabungkan master ke cabang saat ini ( dev) dan kemudian mendorong komit gabungan menggunakan git push self dev:master.
Leonid Shvechikov
4
Kenapa dengan remote alias? .bekerja dengan baik bagi saya: git push . head:master.
geon
60

Jawaban terpilih tertinggi saat ini oleh @zerome adalah jawaban yang bagus, tetapi agak tidak perlu.

Di dasar git repo Anda, Anda bisa melakukan ini: git push . dev:master

Solusi yang lebih umum yang akan bekerja di mana saja di pohon adalah:

git push $(git rev-parse --show-toplevel) dev:master
Kevin Lyda
sumber
3
git push . dev:mastermenyederhanakan hidup saya! Jawaban terbaik sejauh ini, terima kasih
Jeremy Belolo
Anda akan mendorong master gabungan ke repositori jarak jauh seperti github? simpan langkah dengan melakukangit push origin dev:master
Alex R
1
Apakah mungkin untuk meniru merge --no-ffperilaku dengan ini?
exhuma
1
Saya mendapatkan nama jarak jauh tidak valid "." di Windows. Apakah saya masih perlu melakukannya git remote add self file:///myRepo?
Kiewic
1
Tapi ini tidak benar-benar melakukan penggabungan ... Ini akan berhasil jika dev lebih unggul dari master, tetapi bagaimana jika tidak?
Thomas Levesque
44

Taruhan terbaik Anda adalah menggunakan alias, yang ditempatkan di gitconfig global Anda ( ~/.gitconfig):

[alias]
    merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"

sehingga Anda dapat menjalankannya dari repositori apa pun sebagai

git merge-to master dev
Cascabel
sumber
3
Apa yang akan terjadi jika penggabungan tidak otomatis, tetapi memerlukan resolusi gabungan? (Dalam hal ini saya berasumsi tidak ada pekerjaan yang dilakukan pada master, sehingga tidak akan terjadi, tapi tetap saja) ...
Stein G. Strindhaug
@ Sein: Karena saya menggunakan &&, tidak ;, itu akan gagal penggabungan, dan tidak mencoba untuk beralih kembali. Semoga pengguna cukup pintar untuk melihat pesan "gagal digabung" dan menanganinya.
Cascabel
6
Saya lebih suka merge-to = "!f() { export tmp_branch=cabang git ini | grep '*' | tr -d '*' ; git checkout $1 && echo git merge $tmp_branch && echo git checkout $tmp_branch; unset $tmp_branch; }; f", itu mari saya tidak perlu mengetik di cabang saya saat ini, jadi jika saya ingin menggabungkan devke dalam masterdan aku di devsaat aku hanya mengetikgit merge-to master
Steve
2
Versi yang lebih baik dengan backticks yang benar dan tanpa gema:merge-to = "!f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '`; git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset $tmp_branch; }; f"
Simon Epskamp
2
perintah unset tidak benar. fixed adalah: merge-to = "! f () {export tmp_branch = git branch | grep '* ' | tr -d '* '; git checkout $ 1 && git merge --no-ff $ tmp_branch && git checkout $ tmp_branch; unset tmp_branch;}; f"
sassman
38

Sedikit modifikasi dari Jefromi alias yang tidak mengharuskan Anda mengetikkan cabang saat ini.

Jadi Anda menggunakannya seperti: git merge-to dev.

Ini akan beralih ke devcabang, menggabungkannya dengan CURRENT dan kemudian akan beralih kembali.

Misalnya, dengan asumsi Anda berada di mastercabang, itu akan menggabungkan master menjadi dev dan Anda masih akan menjadi master.

Itu pasti pergi ke dotfiles saya :)

[alias]
  merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"
Dmytrii Nagirniak
sumber
6

Ini sudah tua, tapi ...

Menggabungkan solusi dari @ kevin-lyda dan @ dmytrii-nagirniak di atas. alias ini menggabungkan cabang saat ini ke cabang yang ditentukan. Ia menggunakan metode remote dengan dan menggunakan perintah git untuk mendapatkan konteks.

[alias]
    merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:$1; } && gitmergeto"

Untuk digunakan seperti:

git merge-to other-branch-name
tField
sumber
4

Untuk menggabungkan cabang saat ini ke cabang lain tanpa memeriksa cabang lainnya:

Penggabungan maju cepat

Ini sangat mudah. Menurut definisi, gabungan maju-cepat berarti penunjuk cabang dipindahkan di depan di pohon komit. Jadi yang perlu Anda lakukan hanyalah mensimulasikan bahwa:

git branch -f master dev

Peringatan: Ini mengasumsikan bahwa mastermenunjuk ke komit yang juga di devcabang atau cabang lainnya. Jika tidak, Anda berisiko kehilangan pekerjaan! Tidak seperti git mergeyang akan membuat komit gabungan (atau mengeluh) ketika fast-forward tidak mungkin, metode ini secara diam-diam memaksa penunjuk cabang untuk menunjuk ke komit lain.

Ini juga mengasumsikan Anda satu-satunya yang mengerjakan repo, dan / atau Anda tahu apa yang Anda lakukan.

Kiat: Jika Anda melakukan git fetchdan memiliki komitmen baru origin/master, Anda dapat memindahkan mastercabang tanpa memeriksa menggunakan:

git branch -f master origin/master

Gabungkan melalui gabungkan komit

Ini tidak selalu memungkinkan. Untuk membuat komit gabungan, Anda harus melakukan operasi gabungan. Dan untuk melakukan operasi penggabungan, Anda harus memiliki komit di cabang lain yang tidak ada di cabang saat ini.

Jika Anda memiliki komitmen di mastercabang yang tidak ada di devcabang, Anda dapat:

Penafian: Ini hanyalah bukti konsep, hanya untuk menunjukkan kadang - kadang mungkin untuk melakukan penggabungan ke cabang lain tanpa memeriksa. Jika Anda ingin menggunakannya setiap hari, Anda mungkin ingin membuat alias untuk itu menggunakan pengalihan shell atau membuat skrip shell untuk itu. Kemudian lagi, Anda juga dapat membuat skrip shell untuk proses yang lebih pendek seperti ditunjukkan dalam pertanyaan.

git checkout -b temp
git merge --no-ff -e master
git branch -f master temp
git checkout dev
git branch -D temp

Penjelasan:

  1. Lihatlah cabang sementara yang menunjukkan komit yang sama dengan cabang saat ini.
  2. Gabungkan masterke cabang sementara dan luncurkan editor pesan komit. Jika Anda ingin komit gabungan terlihat seperti Anda telah menggabungkan devcabang master, edit dari ini:

    Merge branch 'master' into temp
    

    untuk ini:

    Merge branch 'dev'
    

    Kiat: Anda bisa menggunakan -m "Merge branch 'dev'"alih-alih -elebih cepat.

  3. Perbarui masterpenunjuk cabang untuk menunjuk ke komit gabungan.
  4. Lihatlah devrantingnya.
  5. Hapus paksa cabang sementara.

Ini masih menyentuh pohon kerja Anda, tetapi minimal ya. Itu tidak memutar kembali pohon sampai ke keadaan asli masterhanya untuk membawa perubahan pengembangan sekali lagi. Beberapa mungkin tidak peduli, tetapi bagi yang lain mungkin penting.

ADTC
sumber
1

Sering kali Anda berasal dari cabang yang ingin Anda gabungkan dengan cabang saat ini. Dalam hal ini Anda dapat melakukan:

git co - && git merge @{-1}

sebagai contoh:

git checkout somebranch      // (while on master)

// add some commits

git co - && git merge @{-1}  // will merge somebranch into master
Ikat aku
sumber
1

Solusi saya mirip dengan jawaban lain, dengan perbedaan-perbedaan berikut:

  • fungsi ini dibagi menjadi beberapa baris untuk dibaca
  • fungsi memanggil set -exsehingga setiap perintah dicetak dan jika fungsi gagal segera keluar
  • alias meneruskan argumennya kecuali yang pertama (cabang target) ke git merge
  • fungsi ini mencakup perintah nol : git mergeyang memastikan penyelesaian-tab bekerja dengan beberapa pengaturan shell (mis. gitfastdari oh-my-zsh)
[alias]
  merge-to = "!f() { : git merge ; \
      set -ex ; \
      local this=$(git rev-parse --abbrev-ref HEAD) ; \
      local target=$1 ; \
      shift ; \
      git checkout $target ; \
      git merge $this \"$@\" ; \
      git checkout $this ; \
    } ; f"
artm
sumber