pengembangan-web-mp-pd.com

Mengapa saya perlu melakukan `--set-upstream` sepanjang waktu?

Saya membuat cabang baru di Git:

git branch my_branch

Mendorongnya:

git Push Origin my_branch

Sekarang katakan seseorang membuat beberapa perubahan pada server dan saya ingin menarik dari Origin/my_branch. Saya lakukan:

git pull

Tapi saya mendapatkan:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Saya belajar bahwa saya dapat membuatnya bekerja dengan:

git branch --set-upstream my_branch Origin/my_branch

Tetapi mengapa saya perlu melakukan ini untuk setiap cabang yang saya buat? Bukankah sudah jelas bahwa jika saya Push my_branch ke Origin/my_branch, maka saya ingin menarik Origin/my_branch ke my_branch? Bagaimana saya bisa menjadikan ini perilaku default?

1252
Ram Rachum

Pintasan, yang tidak bergantung pada mengingat sintaks untuk git branch --set-upstream 1 yang harus dilakukan:

git Push -u Origin my_branch

... pertama kali Anda mendorong cabang itu. Atau, untuk Mendorong ke cabang saat ini ke cabang dengan nama yang sama (berguna untuk alias):

git Push -u Origin HEAD

Anda hanya perlu menggunakan -u sekali, dan itu mengatur hubungan antara cabang Anda dan yang di Origin dengan cara yang sama seperti git branch --set-upstream.

Secara pribadi, saya pikir itu hal yang baik untuk mengatur hubungan antara cabang Anda dan satu di remote secara eksplisit. Hanya memalukan bahwa aturannya adalah berbeda untuk git Push dan git pull .


1 Ini mungkin terdengar konyol, tapi saya sangat sering lupa untuk menentukan cabang saat ini, dengan asumsi itu adalah default - tidak, dan hasilnya paling membingungkan :)

Perbarui 2012-10-11 : Ternyata saya bukan satu-satunya orang yang merasa mudah salah! Berkat VonC untuk menunjukkan bahwa git 1.8.0 memperkenalkan git branch --set-upstream-to yang lebih jelas, yang dapat digunakan sebagai berikut, jika Anda berada di cabang my_branch:

git branch --set-upstream-to Origin/my_branch

... atau dengan opsi pendek:

git branch -u Origin/my_branch

Perubahan ini, dan alasannya, dijelaskan dalam catatan rilis untuk git 1.8.0, kandidat rilis 1 :

Sangat menggoda untuk mengatakan git branch --set-upstream Origin/master, tetapi itu memberitahu Git untuk mengatur cabang lokal Origin/master untuk berintegrasi dengan cabang yang saat ini sedang diperiksa, yang sangat tidak mungkin apa yang dimaksud pengguna. Opsi ini sudah tidak digunakan lagi; gunakan opsi --set-upstream-to baru (dengan -u pendek dan manis) sebagai gantinya.

1358
Mark Longair

Anda dapat mewujudkannya dengan kurang mengetik. Pertama, ubah cara kerja Push Anda:

git config --global Push.default current

Ini akan menyimpulkan bagian Origin my_branch, sehingga Anda dapat melakukan:

git Push -u

Yang mana keduanya akan membuat cabang jauh dengan nama yang sama dan melacaknya.

1139
Zamith

Anda bisa saja

git checkout -b my-branch Origin/whatever

di tempat pertama. Jika Anda menetapkan branch.autosetupmerge atau branch.autosetuprebase (favorit saya) menjadi always (standarnya adalah true), my-branch akan secara otomatis melacak Origin/whatever.

Lihat git help config.

80
cdunn2001

Anda dapat mengatur upstream lebih sederhana dengan dua cara. Pertama saat Anda membuat cabang:

git branch -u Origin/my-branch

atau setelah Anda membuat cabang, Anda dapat menggunakan perintah ini.

git Push -u Origin my-branch

Anda juga dapat bercabang, memeriksa dan mengatur upstream dalam satu perintah:

git checkout -b my-branch -t Origin/my-branch

Preferensi pribadi saya adalah melakukan ini dalam perintah dua langkah:

git checkout -b my-branch
git Push -u Origin my-branch
66
Tzen

Ini adalah penggunaan saya yang paling umum untuk Persetan .

$ git Push
fatal: The current branch master has no upstream branch.
To Push the current branch and set the remote as upstream, use

    git Push --set-upstream Origin master

$ fuck
git Push --set-upstream Origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

Juga, menyenangkan untuk mengetik kata-kata umpatan di terminal Anda.

50
Tamlyn

Kamu bisa memakai:

git config --global branch.autosetupmerge selalu

yang akan menautkan cabang hulu setiap kali Anda membuat atau checkout cabang baru.

Lihat https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

Ini juga berfungsi dengan autosetuprebase, jika Anda mengikuti alur kerja yang lebih terfokus pada rebase, tetapi jangan gunakan ini kecuali Anda tahu apa yang Anda lakukan, karena ini akan membuat perilaku tarik Anda menjadi rebase, yang dapat menyebabkan hasil aneh.

41
Daniel

Omong-omong, pintasan untuk mendorong cabang saat ini ke jarak jauh dengan nama yang sama:

$ git Push -u Origin HEAD
34
djanowski
git branch --set-upstream-to=Origin/master<branch_name>
12
user3693546

Untuk apa nilainya, jika Anda mencoba melacak cabang yang sudah ada pada remote (mis. Asal/somebranch) tetapi belum memeriksanya secara lokal, Anda dapat melakukannya:

$ git checkout --track Origin/somebranch

Catatan: '-t' adalah versi singkat dari opsi '--track'.

Ini mengatur asosiasi yang sama langsung dari kelelawar.

9
mattacular

Saya pribadi menggunakan alias berikut ini di bash

dalam file ~/.gitconfig

[alias]
    pushup = "!git Push --set-upstream Origin $(git symbolic-ref --short HEAD)"

dan dalam file ~/.basehrc atau ~/.zshrc

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
9
Amrit Shrestha

Anda juga dapat secara eksplisit memberi tahu git pull cabang jarak jauh mana yang akan ditarik (seperti yang disebutkan dalam pesan kesalahan):

git pull <remote-name> <remote-branch>

Hati-hati dengan ini, namun: jika Anda berada di cabang yang berbeda dan melakukan tarikan eksplisit, refspec yang Anda tarik akan digabungkan ke dalam cabang tempat Anda berada!

9
mtbkrdave

Saya menggunakan alias Git ini daripada menyalin/menempelkan saran dari Git setiap kali: https://Gist.github.com/ekilah/88a880c84a50b73bd306

Sumber disalin di bawah (tambahkan ini ke file ~/.gitconfig Anda):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git Push --set-upstream Origin `gitbranchname`; }; gitpushupstream"
8
manroe

Anda dapat mengatur alias yang benar-benar bagus yang dapat menangani ini tanpa sintaks yang terlalu bertele-tele.

Saya memiliki alias berikut di ~/.gitconfig:

po = "!git Push -u Origin \"$(git rev-parse --abbrev-ref HEAD)\""

Setelah membuat komit pada cabang baru, Anda bisa mendorong cabang baru Anda dengan hanya mengetik perintah:

git po
7
123

Bagi mereka yang mencari alias yang berfungsi dengan git pull, inilah yang saya gunakan:

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=Origin/{} {}"

Sekarang setiap kali Anda mendapatkan:

$ git pull
There is no tracking information for the current branch.
...

Lari saja:

$ up
Branch my_branch set up to track remote branch my_branch from Origin.
$ git pull

Dan Anda baik untuk pergi

3
jchavannes

Anda juga dapat melakukan git Push -u Origin $(current_branch)

2

Karena git memiliki kemampuan untuk mendorong/menarik cabang yang berbeda ke repositori "hulu" yang berbeda. Anda bahkan dapat menggunakan repositori terpisah untuk mendorong dan menarik - pada cabang yang sama. Ini dapat membuat aliran multi-level terdistribusi, saya dapat melihat ini berguna pada proyek seperti kernel Linux. Git awalnya dibangun untuk digunakan pada proyek itu.

Sebagai akibatnya, itu tidak membuat asumsi tentang repo cabang Anda yang harus dilacak.

Di sisi lain, sebagian besar orang tidak menggunakan git dengan cara ini, jadi ini mungkin cocok untuk opsi default.

Git umumnya levelnya cukup rendah dan bisa membuat frustasi. Namun ada GUI dan seharusnya mudah untuk menulis skrip pembantu jika Anda masih ingin menggunakannya dari Shell.

1
Rolf

Kami menggunakan phabricator dan jangan Push menggunakan git. Saya harus membuat alias bash yang berfungsi di Linux/mac

vim ~/.bash_aliases

new_branch() {
    git checkout -b "$1"
    git branch --set-upstream-to=Origin/master "$1"
}

menyimpan

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull
0
om471987

Saya semacam menemukan kembali legit karena masalah ini (hanya OS X). Sekarang yang saya gunakan saat bercabang adalah dua perintah ini:

legit publish [<branch>] Menerbitkan cabang yang ditentukan ke remote. (alias: pub)

legit unpublish <branch> Menghapus cabang tertentu dari jarak jauh. (alias: unp)

SublimeGit hadir dengan dukungan legit secara default, yang membuat seluruh rutinitas bercabang semudah menekan Ctrl-b.

0
Benny K

Inilah bash alias untuk git Push yang aman dijalankan untuk setiap Push dan secara otomatis akan beralih antara pengaturan upstream untuk Push pertama dan kemudian melakukan dorongan normal setelah itu.

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git Push -u Origin $(git symbolic-ref --short HEAD) || git Push'

Posting Asli

0
Loren