Bagaimana saya bisa mendorong cabang Git lokal ke remote dengan nama yang berbeda dengan mudah?

175

Saya bertanya-tanya apakah ada cara mudah untuk mendorong dan menarik cabang lokal dengan cabang jauh dengan nama yang berbeda tanpa selalu menyebutkan kedua nama.

Sebagai contoh:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

Sekarang jika seseorang memperbarui remote_branch_name, saya dapat:

$ git pull

Dan semuanya digabung / diteruskan. Namun, jika saya membuat perubahan pada "newb" lokal saya, saya tidak bisa:

$ git push

Sebaliknya, saya harus:

% git push origin newb:remote_branch_name

Agak konyol. Jika git-pulldigunakan git-config branch.newb.mergeuntuk menentukan dari mana menarik, mengapa tidak bisa git-pushmemiliki opsi konfigurasi serupa? Apakah ada jalan pintas yang bagus untuk ini atau haruskah saya melanjutkan saja?

jmacdonagh
sumber

Jawaban:

93

Tentu. Cukup atur Anda push.defaultuntuk upstreammendorong cabang ke upstreams mereka (yang sama dengan yang pullakan menarik, ditentukan oleh branch.newb.merge), daripada mendorong cabang ke yang cocok dengan namanya (yang merupakan pengaturan default untuk push.default, matching).

git config push.default upstream

Perhatikan bahwa ini dulu disebut trackingbukan upstreamsebelum Git 1.7.4.2, jadi jika Anda menggunakan versi Git yang lebih lama, gunakan trackingsaja. The push.defaultpilihan yang ditambahkan di Git 1.6.4, jadi jika Anda berada di versi lama dari itu, Anda tidak akan memiliki opsi ini sama sekali dan akan perlu secara eksplisit menentukan cabang untuk mendorong ke.

Brian Campbell
sumber
Itu dia! Ini berlaku untuk semua cabang yang dilacak, tetapi tidak apa-apa. Terima kasih!
jmacdonagh
Saya tertarik untuk mengetahui apakah ada singkatan untuk nama cabang yang saya periksa. Saya mungkin hanya ingin di git push buildserver .:test_thismana .akan menjadi nama cabang lokal yang saya belum tentu tahu. Aku bisa mencarinya, tentu, tetapi jika ada tangan pendek, seperti titik, untuk itu, itu akan keren.
Frederick Nord
2
@FrederickNord HEADadalah singkatan yang Anda cari. HEADadalah apa yang menunjuk ke cabang yang saat ini keluar, atau langsung ke komit tertentu jika Anda memiliki kepala yang terpisah.
Brian Campbell
Terima kasih! Ini memperbaiki Updates were rejected because a pushed branch tip is behind its remotekesalahan saya. Repo lokal saya sudah mutakhir, tetapi nama-nama itu berbeda.
canhazbits
171

Saat Anda melakukan push awal, tambahkan parameter -u :

git push -u origin my_branch:remote_branch

Dorongan berikutnya akan pergi ke tempat yang Anda inginkan.

EDIT:

Sesuai komentar, itu hanya mengatur tarikan.

git branch --set-upstream

harus melakukannya.

Adam Dymitruk
sumber
7
-uhanya mengatur hulu, yang menurut pertanyaan, sudah diatur. Dia perlu set push.defaultuntuk upstremuntuk mendapatkan pushmenghormati pengaturan hulu, karena secara default hanya pulltidak.
Brian Campbell
2
Ini sepertinya tidak berhasil - setidaknya bukan pada versi git yang tidak pernah
Thomas Watson
cabang git --set-upstream hanya melakukan pengaturan tarik "pushRemote" perlu diatur setelah ini.
Diingatdibuat dari
Saya pikir git branch --set-upstreamitu tidak perlu. Catatan: saya git --versionadalah 2.17.1.
Gabriel Staples
15

Perintah oleh Adam sekarang sudah ditinggalkan. Kamu bisa memakai:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

untuk mengatur cabang hulu my_local_branchke origin/my_remote_branch.

pekerjaan
sumber
6
Bisakah Anda memberikan tautan yang mendukung informasi yang Anda bagikan tentang -u tidak digunakan lagi? Documents untuk versi terbaru tentang push di git-scm.com tampaknya menyarankan itu terkini. Terima kasih sebelumnya - ini bisa sangat membantu pembaca untuk menindaklanjuti info lebih lanjut.
Kay V
Setuju dengan @KayV, terutama bahwa saya mendapat pesan ini ketika mencoba membuat cabang jarak jauh baru dengan nama yang berbeda dengan cabang lokal saya: 'Jika Anda berencana untuk mendorong keluar cabang lokal baru yang akan melacak rekan jarak jauhnya, Anda mungkin ingin untuk menggunakan "git push -u" untuk mengatur konfigurasi hulu saat Anda menekan. '
FBB
0

Inilah proses yang berhasil bagi saya.

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

Sekarang repo baru Anda akan menjadi 'asal' dan repo asli adalah 'hulu'. Konfirmasikan dengan menjalankan git remote -v. (Catatan samping: Hulu digunakan untuk mengambil dari repo asli - agar salinan lokal Anda tetap sinkron dengan proyek yang ingin Anda beri kontribusi - dan asal digunakan untuk menarik dan mendorong karena Anda dapat berkontribusi pada repo Anda sendiri).

git push origin master

Sekarang master repo jarak jauh baru Anda (di Github) akan disinkronkan dengan master asli, tetapi tidak memiliki cabang fitur apa pun.

git rebase upstream/branch-name
git push origin master

Rebase adalah penggabungan yang cerdas. Kemudian dorong untuk menguasai lagi dan Anda akan melihat cabang fitur yang dipilih sebagai master pada repo baru.

Pilihan:

git remote rm upstream
git remote add upstream new-repo-url
urubuz
sumber
0

Saya telah mengalami masalah yang sama untuk beberapa waktu sekarang. Saya akhirnya memiliki seperangkat pernyataan sehingga saya tidak harus melakukannya git push origin local:remotesetiap waktu. Saya mengikuti ini:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

Setelah mengatur upstream ke cabang jauh dengan nama yang berbeda (baris pertama) dan kemudian menjadikannya sebagai default (baris kedua), baris ketiga sekarang akan mematuhi aturan-aturan ini dan mendorong ke set upstream.

messmania
sumber