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?
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 lokalOrigin/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.
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.
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
.
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
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.
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.
Omong-omong, pintasan untuk mendorong cabang saat ini ke jarak jauh dengan nama yang sama:
$ git Push -u Origin HEAD
git branch --set-upstream-to=Origin/master<branch_name>
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.
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"
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!
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"
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
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
Anda juga dapat melakukan git Push -u Origin $(current_branch)
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.
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
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.
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'