Perilaku default "git push" tanpa cabang yang ditentukan

1366

Saya menggunakan perintah berikut untuk mendorong ke cabang jarak jauh saya:

git push origin sandbox

Jika saya katakan

git push origin

apakah itu mendorong perubahan di cabang saya yang lain juga, atau apakah itu hanya memperbarui cabang saya saat ini? Saya memiliki tiga cabang: master, productiondan sandbox.

The git pushdokumentasi tidak terlalu jelas tentang hal ini, jadi saya ingin mengklarifikasi ini untuk selamanya.

Cabang dan remote mana yang benar- git pushbenar memperbarui perintah berikut ?

git push 
git push origin

origin di atas adalah remote.

Saya mengerti bahwa git push [remote] [branch]hanya akan mendorong cabang itu ke remote.

PlagueHammer
sumber
Mengenai konfigurasi alat diff secara umum, dan skrip git difftool baru, saya telah menambahkan jawaban baru dalam pertanyaan SO lainnya: stackoverflow.com/questions/255202/…
VonC
67
Saya melakukan posting blog tentang perilaku mengejutkan git push, yang mungkin menarik
Mark Longair
1
@ Mark: di pekerjaan lain, hanya mendorong cabang saat ini untuk dilacak ke hulu. Bagus.
VonC
help.github.com/articles/pushing-to-a-remote letakkan tautan ini di sini untuk bantuan segera bagi para pemula seperti saya
MycrofD

Jawaban:

1591

Anda dapat mengontrol perilaku default dengan menyetel push.default di konfigurasi git Anda. Dari dokumentasi git-config (1) :

push.default

Menentukan tindakan yang harus diambil git jika tidak ada refspec yang diberikan pada baris perintah, tidak ada refspec yang dikonfigurasi di remote, dan tidak ada refspec yang tersirat oleh salah satu opsi yang diberikan pada baris perintah. Nilai yang mungkin adalah:

  • nothing: jangan mendorong apa pun

  • matching: dorong semua cabang yang cocok

    Semua cabang dengan nama yang sama di kedua ujungnya dianggap cocok.

    Ini dulunya adalah default, tetapi tidak sejak Git 2.0 ( simpleadalah default baru).

  • upstream: dorong cabang saat ini ke cabang hulu ( trackingadalah sinonim usang untuk hulu)

  • current: dorong cabang saat ini ke cabang dengan nama yang sama

  • simple: (baru dalam Git 1.7.11) seperti hulu, tetapi menolak untuk mendorong jika nama cabang hulu berbeda dari yang lokal

    Ini adalah opsi paling aman dan cocok untuk pemula.

    Mode ini telah menjadi default di Git 2.0.

Mode sederhana, saat ini dan hulu adalah untuk mereka yang ingin mendorong keluar satu cabang setelah menyelesaikan pekerjaan, bahkan ketika cabang lainnya belum siap untuk didorong keluar

Contoh baris perintah:

Untuk melihat konfigurasi saat ini:

git config --global push.default

Untuk mengatur konfigurasi baru:

git config --global push.default current
UncleZeiv
sumber
11
Mungkin perlu dicatat bahwa ini baru di v1.6.3: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey
8
Ini "push.default" adalah hal terbesar yang pernah ada untuk bekerja dengan beberapa repo. Setel ke "pelacakan" dan Anda semua baik-baik saja. Dikombinasikan dengan cabang --set-hulu, ini membuat cara dorong dan tarik lebih nyaman.
jpswain
13
"tracking" adalah sinonim yang sudah tidak digunakan lagi untuk "upstream": kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka
22
Perlu dicatat bahwa pada Git 1.7.11, ada simplemode baru . Mode ini dimaksudkan untuk menjadi default di masa depan. simplebekerja seperti upstream, tetapi suka currentmensyaratkan bahwa nama cabang sama di kedua ujungnya.
Kai
9
Perlu dicatat bahwa pada Git 2.0 simpleperilaku sekarang menjadi default.
do0g
209

Anda dapat mengatur perilaku default untuk git Anda dengan push.default

git config push.default current

atau jika Anda memiliki banyak repositori dan menginginkan hal yang sama untuk semua itu

git config --global push.default current

The sekarang di setup ini berarti bahwa secara default Anda akan hanya mendorong cabang saat ketika Anda melakukan dorongan git

Pilihan lain adalah:

  • tidak ada: Jangan mendorong apa pun
  • yang cocok: Dorong semua cabang yang cocok (default)
  • pelacakan: Dorong cabang saat ini ke apa pun yang dilacak
  • saat ini: Dorong cabang saat ini

UPDATE - CARA BARU UNTUK MELAKUKAN INI

Pada Git 1.7.11 lakukan hal berikut:

git config --global push.default simple

Ini adalah pengaturan baru yang diperkenalkan yang bekerja dengan cara yang sama seperti saat ini, dan akan dibuat default untuk git dari v 2.0 menurut rumor

Christoffer
sumber
29
Ya saya membaca jawaban yang Anda maksud, tetapi jawaban itu hanya mengatakan apa yang harus dilakukan dan bukan bagaimana melakukannya. Jadi saya menambahkan jawaban saya sehingga semua info yang diperlukan untuk mengaturnya ada di halaman yang sama.
Christoffer
3
BAIK; lebih baik untuk menyarankan sunting ke pos tersebut, karena tidak ada yang akan melihat jawaban Anda, karena kemungkinan besar tidak akan mendapatkan banyak suara
CharlesB
bagaimana orang pergi tentang menarik ke cabang saat ini? git tarik asalnya?
Francois
200

git push originakan mendorong semua perubahan pada cabang lokal yang memiliki cabang jarak jauh yang cocok di originAs forgit push

Bekerja seperti git push <remote>, di mana <remote>remote cabang saat ini (atau asal, jika tidak ada remote yang dikonfigurasi untuk cabang saat ini).

Dari bagian Contoh git-pushhalaman manual

baudtack
sumber
2
Ya, itu membuatnya jelas. Saya mungkin menjalankan versi git yang lebih lama (1.6.1.1 Mac OS X) yang tidak memiliki contoh-contoh ini di halaman manual.
PlagueHammer
Mungkin saya menjalankan 1.6.3.1. Namun saya menemukannya di situs yang saya tautkan.
baudtack
2
Jadi, dalam kasus saya, di mana semua cabang lokal memiliki "asal" remote yang sama, "git push" akan persis sama dengan "git push origin" yang akan mendorong hanya cabang lokal yang memiliki cabang yang sesuai di remote.
PlagueHammer
@ Debajit Tepat! Pertanyaan yang bagus. Saya selalu berasumsi bahwa git push hanya akan mendorong cabang saat ini. Sepertinya tidak! Sangat bagus untuk diketahui.
baudtack
5
Pertanyaan ini sudah lama tetapi bagi siapa pun yang baru, @docgnome benar. Hanya menjalankan 'git push origin' akan mendorong semua cabang bukan hanya cabang saat ini. Gunakan 'git push -f -v -n pengembangan asal' untuk memaksa mendorong cabang bernama pengembangan. Gunakan flag -n untuk mensimulasikan hasil push git sehingga Anda dapat melihat terlebih dahulu cabang mana yang akan terpengaruh. Jika terlihat bagus maka jalankan 'git push -f -v origin development'. Ini mungkin berguna stackoverflow.com/questions/3741136/git-push-f-vs
Dylan Valade
54

Saya baru saja melakukan kode saya ke cabang dan mendorongnya ke github, seperti ini:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments
neoneye
sumber
3
Anda dapat menyingkat komit ke `git commit -am" ... "`
James Harrington
17
Apakah jawaban ini ada hubungannya dengan pertanyaan ?? :?
Asim KT
26

Berikut ini adalah informasi yang sangat berguna dan bermanfaat tentang Git Push : Git Push: Just the Tip

Penggunaan git push yang paling umum adalah mendorong perubahan lokal Anda ke repositori hulu publik Anda. Dengan asumsi bahwa upstream adalah remote bernama "origin" (nama remote default jika repositori Anda adalah klon) dan cabang yang akan diperbarui ke / dari bernama "master" (nama cabang default), ini dilakukan dengan:git push origin master

git push origin akan mendorong perubahan dari semua cabang lokal ke cabang yang cocok dengan remote asal.

git push origin master akan mendorong perubahan dari cabang master lokal ke cabang master jarak jauh.

git push origin master:staging akan mendorong perubahan dari cabang master lokal ke cabang pementasan jarak jauh jika ada.

Mukesh Chapagain
sumber
git push origin branch_nameuntuk beberapa alasan mendorong tidak hanya branch_namecabang, tetapi juga cabang lokal saya lainnya (git versi 1.9.1).
mrgloom
git push origin master:stagingadalah permata tersembunyi yang luar biasa!
Shakeel
19

(Maret 2012)
Hati-hati: matchingkebijakan " " default itu mungkin akan segera berubah
(kadang-kadang setelah git1.7.10 +)
:

Lihat " Tolong diskusikan:" git push "apa yang harus dilakukan ketika Anda tidak mengatakan apa yang harus ditekan? "

Dalam pengaturan saat ini (yaitu push.default=matching), git pushtanpa argumen akan mendorong semua cabang yang ada secara lokal dan jarak jauh dengan nama yang sama .
Ini biasanya tepat ketika pengembang mendorong ke repositori publiknya sendiri, tetapi mungkin membingungkan jika tidak berbahaya saat menggunakan repositori bersama.

Proposal adalah untuk mengubah default ke ' upstream' , yaitu hanya mendorong cabang saat ini, dan mendorongnya ke cabang yang akan menarik git.
Kandidat lain adalah ' current'; ini hanya mendorong cabang saat ini ke cabang jarak jauh dengan nama yang sama.

Apa yang telah dibahas sejauh ini dapat dilihat di utas ini:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

Diskusi relevan sebelumnya meliputi:

Untuk bergabung dalam diskusi, kirim pesan Anda ke: [email protected]

VONC
sumber
18

Saya hanya memasukkan ini di bagian alias .gitconfig saya dan menyukai cara kerjanya:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

Akan mendorong cabang saat ini ke asal dengan git pubatau repo lain dengan git pub repo-name. Lezat.

Mat Schaffer
sumber
4
Itu bagus, tetapi sayangnya mengasumsikan bahwa cabang memiliki nama yang sama di repositori lain. Coba git push -u --repo="origin" $1;saja. Ini bekerja dengan cukup baik, kecuali jika Anda mendorong ke repositori lain, nama cabang akan menjadi nama yang digunakan oleh repositori lain, bukan yang Anda dorong
Casebash
Hai, terima kasih! Buat saya ingin melakukan versi yang lebih lengkap yang memeriksa status pelacakan sebelum mendorong. Tapi saya akan tetap dengan milik saya untuk saat ini karena saya jarang memiliki nama cabang yang berbeda antara repo.
Mat Schaffer
10

Anda dapat mendorong cabang saat ini dengan perintah

git push origin HEAD

(ambil dari sini )

Andriy F.
sumber
8

Git push akan mencoba dan mendorong semua cabang lokal ke server jarak jauh, ini mungkin yang tidak Anda inginkan. Saya memiliki beberapa pengaturan kenyamanan untuk menangani ini:

Alias ​​"gpull" dan "gpush" dengan tepat:

Di ~ / .bash_profile saya

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

Dengan demikian, mengeksekusi "gpush" atau "gpull" hanya akan mendorong cabang "sedang aktif" saya.

Cody Caughlan
sumber
3
Jika Anda selalu menginginkan perilaku gpush, Anda juga dapat mengatur remote.origin.push = HEAD (mis. "Git config remote.origin.push HEAD"), seperti yang disebutkan di bagian contoh halaman manual git-push.
Trevor Robinson
5
Ini tidak perlu jika Anda melihat posting di atas oleh "Brian L".
jpswain
1
Yaitu, karena tidak ada equv. for pull pull.default
SamGoody
8

Anda dapat mengubah perilaku default itu di .gitconfig, misalnya:

[push]
  default = current

Untuk memeriksa pengaturan saat ini, jalankan:

git config --global --get push.default
kenorb
sumber
3

Daripada menggunakan alias, saya lebih suka membuat skrip git-XXX sehingga saya dapat sumber mengontrolnya lebih mudah (pengembang kami semua memiliki dir sumber tertentu yang dikendalikan pada jalur mereka untuk jenis hal ini).

Skrip ini (dipanggil git-setpush) akan menetapkan nilai konfigurasi untuk remote.origin.pushnilai ke sesuatu yang hanya akan mendorong cabang saat ini:

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

perhatikan, saat kami menggunakan Gerrit, itu menetapkan target refs/for/XXXuntuk mendorong ke cabang ulasan. Ini juga mengasumsikan asal adalah nama jarak jauh Anda.

Aktifkan setelah memeriksa cabang dengan

git checkout your-branch
git setpush

Jelas bisa disesuaikan untuk juga melakukan checkout, tapi saya suka skrip untuk melakukan satu hal dan melakukannya dengan baik

Mark Fisher
sumber
pengaturan ide bagus remote.origin.push untuk penggunaan gerrit. Cabang fitur lokal saya feature/fix_fubarsemuanya menunjuk ke cabang hulu yang lebih umum seperti masteratau develop, jadi ini akan menunjuk ke hulu yang salah. Seperti apa aliran lokal Anda untuk repo yang dikontrol gerrit?
spazm
Jika Anda hanya memiliki satu cabang "target" di gerrit, coba saja git config remote.origin.push HEAD:refs/for/master.
fracz
2

Saya telah menambahkan fungsi-fungsi berikut ke dalam file .bashrc saya untuk mengotomatiskan tugas-tugas ini. Itu git push / git pull + nama cabang saat ini.

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}
MichaelMoser
sumber