informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
【topik terkait】
- Akan
commit
Rebase versi ke cabang lain- Lakukan rebase jika terjadi konflik versi
- Lakukan rebase interaktif pada versi tertentu
- Menggunakan rebasing interaktif untuk versi agregat
- Mengubah commiter menggunakan rebasing interaktif
- Versi agregasi otomatis
Rebase (Rebasing
) adalah fitur Git yang sangat kuat.Rebasing adalah jenis operasi: jika acommit
A Yang paling awal didasarkan padacommit
B dari; kemudianA Rebase keC, yaitu, kemauan A menjadi berdasarkanC operasi.
Dalam kasus demonstrasi berikut, Anda akan menemukan bahwa rebasing seringkali tidak semudah kelihatannya.
commit
Rebase versi ke cabang lain Pertama mari kita lihat jenis operasi rebase yang paling sederhana. Pekerjaan persiapan terkait: memperkenalkan file baru, mengirimkan, mengubah konten, dan mengirimkan lagi.Dengan cara ini, ada dua kali lipat lokalcommit
Versi: kapan.
Masih dengan jgit
Perpustakaan misalnya:
# Clone jgit repo into chapter4
$ git clone https://git.eclipse.org/r/jgit/jgit chapter4
$ cd chapter4
# Checkout a new branch
$ git checkout -b rebaseExample --track origin/stable-3.1
# Create the 1st commit
$ echo "My Fishtank
Gravel, water, plants
Fish, pump, skeleton" > fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Create the 2nd commit
$ echo "mosquitos" >> fishtank.txt
$ git add fishtank.txt
$ git commit -m "Feeding my fish"
# Rabase to stable-3.2
$ git rebase origin/stable-3.2
Successfully rebased and updated refs/heads/rebaseExample.
Sebelum melakukan rebasing:
Setelah dilakukan rebasing:
git rebase
Proses eksekusi:
HEAD
Versi umum antara cabang target yang ditunjuk oleh rebase (merge-base
);merge-base
, temukan semua versi yang hilang di cabang target;Jika sebuah commit
versi atau abranch
Rebase cabang ke cabang lainHEAD
, konflik versi mungkin terjadi.Pada titik ini konflik harus diselesaikan dan perintah dijalankangit rebase --continue
, rebase dapat diselesaikan.
Contoh-contoh di bagian ini menunjukkan bagaimana melakukan rebasing ketika ada konflik.Mengikuti hasil akhir yang ditunjukkan pada Bagian 4.1, kali inirebaseExample
Cabang telah diubah menjadistable-3.2
cabang.Contohnya akan memeriksa ulang cabang baru dari stable-3.1 dan menambahkan danrebaseExample
File teks dengan nama cabang yang sama tetapi isinya tidak kompatibelfishtank.txt
:
# Checkout rebaseExample2
$ git checkout -b rebaseExample2 --track origin/stable-3.1
# Add a new commit
$ echo "My Fishtank
Pirateship, Oister shell
Coconut shell
">fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Rebase conflicting branches
$ git rebase rebaseExample
Auto-merging fishtank.txt
CONFLICT (add/add): Merge conflict in fishtank.txt
error: could not apply 24f9bf1ef... My brand new fishtank2
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 24f9bf1ef... My brand new fishtank2
$ subl fishtank.txt
Situasi konfliknya adalah sebagai berikut:
Ubah ke konten berikut, simpan dan tutup:
Tambahkan file gabungan dan lanjutkan rebasing:
$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
Editor yang terbuka ditunjukkan pada gambar:
Konfirmasikan, simpan dan tutup, dan Anda akan melihat pesan bahwa rebase berhasil:
$ git rebase --continue
[detached HEAD 9911772b3] My brand new fishtank2
1 file changed, 2 insertions(+), 3 deletions(-)
Successfully rebased and updated refs/heads/rebaseExample2.
# Check new status via gitk
$ gitk
Detailnya adalah sebagai berikut:
Terlihat bahwa dalam rebase ini, hanya versi yang ada di cabang lama tetapi tidak di cabang baru yang akan direbase (artinya versi baru akan ditambahkan) commit
)。
Dalam informasi git prompt tentang gangguan rebase pertama, Anda juga dapat melihat dua alternatif:
git rebase --abort
: Sesuai arti harafiahnya, interupsi rebase
git rebase --skip
: Lewati konflik dan rebase secara langsung, yang akan menghasilkan rebaseExample2
Buang yang barucommit
, langsung digabungkan menjadi rebaseExample
, orang tua menunjuk setelah rebasing, dan rebaseExample
Konsisten:
Dalam contoh ini, kami menggunakan rebaseExample
Berdasarkan cabang, peragakan cara menggunakannya--interactive
Tandai, rebase keduanya di 4.1commit
Rebase ke cabang pelacakan jarak jauhstable-3.1
unggul:
$ git checkout rebaseExample
Switched to branch 'rebaseExample'
Your branch is ahead of 'origin/stable-3.1' by 109 commits.
(use "git push" to publish your local commits)
$ git rebase origin/stable-3.1
Saat ini, daftar komit akan ditampilkan di editor pop-up baru, dengan rentangnya rebaseExample
Danstable-3.1
di antaranya, semua dapat diubah menjadistable-3.1
daricommit
Catatan.Simpan dua hal baru sebagai contohcommit
, hapus semua sisanya (yaitu, konten pada baris 89 dan sebelumnya):
Setelah menyimpan, keluar dari editor dan Anda akan melihat keluaran berikut:
$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:
Hasilnya adalah sebagai berikut:
Contoh ekstensi
Dalam contoh ini, Anda juga dapat dengan cepat mencapai efek yang diinginkan melalui perintah:
$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
Diagram sebelum dan sesudah rebasing adalah sebagai berikut: