Κοινή χρήση τεχνολογίας

[Σημειώσεις μελέτης Git] Κεφάλαιο 4 Λειτουργία rebase git rebase και σχετικά παραδείγματα (Μέρος 1)

2024-07-12

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

Κεφάλαιο 4 Λειτουργίες επαναβάσεως και συναφείς περιπτώσεις

【σχετικό θέμα】

  • Θα commit Επαναλάβετε την έκδοση σε άλλο κλάδο
  • Εκτελέστε rebase σε περίπτωση διένεξης έκδοσης
  • Εκτελέστε μια διαδραστική επαναφορά σε μια καθορισμένη έκδοση
  • Χρήση διαδραστικής επαναφοράς για τη συγκέντρωση εκδόσεων
  • Αλλαγή committer με χρήση διαδραστικής επαναφοράς
  • Έκδοση αυτόματης συγκέντρωσης

4.0 Εισαγωγή στο rebasing

Επαναφορά (Rebasing ) είναι ένα εξαιρετικά ισχυρό χαρακτηριστικό του Git.Το rebasing είναι ένας τύπος λειτουργίας: εάν αcommit ΕΝΑ Το παλαιότερο βασίστηκε σεcommit σι του?ΕΝΑ Επαναφορά σεντο, δηλαδή θα ΕΝΑ βασίζονται σεντο λειτουργία.

Στην ακόλουθη περίπτωση επίδειξης, θα διαπιστώσετε ότι το rebasing συχνά δεν είναι τόσο εύκολο όσο φαίνεται.

4.1 θα commit Επαναλάβετε την έκδοση σε άλλο κλάδο

Ας δούμε πρώτα τον απλούστερο τύπο λειτουργίας επαναβάσεως. Σχετικές εργασίες προετοιμασίας: εισαγάγετε ένα νέο αρχείο, υποβάλετε, αλλάξτε το περιεχόμενο και υποβάλετε ξανά.Με αυτόν τον τρόπο, υπάρχουν δύο φορές το τοπικόcommit Εκδοχή.

Ακόμα με jgit Βιβλιοθήκη για παράδειγμα:

# 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

Πριν από την αναβάθμιση:

Εισαγάγετε την περιγραφή της εικόνας εδώ

Μετά την αναβάθμιση:

Εισαγάγετε την περιγραφή της εικόνας εδώ

git rebase Η διαδικασία εκτέλεσης:

  1. εμφανιζομαι HEAD Η κοινή έκδοση μεταξύ του κλάδου προορισμού που επισημαίνεται από το rebase (merge-base);
  2. βασισμένο στο merge-base, βρείτε όλες τις εκδόσεις που λείπουν στον κλάδο προορισμού.
  3. Προσπαθήστε να εφαρμόσετε τις εκδόσεις που λείπουν μία προς μία στον κλάδο προορισμού.

4.2 Εκτέλεση rebasing σε περίπτωση διένεξης έκδοσης

Αν ένα commit έκδοση ή αbranch Επαναλάβετε έναν κλάδο σε διαφορετικόHEAD , είναι πιθανό να προκύψουν διενέξεις έκδοσης.Σε αυτό το σημείο πρέπει να επιλυθεί η διένεξη και να εκτελεστεί η εντολήgit rebase --continue, η επαναφορά μπορεί να ολοκληρωθεί.

Τα παραδείγματα σε αυτήν την ενότητα καταδεικνύουν τον τρόπο με τον οποίο μπορείτε να ολοκληρώσετε την επαναφορά της βάσης παρουσία συγκρούσεων.Μετά το τελικό αποτέλεσμα που παρουσιάζεται στην Ενότητα 4.1, αυτή τη φοράrebaseExample Το υποκατάστημα έχει επανατοποθετηθεί σεstable-3.2 κλαδί.Το παράδειγμα θα ελέγξει ξανά τον νέο κλάδο από το stable-3.1 και θα προσθέσει ένα καιrebaseExample Αρχεία κειμένου με το ίδιο όνομα κλάδου αλλά μη συμβατό περιεχόμενοfishtank.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

Η κατάσταση της σύγκρουσης έχει ως εξής:

Εισαγάγετε την περιγραφή της εικόνας εδώ

Αλλαγή στο ακόλουθο περιεχόμενο, αποθήκευση και κλείσιμο:

Εισαγάγετε την περιγραφή της εικόνας εδώ

Προσθέστε τα συγχωνευμένα αρχεία και συνεχίστε την επαναφορά βάσης:

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

Ο επεξεργαστής που ανοίγει φαίνεται στο σχήμα:

Εισαγάγετε την περιγραφή της εικόνας εδώ

Επιβεβαιώστε, αποθηκεύστε και κλείστε και θα δείτε ένα μήνυμα ότι η επαναφορά ήταν επιτυχής:

$ 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

Λεπτομέρειες έχουν ως εξής:

Εισαγάγετε την περιγραφή της εικόνας εδώ

Μπορεί να φανεί ότι αυτή η επαναφορά θα επαναφέρει μόνο την έκδοση που έχει ο παλιός κλάδος, αλλά ο νέος κλάδος δεν έχει (δηλαδή, προσθέστε μια νέα έκδοση) commit)。

Στις πληροφορίες προτροπής git της πρώτης διακοπής επαναφοράς, μπορείτε επίσης να δείτε δύο εναλλακτικές:

  1. git rebase --abort: Ως κυριολεκτική σημασία, διακόψτε την επαναφορά

  2. git rebase --skip: Παράβλεψη διενέξεων και επαναφορά απευθείας, κάτι που θα έχει ως αποτέλεσμα rebaseExample2 Απορρίψτε το νέοcommit, συγχωνεύτηκαν άμεσα σε rebaseExample, έδειξε ο γονέας μετά την επαναφορά και rebaseExample Σταθερός:

    Εισαγάγετε την περιγραφή της εικόνας εδώ


4.3 Εκτελέστε διαδραστική επαναφορά σε μια καθορισμένη έκδοση

Σε αυτό το παράδειγμα, χρησιμοποιούμε το rebaseExample Με βάση τους κλάδους, δείξτε πώς να το χρησιμοποιήσετε--interactive Mark, επαναλάβετε τα δύο στο 4.1commit Επαναφορά σε κλάδο απομακρυσμένης παρακολούθησηςstable-3.1 ανώτερος:

$ 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

Αυτή τη στιγμή, μια λίστα δέσμευσης θα εμφανιστεί στο νέο αναδυόμενο πρόγραμμα επεξεργασίας, με το εύρος rebaseExample καιstable-3.1 μεταξύ, όλα μπορούν να βασιστούν σεstable-3.1 τουcommit Ρεκόρ.Κρατήστε τα δύο νέα στο παράδειγμαcommit, διαγράψτε όλα τα υπόλοιπα (δηλαδή το περιεχόμενο στη γραμμή 89 και πριν):

Εισαγάγετε την περιγραφή της εικόνας εδώ

Μετά την αποθήκευση, βγείτε από το πρόγραμμα επεξεργασίας και θα δείτε την ακόλουθη έξοδο:

$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:
  • 1
  • 2
  • 3

Το αποτέλεσμα είναι το εξής:

Εισαγάγετε την περιγραφή της εικόνας εδώ

Παράδειγμα επέκτασης

Σε αυτό το παράδειγμα, μπορείτε επίσης να επιτύχετε γρήγορα το επιθυμητό αποτέλεσμα μέσω μιας εντολής:

$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2

Το διάγραμμα πριν και μετά την αναβάθμιση έχει ως εξής:

Εισαγάγετε την περιγραφή της εικόνας εδώ