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 :)
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 ..pull
menjadi afetch
diikuti oleh amerge
ke masing-masing cabang.Jawaban:
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:Pemakaian:
git sync
.Inilah mengapa ini bekerja:
git checkout --quiet HEAD
langsung periksa komit Anda saat ini, dan masukkan Anda ke dalamnya kepala terpisah negara. Dengan cara ini, jika Anda aktifmaster
ataudevelop
, 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).git fetch origin master:master develop:develop
menggunakan refspec denganfetch
untuk memajukanmaster
dandevelop
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 dariorigin
, sedangkan tujuannya adalah versi repo lokal cabang-cabang itu.Akhirnya,
git checkout --quiet -
periksa cabang tempat Anda terakhir, terlepas dari ada atau tidaknya kegagalan dalam perintah sebelumnya. Jadi, jika Anda aktifmaster
ketika kamu berlarigit sync
, dan semuanya berhasil, Anda akan meninggalkan kondisi kepala terpisah dan memeriksa yang baru diperbaruimaster
.Lihat juga jawaban saya untuk git: perbarui cabang lokal tanpa memeriksanya? .
sumber
origin/develop
kapan kamu menggunakan alias? Tidak masuk akal jika itu milik Andadevelop
cabang. Juga, penunjuk untukmaster
bisa dipindahkan jika itudevelop
yang diperiksa, intinya adalah jika itumaster
yang sudah dicentang, maka Anda tidak bisa maju cepatmaster
karena itu akan mempengaruhi copy pekerjaan Anda, jadi itu sebabnya Anda melepaskan copy pekerjaan dari itu terlebih dahulu dengan menggunakangit checkout head
. Saya melihat jawaban lain yang menggambarkannya sebagai "berdiri di atas batu", Anda harus turun dari batu sebelum Anda bisa memindahkannya.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.Memasang git-up . Ini memberi Anda perintah
git-up
yang akan menarik semua cabang lokal di repositori Anda.sumber
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:
Tak pelak saya akhirnya membuat alias, tetapi memutuskan untuk tidak menariknya, dan fokus hanya memajukan cabang yang berbeda.
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.
sumber