Mari kita lewati --ontosejenak. upstreamdan branchcukup mendasar, dan sebenarnya semacam meniru checkoutdan branch- argumen kedua adalah opsional:
git branch <newbranch>
git branch <newbranch> <base>
git checkout -b <newbranch>
git checkout -b <newbranch> <base>
git rebase <upstream>
git rebase <upstream> <branch>
(Selain, nama-nama argumen ini di rebase, "hulu" dan "cabang" tidak sangat deskriptif IMO Saya biasanya menganggap mereka seperti peachoftree,. <start>Dan <end>, yang adalah bagaimana saya akan menggunakan mereka: git rebase <start> <end>)
Ketika cabang kedua dihilangkan, hasilnya hampir sama dengan pertama memeriksa cabang itu dan kemudian melakukannya seolah-olah Anda tidak menentukan cabang itu. Pengecualiannya adalah branchyang tidak mengubah cabang Anda saat ini:
git checkout <base> && git branch <newbranch> && git checkout <previous_branch>
git checkout <base> && git checkout -b <newbranch>
git checkout <end> && git rebase <start>
Sedangkan untuk memahami apa yang rebasedilakukan ketika dipanggil, saya pertama kali mulai dengan menganggapnya sebagai jenis penggabungan khusus. Ini tidak benar-benar, tetapi membantu ketika pertama kali mulai memahami rebase. Untuk meminjam contoh peachoftree:
A--B--F--G master
\
C--D--E feature
Sebuah git merge masterhasil ini:
A--B--F-----G master
\ \
C--D--E--H feature
Sementara a git rebase master(while on branch feature!) Menghasilkan ini:
A--B--F--G master
\
C'--D'--E' feature
Dalam kedua kasus, featuresekarang berisi kode dari keduanya masterdan feature. Jika Anda tidak aktif feature, argumen kedua dapat digunakan untuk beralih ke pintasan: git rebase master featureakan melakukan hal yang sama seperti di atas.
Sekarang, untuk yang spesial --onto. Bagian penting untuk diingat dengan ini adalah bahwa itu default <start>jika tidak ditentukan. Jadi di atas, jika saya tentukan --ontosecara spesifik, ini akan menghasilkan hal yang sama:
git rebase --onto master master
git rebase --onto master master feature
(Saya tidak menggunakan --ontotanpa menentukan <end>hanya karena mental lebih mudah diurai, bahkan berpikir keduanya sama jika sudah aktif feature.)
Untuk melihat mengapa --ontobermanfaat, berikut ini contoh yang berbeda. Katakanlah saya aktif featuredan melihat ada bug, yang kemudian saya mulai perbaiki - tetapi bercabang featurebukan masterkarena kesalahan:
A--B--F--G master
\
C--D--E feature
\
H--I bugfix
Yang saya inginkan adalah "memindahkan" komitmen ini bugfixagar tidak lagi bergantung feature. Seperti itu, segala jenis penggabungan atau rebase yang ditunjukkan di atas dalam jawaban ini akan mengambil tiga featurekomit bersama dengan dua bugfixkomit.
Misalnya git rebase master bugfixsalah. Kisaran <start>untuk <end>terjadi untuk memasukkan semua komit dari feature, yang diputar di atas master:
A--B--F--G master
\ \
\ C'--D'--E'--H'--I' bugfix
\
C--D--E feature
Apa yang kita benar-benar inginkan adalah kisaran komit dari featureke bugfixakan diputar di atas master. Itulah --ontogunanya - menentukan target "replay" yang berbeda dari cabang "start":
git rebase --onto master feature bugfix
A--B--F--G master
\ \
\ H'--I' bugfix
\
C--D--E feature