Herhangi bir dal belirtilmemişse varsayılan “git push” davranışı


1366

Uzak şubeme itmek için aşağıdaki komutu kullanıyorum:

git push origin sandbox

Söylersem

git push origin

bu diğer şubelerimdeki değişiklikleri de etkiliyor mu, yoksa yalnızca mevcut şubemi mi günceller? Üç şubeleri var: master, productionve sandbox.

git pushBen iyiliği için bu açıklık getirmek istiyorum böylece dokümantasyon çok bu konuda net değildir.

Aşağıdaki git pushkomutlar tam olarak hangi dalları ve uzaktan kumandaları günceller?

git push 
git push origin

origin yukarıda bir uzaktan kumanda.

Bunun git push [remote] [branch]sadece o dalı uzaktan kumandaya iteceğini anlıyorum .


Genel olarak diff araçlarının konfigürasyonu ve yeni script git difftool ile ilgili olarak, bu diğer SO sorusuna yeni bir cevap ekledim: stackoverflow.com/questions/255202/…
VonC

67
Şaşırtıcı davranışı hakkında ilginç olabilecek bir blog yazısı yaptımgit push
Mark Longair

1
@ Mark: diğer işte, sadece mevcut dalı izlenen akış yukarı yönünde iter. Güzel.
VonC


help.github.com/articles/pushing-to-a-remote benim gibi acemilere anında yardım için bu bağlantıyı buraya koyuyor
MycrofD

Yanıtlar:


1591

Git yapılandırmanızda push.default ayarını yaparak varsayılan davranışı kontrol edebilirsiniz. Gönderen git-config (1) belgelerine :

push.default

Komut satırında hiçbir refspec verilmezse, uzaktan kumandada hiçbir refspec yapılandırılmazsa ve komut satırında verilen seçeneklerden hiçbiriyle refspec belirtilmezse, git push'un gerçekleştirmesi gereken eylemi tanımlar. Olası değerler:

  • nothing: hiçbir şey itme

  • matching: eşleşen tüm dalları itin

    Her iki uçta aynı ada sahip tüm dalların eşleştiği kabul edilir.

    Bu eskidir, ancak Git 2.0'dan beri değildir ( simpleyeni varsayılan).

  • upstream: geçerli dalı yukarı doğru şubesine it (yukarı doğru trackingolan kullanımdan kaldırılmış bir eşanlamlı)

  • current: geçerli dalı aynı adı taşıyan bir şubeye aktarma

  • simple: (Git 1.7.11'de yeni) yukarı akış gibi, ancak yukarı akış dalının adı yerel olandan farklıysa itmeyi reddediyor

    Bu en güvenli seçenektir ve yeni başlayanlar için çok uygundur.

    Bu mod Git 2.0'da varsayılan haline gelmiştir.

Basit, mevcut ve yukarı akış modları, diğer dallar henüz dışarı itilmeye hazır olmasa bile, işi bitirdikten sonra tek bir kolu dışarı itmek isteyenler içindir.

Komut satırı örnekleri:

Geçerli yapılandırmayı görüntülemek için:

git config --global push.default

Yeni bir yapılandırma ayarlamak için:

git config --global push.default current

11
Bunun v1.6.3 sürümünde yeni olduğunu belirtmek gerekir: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey

8
Bu "push.default", çoklu depolarla çalışmak için şimdiye kadarki en büyük şeydir. "İzleme" olarak ayarlayın ve hepiniz iyisiniz. Şube ile birleştiğinde - yukarı doğru akıtın, itme ve çekme yolunu daha rahat hale getirir.
jpswain

13
"izleme", "yukarı akış" için kullanımdan kaldırılmış eşanlamlıdır: kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka

22
Git 1.7.11'den itibaren yeni bir simplemodun olduğunu belirtmek gerekir . Bu modun gelecekte varsayılan olması amaçlanmıştır. simplegibi çalışır upstream, ancak bunun gibi currentşube adlarının her iki uçta da aynı olmasını gerektirir.
Kai

9
Git 2.0'dan itibaren simpledavranışın artık varsayılan olduğunu belirtmek gerekir .
do0g

209

Push.default ile git'iniz için varsayılan davranış ayarlayabilirsiniz

git config push.default current

veya çok sayıda havuzunuz varsa ve hepsi için aynısını istiyorsanız

git config --global push.default current

Geçerli bu kurulum aracı varsayılan olacak o yalnızca geçerli şube itmek bunu yaptığında git itmek

Diğer seçenekler:

  • hiçbir şey: Hiçbir şey itme
  • eşleşen: Tüm eşleşen dalları itin (varsayılan)
  • izleme: Geçerli dalı izlemekte olduğu yere itin
  • current: Geçerli dalı itin

GÜNCELLEME - BUNU YAPMAK İÇİN YENİ YOL

Git 1.7.11 itibariyle aşağıdakileri yapın:

git config --global push.default simple

Bu, akımla aynı şekilde çalışan ve söylentilere göre v 2.0'dan git'e varsayılan olarak ayarlanacak olan yeni bir ayardır.


29
Evet, bahsettiğiniz cevabı okudum, ama bu cevap sadece nasıl yapılacağını değil nasıl yapılacağını anlatıyor. Bu yüzden cevabımı ekledim, böylece ayarlamak için gereken tüm bilgiler aynı sayfada olacak.
Christoffer

3
TAMAM; bu yazıya bir düzenleme önermek daha iyidir, çünkü kimse cevabınızı görmeyecektir, çünkü çok fazla oy alması muhtemel değildir
CharlesB

mevcut şubeye çekilmek nasıl olur? git pull kökenli?
Francois

200

git push originoriginiçin uzak şubeleri eşleşen yerel şubelerdeki tüm değişikliklerigit push

İşleri gibi git push <remote>durumlarda, <remote>(hayır uzaktan akım şube için yapılandırılmışsa veya köken) geçerli şube uzak tek şey.

Kılavuz sayfasının Örnekler bölümündengit-push


2
Evet, bu açıkça anlaşılıyor. Muhtemelen adam sayfasında bu örnekleri olmayan git (1.6.1.1 Mac OS X) eski bir sürümünü çalıştırıyorum.
PlagueHammer

Muhtemelen 1.6.3.1 kullanıyorum. Bağlantı verdiğim sitede buldum.
baudtack

2
Yani benim durumumda, tüm yerel şubelerin aynı uzak "köken" e sahip olduğu yerde, "git push", yalnızca uzaktan kumandada karşılık gelen bir dalı olan yerel şubeleri itecek olan "git push orijini" ile tam olarak aynı olurdu.
PlagueHammer

@Debajit Doğru! Bu arada harika bir soru. Her zaman git push'un sadece mevcut dalı iteceğini varsaymıştım. Görünüşe göre öyle değil! Bilmek çok güzel.
baudtack

5
Bu soru eski ama yeni herkes için @docgnome haklı. Sadece 'git push origin' çalıştırıldığında yalnızca geçerli dal yerine tüm dallar zorlanır. Geliştirme adlı bir dalı zorla göndermek için 'git push -f -v -n origin development'ı kullanın. Hangi şubelerin etkileneceğini önceden görebilmeniz için git push sonucunu simüle etmek için -n bayrağını kullanın. İyi görünüyorsa 'git push -f -v origin development' komutunu çalıştırın. Bu yararlı olabilir stackoverflow.com/questions/3741136/git-push-f-vs
Dylan Valade

54

Ben sadece bir şubeye kodumu taahhüt ve github itti, şöyle:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

3
`` Git commit -am "..." '' sözlerini yoğunlaştırabilirsiniz
James Harrington

17
Bu cevabın soru ile ilgisi var mı ?? :?
Asim KT

26

İşte Git Push hakkında çok kullanışlı ve yararlı bilgiler : Git Push: Just Tip Tip

Git push'un en yaygın kullanımı, yerel değişikliklerinizi genel yukarı akış deponuza aktarmaktır. Yukarı akışın "origin" (deponuz bir klonsa varsayılan uzak ad) ve uzak / güncelleştirilecek dal için "master" (varsayılan dal adı) adı verilen bir uzaktan kumanda olduğu varsayılırsa, bununla yapılır:git push origin master

git push origin tüm yerel şubelerdeki değişiklikleri başlangıçtaki eşleşen şubelere gönderir.

git push origin master değişiklikleri yerel ana daldan uzak ana daldan iletir.

git push origin master:staging varsa, yerel ana daldan uzak aşamalandırma dalına değişiklikleri iletir.


git push origin branch_namebir sebepten ötürü sadece branch_nameşubeyi değil diğer yerel şubelerimi de itiyorum (git versiyon 1.9.1).
mrgloom

git push origin master:stagingharika bir gizli mücevher olduğunu!
17'de Shakeel

19

(Mart 2012)
Dikkat: varsayılan " matching" politika yakında değişebilir
(bazen git1.7.10 + 'dan sonra)
:

Bkz. " Lütfen tartışın: ne itmeniz gerektiğini söylemediğinizde" git push "ne yapmalı? "

Geçerli ayarda (yani push.default=matching), git pushbağımsız değişkenler aynı adla yerel ve uzaktan var olan tüm dalları zorlar .
Bu genellikle bir geliştirici kendi genel deposuna aktardığında uygundur, ancak paylaşılan bir depo kullanırken tehlikeli değilse kafa karıştırıcı olabilir.

Teklif, varsayılanı ' upstream' olarak değiştirmek , yani yalnızca geçerli dalı itmek ve git pull'un çekeceği şubeye itmektir.
Başka bir aday 'current '; bu yalnızca geçerli dalı aynı adın uzak dalına iter.

Şimdiye kadar tartışılanlar bu konuda görülebilir:

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

Önceki ilgili tartışmalar şunları içerir:

Tartışmaya katılmak için mesajlarınızı şu adrese gönderin: git@vger.kernel.org


18

Bunu sadece .gitconfig takma adları bölümüne koydum ve nasıl çalıştığını seviyorum:

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

Mevcut şubeyi başlangıç ​​noktasına git pubveya başka bir repoya yönlendirir git pub repo-name. Lezzetli.


4
Bu güzel, ama maalesef şubenin diğer depoda aynı ada sahip olduğunu varsayar. git push -u --repo="origin" $1;Bunun yerine deneyin . Oldukça iyi çalışıyor, ancak başka bir depoya
basarsanız

Hey teşekkürler! Zorlamadan önce izleme durumunu kontrol eden daha eksiksiz bir sürüm yapmak istememi sağlıyor. Ancak depolar arasında nadiren farklı şube isimlerim olduğu için şimdilik benimkine sadık kalacağım.
Mat Schaffer


8

Git push, tüm yerel şubeleri uzak sunucuya itmeye çalışacaktır, muhtemelen bu istemezsiniz. Ben bununla başa çıkmak için kolaylık kurulum birkaç var:

"Gpull" ve "gpush" takma adları uygun şekilde:

~ / .Bash_profile dosyamda

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`'

Bu nedenle, "gpush" veya "gpull" komutunun yürütülmesi yalnızca "şu anda açık" dalımı zorlar.


3
Her zaman gpush davranışını istiyorsanız, git-push man sayfasının örnekler bölümünde belirtildiği gibi remote.origin.push = HEAD (örn. "Git config remote.origin.push HEAD") öğesini de ayarlayabilirsiniz.
Trevor Robinson

5
"Brian L" nin yukarıdaki yazısına bakarsanız bu gerekli değildir.
jpswain

1
Hiçbir equv olmadığı için. pull pull.default
SamGoody

8

Bu varsayılan davranışı .gitconfig, örneğin:

[push]
  default = current

Geçerli ayarları kontrol etmek için şunu çalıştırın:

git config --global --get push.default

3

Takma adları kullanmak yerine, git-XXX komut dosyaları oluşturmayı tercih ederim, böylece onları daha kolay kontrol edebilirim (geliştiricilerimizin bu tür şeyler için yollarında belirli bir kaynak kontrollü dizin var).

Bu komut dosyası (çağrılan git-setpush), değer için yapılandırma değerini remote.origin.pushyalnızca geçerli dalı itecek bir değere ayarlar :

#!/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

not, kullandığımız gibi Gerrit, hedefirefs/for/XXX bir inceleme dalına itmek . Ayrıca kökeni uzak adınız olduğunu varsayar.

Şununla bir şubeyi kontrol ettikten sonra çağır:

git checkout your-branch
git setpush

Açıkçası ödeme yapmak için uyarlanmış olabilir, ancak komut dosyalarının bir şey yapmasını ve iyi yapmasını seviyorum


gerrit kullanımı için harika bir fikir remote.origin.push ayarı. Yerel özellik şubelerimin feature/fix_fubartümü masterveya gibi daha genel akış yukarı dallara işaret ediyor develop, bu yüzden bu yanlış yukarı akış yönüne işaret eder. Gerrit kontrollü depolar için yerel akışınız nasıl?
spazm

Eğer gerrit üzerinde sadece bir "hedef" dalınız varsa, basitçe deneyin git config remote.origin.push HEAD:refs/for/master.
fracz

2

Bu görevleri otomatikleştirmek için .bashrc dosyama aşağıdaki işlevleri ekledim. Geçerli dalın git push / git pull + adını yapar.

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.