Gabungkan, perbarui, dan tarik keluar cabang Git tanpa menggunakan cek

Saya mengerjakan proyek dengan dua cabang, A dan B. Biasanya saya bekerja di cabang A dan menggabungkan beberapa hal dari cabang B. Untuk penggabungan, saya biasanya melakukan:

 git merge origin/branchB 

Namun, saya juga ingin menyimpan salinan cabang B lokal, karena kadang-kadang saya dapat memeriksa cabang tanpa terlebih dahulu bergabung dengan cabang saya A. Untuk ini, saya akan melakukan:

 git checkout branchB git pull git checkout branchA 

Apakah ada cara untuk melakukan ini dalam satu tim dan tanpa harus berganti cabang bolak-balik? Haruskah saya menggunakan git update-ref untuk ini? Bagaimana?

367
09 июля '10 в 23:32 2010-07-09 23:32 Charles diatur pada 09 Juli '10 pada 23:32 2010-07-09 23:32
@ 10 jawaban

Jawaban singkat

Saat Anda bergabung dengan maju cepat , Anda bisa menggunakannya

 git fetch <remote> <sourceBranch>:<destinationBranch> 

Contoh:

548
18 июля '13 в 15:06 2013-07-18 15:06 jawabannya diberikan oleh user456814 18 Juli '13 pada 15:06 2013-07-18 15:06

Tidak, tidak Untuk menghi>

Namun, jika penggabungan adalah penerusan cepat, Anda tidak perlu memeriksa cabang target, karena sebenarnya Anda tidak perlu menggabungkan apa pun - yang perlu Anda lakukan hanyalah memperbarui cabang untuk menunjuk ke header ref baru. Anda dapat melakukan ini dengan git branch -f :

 git branch -f branch-b branch-a 

branch-b akan diperbarui untuk menunjukkan header branch-a .

Opsi -f berarti --force , yang berarti Anda harus berhati-hati saat menggunakannya. Jangan menggunakannya jika Anda tidak yakin merger akan dipercepat.

72
11 нояб. Jawabannya diberikan Amber 11 Nov. 2010-11-11 20:10 '10 pada 20:10 2010-11-11 20:10

Seperti kata Amber, merger cepat adalah satu-satunya kasus di mana Anda bisa melakukan ini. Penggabungan lain mungkin harus melalui seluruh merger tiga arah, menerapkan perbaikan, menyelesaikan kesepakatan konflik - dan ini berarti bahwa harus ada file.

Saya menggunakan skrip yang saya gunakan untuk ini: melakukan penggabungan cepat, tidak menyentuh pohon kerja (jika Anda tidak bergabung ke HEAD). Agak panjang, karena setidaknya sedikit dapat diandalkan - memeriksa apakah penggabungannya cepat, kemudian mengeksekusinya, tidak memeriksa cabang, tetapi mendapatkan hasil yang sama seperti milik Anda - Anda melihat ringkasan perubahan yang berbeda, tetapi Entri reflog seperti penggabungan maju cepat, bukan "reset" yang Anda dapatkan jika Anda menggunakan branch -f . Jika Anda menyebutnya git-merge-ff dan memasukkannya ke direktori bin, Anda dapat menyebutnya sebagai perintah git merge-ff : git merge-ff .

26
11 нояб. Jawabannya diberikan oleh Jefromi pada 11 November. 2010-11-11 20:40 '10 pada 20:40 2010-11-11 20:40

Anda hanya bisa melakukan ini jika penggabungannya adalah penerusan cepat. Jika ini bukan masalahnya, maka git membutuhkan file untuk diekstraksi sehingga mereka dapat menggabungkannya!

Lakukan ini hanya untuk maju cepat:

10 июля '10 в 3:59 2010-07-10 03:59 Jawaban diberikan oleh Jefromi pada 10 Juli '10 pada 3:59 2010-07-10 03:59

Cara lain yang diakui agak kasar adalah dengan hanya menciptakan kembali cabang:

 git fetch remote git branch -f localbranch remote/remotebranch 

Ini menjatuhkan cabang lokal yang sudah ketinggalan zaman dan membuat u>

10
08 июня '11 в 13:08 2011-06-08 13:08 jawabannya diberikan kkoehne 08 Juni '11 pada 1:08 siang 2011-06-08 13:08

Anda dapat mengkloning repo dan menggabungkan repo baru. Pada sistem file yang sama, ini akan menyebabkan pengikatan yang ketat, tidak menyalin sebagian besar data. Selesai dengan menarik hasilnya ke repo asli.

6
11 нояб. Jawabannya diberikan kepada 11 November. 2010-11-11 21:00 '10 pada 21:00 2010-11-11 21:00

Dalam kasus Anda, Anda dapat menggunakan

 git fetch origin branchB:branchB 

yang melakukan apa yang Anda inginkan (dengan asumsi penggabungannya cepat). Jika cabang tidak dapat diperbarui, karena memerlukan penggabungan intransitif, maka tidak akan berhasil dengan pesan.

Ada beberapa opsi lain yang berguna dalam formulir ini:

 git fetch <remote> <sourceBranch>:<destinationBranch> 

Perhatikan bahwa <remote> bisa menjadi repositori lokal , dan <sourceBranch> bisa menjadi cabang pelacakan. Dengan demikian, Anda dapat memperbarui cabang lokal, bahkan jika itu tidak diverifikasi, tanpa akses ke jaringan .

Saat ini, akses saya ke server hulu adalah melalui VPN lambat, jadi saya secara berkala terhubung, git fetch untuk memperbarui semua konsol, dan kemudian lepaskan. Kemudian, jika, katakanlah, master jarak jauh telah berubah, saya bisa melakukannya

 git fetch . remotes/origin/master:master 

untuk memperbarui master lokal saya dengan aman, bahkan jika saya saat ini memiliki utas lainnya. Tidak diperlukan akses jaringan.

5
17 нояб. Jawaban diberikan oleh Bennett McElwee 17 November 2015-11-17 03:07 '15 pada 3:07 2015-11-17 03:07

Masukkan git -forward-merge :

Tanpa perlu tujuan, git-forward-merge <source> <destination> menggabungkan sumber ke cabang tujuan.

https://github.com/schuyler1d/git-forward-merge

Ini hanya berfungsi untuk penggabungan otomatis, jika ada konflik, Anda perlu menggunakan penggabungan biasa.

3
29 мая '14 в 20:15 2014-05-29 20:15 jawabannya diberikan lkraider 29 Mei '14 pukul 20:15 2014-05-29 20:15

Untuk banyak kasus (misalnya, untuk penggabungan), Anda cukup menggunakan cabang jarak jauh tanpa memperbarui cabang pelacakan lokal. Menambahkan pesan di reflog kedengarannya seperti berlebihan dan akan berhenti menjadi cepat. Untuk menyederhanakan pemulihan, tambahkan berikut ini ke git config

 [core] logallrefupdates=true 

Lalu masuk

 git reflog show mybranch 

untuk melihat riwayat utas Anda saat ini

3
20 дек. Jawaban diberikan Casebash 20 Des. 2011-12-20 03:22 '11 pada 3:22 2011-12-20 03:22

Saya menulis fungsi shell untuk use case serupa yang saya temui setiap hari dalam proyek. Ini pada dasarnya adalah jalan pintas untuk memperbarui cabang lokal dengan cabang umum, misalnya, sebelum mengembangkan PR, dll.

Melakukan ini, bahkan jika Anda tidak ingin menggunakan checkout , jika orang lain tidak keberatan dengan pembatasan ini.

glmh ("git pull dan gabung di sini") akan secara otomatis menjadi checkout branchB , pull last, checkout branchA kembali checkout branchA dan merge branchB .

Itu tidak memperhitungkan kebutuhan untuk menyimpan salinan branchA lokal, tetapi Anda dapat dengan mudah mengubahnya dengan menambahkan >

 git branch ${branchA}-no-branchB ${branchA} 

Untuk transisi sederhana dengan transisi cepat, ini dilewati dalam pesan pesan commit.

Untuk merger non-transitif, ini membuat cabang Anda dalam keadaan resolusi konflik (Anda mungkin perlu melakukan intervensi).

Untuk mengonfigurasi, tambahkan ke .bashrc atau .zshrc dll:

 glmh() { branchB=$1 [ $# -eq 0 ]  { branchB="develop" } branchA="$(git branch | grep '*' | sed 's/* //g')" git checkout ${branchB}  git pull git checkout ${branchA}  git merge ${branchB} } 

Gunakan:

 # No argument given, will assume "develop" > glmh # Pass an argument to pull and merge a specific branch > glmh your-other-branch 

Catatan Tidak cukup efisien untuk mengeluarkan argumen di luar nama cabang di git merge

2
13 февр. jawabannya diberikan rkd 13 Feb. 2016-02-13 03:03 '16 pada 3:03 2016-02-13 03:03

Pertanyaan lain tentang tag atau Ajukan Pertanyaan