Bagaimana Anda mendorong hanya satu cabang Git (dan tidak ada cabang lain)?

247

Saya sedang mengerjakan repositori git lokal. Ada dua cabang, masterdan feature_x.

Saya ingin mendorong feature_xrepo jarak jauh, tetapi saya tidak ingin mendorong perubahan pada mastercabang.

Apakah a git push origin feature_xdari feature_xcabang saya ( feature_xcabang sudah ada di remote) berfungsi?

Saya tidak ingin menguji ini pada kotak saya, karena saya tidak dapat mendorong untuk menguasai sekarang.

Rafael Mueller
sumber
Lihatlah di sini: jauh dan di sini: dorong cabang ke github Kedengarannya itu akan berhasil.
al.

Jawaban:

376

ya, lakukan saja yang berikut ini

git checkout feature_x
git push origin feature_x
cpjolicoeur
sumber
54
Dengan git modern, Anda harus dapat dengan mudah "git push origin HEAD", atau bahkan "git push HEAD" untuk mendorong hanya cabang yang baru saja check-out.
Jakub Narębski
2
Apakah perlu checkout ke feature_x?
hd.
5
ya, karena jika Anda menggunakan master, ia akan mencoba untuk mendorong cabang master lokal ke cabang feature_x jauh. untuk tidak harus checkout terlebih dahulu Anda harus melakukan "git push origin feature_x: feature_x"
cpjolicoeur
1
@ cpjolicoeur saya melihat dalam pertanyaan lain (misalnya: di sini ) yang mereka lakukan git push -u origin <branch-name>. Namun Anda tidak menyebutkannya. Apakah itu perlu?
riroo
3
@miss_R -uopsi pada git-pushperintah akan menetapkan referensi hulu untuk melacak cabang yang baru saja ditekan. Ini akan membuat hal-hal seperti git-pullpada cabang itu di masa depan sudah tahu cabang mana yang akan menarik tanpa menentukannya. Ini tidak diperlukan sebagai opsi untuk mendorong satu cabang, tetapi digunakan secara luas karena banyak orang ingin membuat cabang lokal melacak cabang terpencil yang mereka dorong.
cpjolicoeur
74

Secara default git pushmemperbarui semua cabang jarak jauh. Tetapi Anda dapat mengkonfigurasi git untuk memperbarui hanya cabang saat ini ke hulu.

git config push.default upstream

Itu berarti git akan memperbarui hanya cabang saat ini (dicentang) ketika Anda melakukan git push.

Pilihan lain yang valid adalah:

  • nothing: Jangan mendorong apa pun (kesalahan keluar) kecuali jika refspec diberikan secara eksplisit . Ini terutama dimaksudkan untuk orang yang ingin menghindari kesalahan dengan selalu bersikap eksplisit.
  • matching: Dorong semua cabang dengan nama yang sama di kedua ujungnya. (opsi default sebelum Ver 1.7.11)
  • upstream: Dorong cabang saat ini ke cabang hulu. Mode ini hanya masuk akal jika Anda mendorong ke repositori yang sama yang biasanya Anda tarik (yaitu alur kerja sentral ). Tidak perlu memiliki nama yang sama untuk cabang lokal dan jauh.
  • tracking: Sudah usang, gunakan upstreamsaja.
  • current: Dorong cabang saat ini ke cabang jarak jauh dengan nama yang sama di ujung penerima. Bekerja di alur kerja pusat dan non-sentral.
  • simple: [tersedia sejak Ver 1.7.11] dalam alur kerja terpusat, bekerja seperti upstreamdengan keamanan tambahan untuk menolak mendorong jika nama cabang hulu berbeda dari yang lokal. Saat mendorong ke kendali jarak jauh yang berbeda dari jarak jauh yang biasanya Anda tarik, gunakan sebagai current. Ini adalah opsi teraman dan cocok untuk pemula. Mode ini telah menjadi default di Git 2.0.
Karthik Bose
sumber
2
Terima kasih, currentadalah apa yang saya cari, secara default git pushdi foocabang akan mendorongnya ke origin/foocabang.
Dorian
@Doria terima kasih, saya setuju bahwa currentlebih masuk akal sebagai default.
Zoltán
@Dorian, @ Zoltán - Saya merasa simplelebih masuk akal sebagai default. Saya telah memperbarui jawabannya dengan 'kapan harus menggunakan apa'. Mohon lihat.
Karthik Bose
1
Catatan: sejak git versi 2 nilai default telah berubah menjadi simple.
Danijel
8

Pembaruan kecil di atas jawaban Karthik Bose - Anda dapat mengonfigurasi git secara global, untuk memengaruhi semua ruang kerja Anda agar berperilaku seperti itu:

git config --global push.default upstream
Bhaskar
sumber
hulu tidak diakui sebagai pengaturan yang valid untuk saya, harus meletakkan 'saat ini' sebagai gantinya
belalang
-2

Jadi katakanlah Anda memiliki foo cabang lokal, asal yang disebut remote dan asal / master cabang jauh.

Untuk mendorong konten foo ke asal / master, Anda harus mengatur hulu:

git checkout foo
git branch -u origin/master

Kemudian Anda bisa mendorong ke cabang ini menggunakan:

git push origin HEAD:master

Pada perintah terakhir Anda dapat menambahkan --force untuk mengganti seluruh sejarah asal / master dengan yang dari foo.

CodeKid
sumber