Berbagi teknologi

[Catatan Studi Git] Bab 4 Operasi git rebase rebase dan contoh terkait (Bagian 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Bab 4 Operasi rebase dan kasus terkait

【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

4.0 Pengantar rebasing

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.

4.1 kemauan 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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Sebelum melakukan rebasing:

Masukkan deskripsi gambar di sini

Setelah dilakukan rebasing:

Masukkan deskripsi gambar di sini

git rebase Proses eksekusi:

  1. naikkan HEAD Versi umum antara cabang target yang ditunjuk oleh rebase (merge-base);
  2. berdasarkan merge-base, temukan semua versi yang hilang di cabang target;
  3. Cobalah untuk menerapkan versi yang hilang satu per satu ke cabang target.

4.2 Melakukan rebasing jika terjadi konflik versi

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Situasi konfliknya adalah sebagai berikut:

Masukkan deskripsi gambar di sini

Ubah ke konten berikut, simpan dan tutup:

Masukkan deskripsi gambar di sini

Tambahkan file gabungan dan lanjutkan rebasing:

$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
  • 1
  • 2
  • 3

Editor yang terbuka ditunjukkan pada gambar:

Masukkan deskripsi gambar di sini

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Detailnya adalah sebagai berikut:

Masukkan deskripsi gambar di sini

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:

  1. git rebase --abort: Sesuai arti harafiahnya, interupsi rebase

  2. 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:

    Masukkan deskripsi gambar di sini


4.3 Lakukan rebase interaktif pada versi tertentu

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
  • 1
  • 2
  • 3
  • 4
  • 5

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):

Masukkan deskripsi gambar di sini

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:
  • 1
  • 2
  • 3

Hasilnya adalah sebagai berikut:

Masukkan deskripsi gambar di sini

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.
  • 1
  • 2

Diagram sebelum dan sesudah rebasing adalah sebagai berikut:

Masukkan deskripsi gambar di sini