cara menarik ke beberapa cabang sekaligus dengan git?

10

Dalam repo saya memiliki beberapa cabang, di antaranya "master" dan "mengembangkan", yang diatur untuk melacak cabang-cabang terpencil "asal / master" dan "asal / mengembangkan".

Apakah mungkin untuk menentukan bahwa saya ingin master dan pengembangan digabung (diteruskan cepat) sekaligus?

Kapan saya melakukannya git pull sekarang saya mendapatkan sesuatu seperti ini:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

semua cabang jarak jauh diambil, tetapi hanya cabang tempat saya saat ini bergabung dengan cabang jarak jauh yang sesuai.

Jadi saya harus lakukan git checkout master ...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

...lalu git pull lagi, dan kemudian kembali untuk mengembangkan, untuk mendapatkan hasil yang diinginkan.

Saya tahu saya bisa membuat alias / skrip yang melakukan langkah-langkah ini. Tetapi saya ingin menghindari itu jika memungkinkan, karena rawan kesalahan dan tidak terlalu efisien .
Sunting: ok izinkan saya ulangi lagi. Tujuan saya bukanlah untuk mencegah atau mengacaukan script / alias mengkustomisasi git. Saya lebih suka solusi builtin jika ada :)

Superole
sumber
Saya mencoba git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/master tapi itu menyebabkan master jarak jauh digabung menjadi pengembangan ..
Superole
1
Mengapa itu rawan kesalahan atau tidak efisien? Git dimaksudkan untuk dikustomisasi seperti ini. BTW, untuk menghindari harus memeriksa setiap cabang, Anda mungkin ingin membagi pull menjadi a fetch diikuti oleh a merge ke masing-masing cabang.
jjlin
@ jjlin baik jika saya bisa melakukannya tanpa memeriksa setiap cabang yang dapat membantu efisiensi. Itu rawan kesalahan karena matriks hal-hal yang bisa salah dan efeknya terhadap sisa skrip agak rumit. Saya tidak mengatakan itu tidak mungkin untuk membuatnya aman, tetapi itu akan menjadi trade-off. Jadi saya lebih suka solusi builtin jika ada :)
Superole

Jawaban:

8

Anda dapat mengatur alias yang digunakan git fetch dengan refspec untuk memajukan gabungan dengan cabang Anda hanya dengan satu perintah. Atur ini sebagai alias di pengguna Anda .gitconfig mengajukan:

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

Pemakaian: git sync.

Inilah mengapa ini bekerja:

  1. git checkout --quiet HEAD langsung periksa komit Anda saat ini, dan masukkan Anda ke dalamnya kepala terpisah negara. Dengan cara ini, jika Anda aktif master atau develop, Anda melepaskan copy pekerjaan Anda dari pointer cabang, yang memungkinkan mereka untuk dipindahkan (Git tidak akan mengizinkan Anda untuk memindahkan referensi cabang sementara copy pekerjaan Anda memeriksanya).

  2. git fetch origin master:master develop:develop menggunakan refspec dengan fetch untuk memajukan master dan develop cabang di repo lokal Anda. Sintaks pada dasarnya memberitahu Git "di sini adalah refspec dari formulir <source>:<destination>, ambil <destination> dan maju cepat ke titik yang sama dengan <source> ". Jadi sumber dalam alias adalah cabang dari origin, sedangkan tujuannya adalah versi repo lokal cabang-cabang itu.

  3. Akhirnya, git checkout --quiet - periksa cabang tempat Anda terakhir, terlepas dari ada atau tidaknya kegagalan dalam perintah sebelumnya. Jadi, jika Anda aktif master ketika kamu berlari git sync, dan semuanya berhasil, Anda akan meninggalkan kondisi kepala terpisah dan memeriksa yang baru diperbarui master.

Lihat juga jawaban saya untuk git: perbarui cabang lokal tanpa memeriksanya? .

40XUserNotFound
sumber
Saya tidak begitu mengerti sihir yang terlepas di sini, mengapa pointer ke master tidak dapat dipindahkan ketika pengembangan diperiksa? ... Pokoknya saya mencoba ini, dan tampaknya berhasil kecuali sekarang saya mendapatkan "Cabang Anda di depan 'asal / berkembang' dengan 1 komit."
Superole
... yang terpecahkan saat berikutnya saya menarik
Superole
@Superole cabang mana ada di depan origin/develop kapan kamu menggunakan alias? Tidak masuk akal jika itu milik Anda develop cabang. Juga, penunjuk untuk master bisa dipindahkan jika itu develop yang diperiksa, intinya adalah jika itu master yang sudah dicentang, maka Anda tidak bisa maju cepat master karena itu akan mempengaruhi copy pekerjaan Anda, jadi itu sebabnya Anda melepaskan copy pekerjaan dari itu terlebih dahulu dengan menggunakan git checkout head. Saya melihat jawaban lain yang menggambarkannya sebagai "berdiri di atas batu", Anda harus turun dari batu sebelum Anda bisa memindahkannya.
40XUserNotFound
itu memang pengembangan lokal saya. Dan alasannya pasti karena pengambilan ini tidak memperbarui cabang pelacakan. Seperti yang saya pahami; tarikan akan mengambil ke asal / berkembang, dan kemudian menggabungkannya ke dalam pengembangan.
Superole
Sangat penting bahwa jawaban ini menyebabkan fatal: bad config line xx in file xxx. yang disebabkan oleh titik koma. Anda harus membungkus seluruh perintah dengan tanda kutip ganda untuk menghindari masalah ini.
William Leung
1

Memasang git-up . Ini memberi Anda perintah git-up yang akan menarik semua cabang lokal di repositori Anda.

BillyTom
sumber
manis! Aku akan memastikannya.
Superole
2
heh: P Pernyataannya Dukungan Windows diperkirakan tidak ada. dan bukti yang kuat belum dirumuskan bahwa itu pasti tidak akan mengacaukan pengaturan git Anda, menghapus data atau memposting omong kosong gila ke Hacker News atas nama Anda. , dikombinasikan dengan kebutuhan akan Ruby, membuat saya pergi. Saya suka konsepnya.
Superole
Senang ada metode sama sekali ... agak sial, meskipun itu setiap metode membutuhkan beberapa alat pihak ketiga. Seperti ini dan yang dengan perintah "resep" shell atau alias menggunakan shell tertentu (khusus platform).
0xC0000022L
0

Tampaknya tidak ada opsi bawaan untuk git untuk menarik ke banyak cabang. Setidaknya tidak dalam versi 1.8.0. meskipun @ Cupcake menjawab dekat dengan itu.

Namun komentar @ jjlin membuat saya sadar bahwa setidaknya saya tidak perlu menarik dua kali.

Jadi urutan yang sedikit lebih efisien adalah:

git pull
git checkout master
git merge origin/master
git checkout -

Tak pelak saya akhirnya membuat alias, tetapi memutuskan untuk tidak menariknya, dan fokus hanya memajukan cabang yang berbeda.

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

Tentu saja, tanpa pengujian alias ini mengasumsikan bahwa saya memberikan nama yang valid dari cabang ff'able sebagai argumen pertama, dan memiliki perilaku yang tidak terdefinisi sebaliknya. Ini juga tidak optimal untuk use-case dengan lebih dari dua cabang, tetapi itu akan memberi saya apa yang saya butuhkan untuk saat ini.

git pull
git ffwd master
Superole
sumber