Mari kita lewati --onto
sejenak. upstream
dan branch
cukup mendasar, dan sebenarnya semacam meniru checkout
dan 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 branch
yang 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 rebase
dilakukan 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 master
hasil 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, feature
sekarang berisi kode dari keduanya master
dan feature
. Jika Anda tidak aktif feature
, argumen kedua dapat digunakan untuk beralih ke pintasan: git rebase master feature
akan 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 --onto
secara spesifik, ini akan menghasilkan hal yang sama:
git rebase --onto master master
git rebase --onto master master feature
(Saya tidak menggunakan --onto
tanpa menentukan <end>
hanya karena mental lebih mudah diurai, bahkan berpikir keduanya sama jika sudah aktif feature
.)
Untuk melihat mengapa --onto
bermanfaat, berikut ini contoh yang berbeda. Katakanlah saya aktif feature
dan melihat ada bug, yang kemudian saya mulai perbaiki - tetapi bercabang feature
bukan master
karena kesalahan:
A--B--F--G master
\
C--D--E feature
\
H--I bugfix
Yang saya inginkan adalah "memindahkan" komitmen ini bugfix
agar tidak lagi bergantung feature
. Seperti itu, segala jenis penggabungan atau rebase yang ditunjukkan di atas dalam jawaban ini akan mengambil tiga feature
komit bersama dengan dua bugfix
komit.
Misalnya git rebase master bugfix
salah. 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 feature
ke bugfix
akan diputar di atas master
. Itulah --onto
gunanya - 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