Apa sebenarnya yang dilakukan “kamu”? "Master asal git push -u" vs "master asal git push"

335

Saya tampaknya mengerikan dalam menggunakan git, meskipun upaya terbaik saya untuk memahaminya.

Dari kernel.org untuk git push:

-u

--set-hulu

Untuk setiap cabang yang terbaru atau berhasil didorong, tambahkan referensi upstream (pelacakan), digunakan oleh argumen-less git-pull (1) dan perintah lainnya. Untuk informasi lebih lanjut, lihat branch.<name>.mergedi git-config (1).

Ini branch.<name>.mergedari git config:

branch.<name>.merge

Mendefinisikan, bersama dengan branch.<name>.remote, cabang hulu untuk cabang yang diberikan. Ia memberitahu git fetch / git untuk menarik cabang mana yang akan digabung dan juga dapat memengaruhi push git (lihat push.default). Ketika di cabang <name>, ia memberitahu git mengambil refspec default untuk ditandai untuk digabung dalam FETCH_HEAD. Nilai ditangani seperti bagian remote dari refspec, dan harus cocok dengan ref yang diambil dari remote yang diberikan oleh "branch.<name>.remote". Informasi penggabungan digunakan oleh git pull (yang pada awalnya memanggil git fetch) untuk mencari cabang default untuk digabung. Tanpa opsi ini, git pull default untuk menggabungkan refspec pertama yang diambil. Tentukan beberapa nilai untuk mendapatkan gabungan gurita. Jika Anda ingin mengatur git pull sehingga bergabung <name>dari cabang lain di repositori lokal, Anda bisa mengarahkanbranch.<name>.mergeke cabang yang diinginkan, dan gunakan pengaturan khusus. (periode) untuk branch.<name>.remote.

Saya berhasil mengatur repositori jarak jauh dengan github, dan saya berhasil mendorong komit pertama saya ke sana dengan:

git push -u origin master

Kemudian, tanpa disadari saya berhasil mendorong komit kedua ke repositori jarak jauh menggunakan:

git commit -m '[...]'

Namun, salah berpikir bahwa saya harus mendorong lagi origindari master, saya berlari:

# note: no -u
git push origin master

Apa yang dilakukannya? Tampaknya tidak berpengaruh sama sekali. Apakah saya "membatalkan" git push -u origin master?

ClosureCowboy
sumber
45
I'm apparently terrible at using git, despite my best attempts to understand it.- Saya tidak pernah memiliki seseorang yang menciptakan saya dengan baik.
Lakukan

Jawaban:

336

Kuncinya adalah "argumen-less git-pull". Ketika Anda melakukan git pulldari cabang, tanpa menentukan sumber jarak jauh atau cabang, git melihat branch.<name>.mergepengaturan untuk mengetahui dari mana menarik. git push -uset informasi ini untuk cabang yang Anda dorong.

Untuk melihat perbedaannya, mari gunakan cabang kosong yang baru:

$ git checkout -b test

Pertama, kami mendorong tanpa -u:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.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 "test"]
    remote = <nickname>
    merge = <remote-ref>

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

See git-config(1) for details.

Sekarang jika kita menambahkan -u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

Perhatikan bahwa informasi pelacakan telah diatur sehingga git pullberfungsi seperti yang diharapkan tanpa menentukan jarak jauh atau cabang.

Pembaruan: Kiat bonus:

  • Seperti Mark menyebutkan dalam komentar, selain git pullpengaturan ini juga mempengaruhi perilaku default git push. Jika Anda terbiasa menggunakan -uuntuk menangkap cabang jarak jauh yang ingin Anda lacak, saya sarankan mengatur push.defaultnilai konfigurasi Anda upstream.
  • git push -u <remote> HEADakan mendorong cabang saat ini ke cabang dengan nama yang sama aktif <remote>(dan juga mengatur pelacakan sehingga Anda dapat melakukannya git pushsetelah itu).
dahlbyk
sumber
4
git push <remote> <branch>membuat hal-hal tidak ambigu . Jika Anda mematikan remote atau git cabang jatuh kembali pada pengaturan konfigurasi cabang, yang ditetapkan untuk Anda git push -u.
dahlbyk
2
@ Dahlbyk Saya telah pergi ke depan dan menandai Anda sebagai jawabannya, tetapi komentar itu agak membingungkan saya. Dalam jawaban Anda, Anda menunjukkan bahwa git itu bingung setelah git push origin test(yang tidak memiliki -u). Anda kemudian menunjukkan bahwa git push -u origin test menghapus ambiguitas. Apakah ada kesalahan ketik, atau apakah saya hanya menjadi padat lagi?
ClosureCowboy
1
Saya pikir kita berbicara melewati satu sama lain. :) Ketika saya katakan git push <remote> <branch>tidak ambigu, maksud saya relatif git pushyang bergantung pada konfigurasi cabang. Demikian pula, git pull <remote> <branch>tidak ambigu dan git pullbergantung pada konfigurasi cabang. Setelah Anda mendorong -u, keduanya git pushdan git pullakan bekerja seperti yang diharapkan.
dahlbyk
10
@dahlbyk: Jawaban Anda baik-baik saja, tetapi dalam komentar Anda di atas, Anda mengulangi kesalahpahaman umum tentang git push- kecuali jika Anda mengatur push.defaultsendiri, git pushhanya menggunakan konfigurasi cabang hulu untuk memutuskan jarak yang mendorong, bukan cabang jarak jauh untuk memperbarui.
Mark Longair
1
Praktik terbaik untuk git adalah git push origin masterdan sama dengan IE sisi lain. git pull origin master.. Jadi Jika misalkan perubahan cabang maka Anda bisa git push origin branch_namedan sama ke sisi lain IE. git pull origin branch_name
Arpit Vaishnav
87
git push -u origin master

… sama dengan:

git push origin master ; git branch --set-upstream master origin/master

Lakukan pernyataan terakhir, jika Anda lupa -u!

Atau Anda bisa memaksanya:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Jika Anda membiarkan perintah melakukannya untuk Anda, itu akan memilih kesalahan Anda seperti jika Anda mengetikkan cabang yang tidak ada atau tidak git remote add; meskipun itu mungkin yang Anda inginkan. :)

sabgenton
sumber
1
BTW masterhanyalah sebuah contoh :)
sabgenton
Ok bit kedua sekarang disusutkan dalam versi yang lebih baru untuk: git branch master -u origin/masterdetails @ stackoverflow.com/a/2286030/790359
sabgenton
2
Jika Anda lupa menggunakan -uopsi, ketik git push -usegera akan OK.
zeekvfu
1
Versi git yang lebih baru mengindikasikan bahwa --setup-upstreamakan usang: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Bill Hoag
--set-hulu sudah ditinggalkan, sekarang berfungsi:git branch --set-upstream-to=origin/master master
Alberto Perez
43

Secara lebih sederhana:

Secara teknis, -ubendera menambahkan referensi pelacakan ke server hulu yang Anda dorong.

Yang penting di sini adalah bahwa ini memungkinkan Anda melakukan git pulltanpa memberikan argumen lagi. Misalnya, setelah Anda melakukan git push -u origin master, Anda dapat menelepon git pulldan git kemudian akan tahu bahwa Anda benar-benar bermaksud git pull origin master.

Jika tidak, Anda harus mengetikkan seluruh perintah.

Adépòjù Olúwáségun
sumber
1
Jadi jika saya mengatur -ubendera untuk orgin mastersetiap tarikan berikutnya akan merujuknya. Dan jika saya ingin mengubah git pullperilaku yang harus saya jalankan git push -u origin some_other_branchdan git pullsekarang akan merujuk ke some_other_branch? Terima kasih!
Toma Tomov
1
bisakah kita juga menggunakan "git push" alih-alih menggunakan "git push origin master"?
cegprakash
Ya, Anda bisa @cegprakash. Namun, pada awalnya Anda akan melakukangit push -u origin master
Adépòjù Olúwáségun
-11

Semua perintah git bash yang diperlukan untuk mendorong dan menarik ke Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

Jika Anda ingin mengedit file, maka:

edit filename.* 

Untuk melihat semua cabang dan komitmennya:

git show-branch
Kamta Mishra
sumber
4
Saya pikir Anda menjawab di luar lingkup pertanyaan.
Adépòjù Olúwáségun