Git: διάγνωση repository και ανάκτηση ιστορικού — DedSec Project
Git: διάγνωση repository και ανάκτηση ιστορικού fatal: refusing to merge unrelated histories Ερμηνεία και διαφορική διάγνωση Το Git αναφέρει unrelated histories όταν οι δύο κορυφές δεν…
fatal: refusing to merge unrelated histories
Ερμηνεία και διαφορική διάγνωση
Το Git αναφέρει unrelated histories όταν οι δύο κορυφές δεν έχουν κοινό πρόγονο. Συμβαίνει αν έγινε ξεχωριστά git init τοπικά και δημιουργήθηκε README από το GitHub, ή όταν έχει ξαναγραφτεί το ιστορικό. Η συγχώνευση δεν είναι αυτονόητα σωστή: πρώτα έλεγξε αν πρόκειται πράγματι για το ίδιο project.
Αναπαραγωγή / έλεγχος χωρίς απώλεια δεδομένων
Το παρακάτω δείγμα είναι για δοκιμαστικό περιβάλλον. Μην εκτελείς εντολές που αλλάζουν πραγματικό remote ή παραγωγική υπηρεσία.
git remote -v
git fetch --prune origin
git log --graph --oneline --decorate --all -n 25
git merge-base HEAD origin/main || echo "No common ancestor"
# No mutation above except fetching remote objects.
# Only with verified intent and a backup:
# git merge --allow-unrelated-histories origin/main
Ερμηνεία αποτελεσμάτων και διόρθωση
Δες τα αρχικά commits με git rev-list --max-parents=0 HEAD και αντίστοιχα για origin/main. Έλεγξε το remote URL μήπως δείχνει σε άλλο project. Σύγκρινε δέντρα αρχείων και αποφάσισε ποιο ιστορικό είναι το σωστό. Αν συνδέθηκαν λάθος δύο διαφορετικά έργα, διόρθωσε το remote· μην χρησιμοποιείς --allow-unrelated-histories ως γενική λύση.
Πρακτικό εργαστήριο
Δημιούργησε δύο ανεξάρτητα προσωρινά repositories με ένα commit στο καθένα. Επιβεβαίωσε ότι αποτυγχάνει το merge-base, δοκίμασε συνειδητό merge μόνο σε αναλώσιμο αντίγραφο και εξέτασε το graph. Εξήγησε γιατί ένα force push δεν συμφιλιώνει τα ιστορικά.
detached HEAD
Ερμηνεία και διαφορική διάγνωση
Detached HEAD σημαίνει ότι το HEAD δείχνει σε συγκεκριμένο commit αντί για branch. Είναι φυσιολογικό για έλεγχο παλιού commit ή CI checkout, αλλά νέα commits μπορεί να γίνουν δυσπρόσιτα όταν αλλάξεις θέση εφόσον δεν τα κρατά branch. Δεν σημαίνει ότι χάλασε το repository.
Αναπαραγωγή / έλεγχος χωρίς απώλεια δεδομένων
git status -sb
git symbolic-ref -q --short HEAD || echo "Detached HEAD"
git log -1 --oneline
# If you created a valuable commit while detached:
# git switch -c preserve-experiment
# Alternatively find it via git reflog before cleanup.
Ερμηνεία αποτελεσμάτων και διόρθωση
Βρες το commit με git rev-parse HEAD. Πριν αλλάξεις branch, δημιούργησε νέο branch εκεί που βρίσκεσαι· το git switch -c δημιουργεί branch ενώ το git switch αλλάζει σε υπάρχον. Το reflog βοηθά στην ανάκτηση πρόσφατων μη προσπελάσιμων commits, αλλά δεν αποτελεί μόνιμο backup.
Πρακτικό εργαστήριο
Σε δοκιμαστικό repository φτιάξε δύο commits, κάνε switch --detach HEAD~1, πρόσθεσε τρίτο δοκιμαστικό commit και δημιούργησε branch. Έλεγξε με git branch --contains ότι παραμένει προσπελάσιμο. Δείξε ανάκτηση από reflog χωρίς force push.
repository not found
Ερμηνεία και διαφορική διάγνωση
Ο απομακρυσμένος server μπορεί να απαντήσει repository not found όταν είναι λάθος owner/name, το repository μετακινήθηκε ή διαγράφηκε, ή τα ενεργά credentials δεν έχουν πρόσβαση σε ιδιωτικό περιεχόμενο. Ορισμένοι πάροχοι αποκρύπτουν σκόπιμα την ύπαρξη private repos. Το ίδιο το μήνυμα δεν διαχωρίζει αυτές τις αιτίες.
Αναπαραγωγή / έλεγχος χωρίς απώλεια δεδομένων
git remote -v
git config --get remote.origin.url
git ls-remote origin HEAD
# For HTTPS test the exact known URL, not a guessed variant:
# git ls-remote https://github.com/OWNER/REPO.git HEAD
Ερμηνεία αποτελεσμάτων και διόρθωση
Επιβεβαίωσε τη διεύθυνση από εξουσιοδοτημένη συνεδρία browser και έλεγξε πιθανές μετονομασίες. Έλεγξε ποια ταυτότητα χρησιμοποιεί ο credential helper ή το SSH key, χωρίς εμφάνιση tokens. Για οργανισμούς επιβεβαίωσε δικαιώματα εγκατάστασης. Μη βάζεις tokens σε URL εντολών ή logs.
Πρακτικό εργαστήριο
Σε αναλώσιμο τοπικό repo όρισε σκόπιμα ανύπαρκτο απομακρυσμένο όνομα και κατέγραψε τον κωδικό εξόδου. Σύγκρινε με γνωστό προσβάσιμο repository. Εξήγησε γιατί το σφάλμα δεν αποδεικνύει ότι ένα private repo δεν υπάρχει.