Bagaimana cara mengatur cabang hulu untuk mendorong cabang lokal ke dalam magit?

11

Dari apa yang saya ingat, jika saya mengerjakan cabang, misalnya, my-feature-branchsaya dulu dapat melakukan ini dari magit-statusmenu dengan P P, dan kemudian memilih cabang jarak jauh dari daftar yang ada origin/my-feature-branchdi atas. Ini bekerja dengan baik.

Baru-baru ini, pada diskusi ini , saya dapat melakukan sesuatu yang serupa P -u e(membuka magit-push-popup, mengatur --set-upstreambendera, dan menggunakan euntuk tempat lain), yang juga akan membuat saya memilih dari daftar cabang yang dimulai dengan origin/my-feature-branch. Ini bekerja dengan baik untuk saya juga. Namun yang lebih baru lagi, ini tidak lagi berfungsi, dan saya belum dapat menemukan cara terbaik untuk mengatur cabang upstream.

Ketika saya menggunakan P eopsi pertama untuk mendorong cabang origin/my-feature-branch, itulah yang hampir selalu saya inginkan. Namun, itu tidak ditetapkan origin/my-feature-branchsebagai hulu untuk cabang lokal saya. Menggunakan P umemungkinkan saya untuk memilih cabang hulu, tetapi origin/my-feature-branchtidak ada dalam daftar, dan saya harus mengetik origin/my-feature-branchtanpa penyelesaian tab (saya tahu ini tidak sulit, tetapi cenderung kesalahan pengguna, dan lebih lambat dari baris perintah).

Apakah ini satu-satunya cara untuk menetapkan cabang hulu sekarang, atau apakah saya kehilangan sesuatu? Saya telah melihat diskusi dan dokumentasi lain yang berkaitan dengan masalah ini, tetapi semua sumber yang saya temukan tampaknya sudah ketinggalan zaman.

Elethan
sumber
1
Saya pikir <remote>/<branch>bagian itu sengaja ditinggalkan keluar dari prompt (lihat komentar ini ). Sementara itu, Anda dapat mengatur magit-push-current-set-remote-if-missingke nol.
Kyle Meyer
Saya baru saja memperbaikinya. Jawaban saya di bawah mengasumsikan perbaikan itu.
tarsius
Menemukan dan memperbaiki beberapa masalah terkait lainnya. Anda mungkin harus menunggu beberapa jam hingga Melpa mengejar ketinggalan sebelum semuanya di bawah ini 100% benar.
tarsius

Jawaban:

11

Ada beberapa cara untuk mengatur hulu, sambil mendorong atau tanpa mendorong pada saat yang sama.

Jika magit-push-current-set-remote-if-missingbukan- nil(default), maka Anda akan melihat sesuatu seperti:

Push feature to
 p pushRemote, after setting that
 u @{upstream}, after setting that
 e elsewhere

Untuk mendorong origin/featuredan mengaturnya sebagai upstream, tekan udan kemudian RETuntuk menerima kandidat penyelesaian default.

Jika magit-push-current-set-remote-if-missingadalah nil, maka Anda akan melihat ini sebagai gantinya:

Push feature to
 e elsewhere

Jika Anda menekan psekarang, maka Anda akan diberitahu bahwa hulu tidak dikonfigurasikan (menyiratkan bahwa Anda tidak dapat mendorong ke hulu jika tidak ada hulu).

Tapi jika magit-push-current-set-remote-if-missingini nil, maka daftar switch akan fitur --set-upstream, sehingga Anda bisa menggunakan P - u pseperti yang Anda digunakan untuk (kecuali bahwa p kedua adalah huruf kecil). Namun ada satu komplikasi: setelah mengubah nilai magit-push-current-set-remote-if-missingAnda harus me-restart Emacs --set-upstreamagar muncul atau menghilang.

Akhirnya anda dapat mengatur hulu menggunakan "set hulu (dan melakukan apa-apa lagi)" perintah: b uorigin/masterRET. Perhatikan bahwa ketika Anda menggunakan pendekatan ini, maka Anda hanya dapat memilih cabang yang sudah ada.


Tetapi akan lebih baik untuk mengkonfigurasi push-remote dan push to itu. Untuk mempelajari lebih lanjut tentang push-remote dan perbedaannya dari hulu, lihat simpul Branching di manual info (versi web belum diperbarui).

Pada dasarnya, cabang hulu adalah cabang tempat cabang fitur Anda pada akhirnya akan digabung (dengan menggabungkan atau rebasing, bukan dengan mendorong), kemungkinan besar origin/master. Dan push-remote adalah tempat Anda mendorong cabang fitur Anda saat masih bekerja pada mereka atau agar orang lain dapat menggabungkannya. Jika cabang lokal bernama featuredan push-remote my-fork, maka mendorong cabang yang menggunakan P pakan mendorong ke my-fork/feature. ("Push-to-branch" tidak dapat dikonfigurasi, nama cabang pada push-remote selalu sama dengan nama lokal.)

Jadi sementara pertanyaan Anda adalah sesuatu seperti "bagaimana saya mendorong ke hulu, sementara mengkonfigurasi hulu pada saat yang sama", rekomendasi saya adalah untuk tidak mendorong ke hulu sama sekali, tetapi sebagai gantinya mendorong ke push-remote.

Asalkan Anda belum mengubah nilai magit-push-current-set-remote-if-missingAnda dapat mengkonfigurasi push-remote menggunakan P psome-remoteRET. Tapi, karena Anda mungkin mendorong semua cabang fitur ke remote yang sama, lebih baik untuk mengatur push-remote sekali untuk semua cabang dan selesai dengan itu: bdan kemudian M-psampai remote yang tepat dipilih.


Juga perhatikan bahwa biasanya tidak perlu menetapkan cabang upstream secara eksplisit. Saat Anda membuat cabang baru dan memilih cabang jarak jauh sebagai titik awal, maka itu digunakan sebagai upstream.

Sayangnya titik awalnya biasanya adalah cabang lokal dan dalam kasus itu Git secara default tidak menggunakannya sebagai upstream. Tapi itu bisa dengan mudah diperbaiki dengan menjalankan ini sekali:

git config --global branch.autoSetupMerge always

Nilai default adalah true, yang berarti "mengatur titik awal sebagai hulu, asalkan itu adalah cabang jarak jauh ".


Omong-omong, hal yang sama berlaku untuk push-remote. Itu juga biasanya harus diatur semi-otomatis dalam repositori "baru". Jika Anda mengkloning repositori, Anda akan ditanya apakah Anda ingin menggunakannya originsebagai push-remote. Anda harus menjawab "ya", kecuali Anda akan menambahkan remote lain, katakanlah my-fork, yang harus digunakan sebagai push-remote. Ketika Anda menambahkan remote menggunakan baru M adan remote.pushDefaultbelum diatur, maka Anda akan ditanya apakah Anda ingin menggunakan remote yang baru ditambahkan sebagai push-remote.

Ini dapat dikonfigurasi menggunakan magit-clone-set-remote.pushDefaultdan magit-remote-add-set-remote.pushDefault.

Opsi lanjutan lainnya adalah magit-branch-prefer-remote-upstream, yang defaultnya adalah nil. Jika Anda mengaturnya ke t, dan kemudian pilih cabang lokal sebagai titik awal untuk cabang baru, maka hulu dari titik awal mungkin (menurut beberapa aturan, lihat doc-string) digunakan sebagai hulu, bukan titik awal itu sendiri.

tarsius
sumber