Έχω δημιουργήσει ένα απομακρυσμένο μη-γυμνό "main" repo και το κλωνοποίησα στον υπολογιστή μου. Έκανα κάποιες τοπικές αλλαγές, ενημέρωσα το τοπικό μου αποθετήριο και έσπρωξα τις αλλαγές πίσω στο απομακρυσμένο μου repo. Τα πράγματα ήταν μια χαρά μέχρι εκείνο το σημείο.
Τώρα, έπρεπε να αλλάξω κάτι στο απομακρυσμένο αποθετήριο. Τότε άλλαξα κάτι στο τοπικό μου αποθετήριο. Συνειδητοποίησα ότι η αλλαγή στο απομακρυσμένο αποθετήριο δεν ήταν απαραίτητη. Έτσι προσπάθησα να κάνω git push
από το τοπικό μου repo στο απομακρυσμένο repo, αλλά πήρα ένα σφάλμα όπως:
Για να μην χάσετε το ιστορικό, οι ενημερώσεις χωρίς γρήγορη προώθηση έγιναν απορρίφθηκε Συγχώνευση των απομακρυσμένων αλλαγών πριν από την εκ νέου προώθηση. Δείτε τη 'Σημείωση about fast-forwards' της ενότητας
git push --help
για λεπτομέρειες.
Σκέφτηκα ότι πιθανόν μια
git push --force
θα ανάγκαζε το τοπικό μου αντίγραφο να προωθήσει τις αλλαγές στο απομακρυσμένο και να το κάνει ίδιο. Αυτό αναγκάζει την ενημέρωση, αλλά όταν επιστρέφω στο απομακρυσμένο repo και κάνω μια δέσμευση, παρατηρώ ότι τα αρχεία περιέχουν ξεπερασμένες αλλαγές (αυτές που είχε προηγουμένως το κύριο απομακρυσμένο repo).
Όπως ανέφερα στα σχόλια σε μία από τις απαντήσεις:
[I] tried forcing, but when going back to master server to save the changes, i get outdated staging. Έτσι, όταν κάνω commit τα αποθετήρια δεν είναι τα ίδια. Και όταν προσπαθώ να χρησιμοποιήσω ξανά το git push, λαμβάνω το ίδιο σφάλμα.
Πώς μπορώ να διορθώσω αυτό το πρόβλημα;
Απλά κάντε το:
git push origin <your_branch_name> --force
ή αν έχετε ένα συγκεκριμένο repo:
git push https://git.... --force
Αυτό θα διαγράψει τις προηγούμενες δεσμεύσεις σας και θα προωθήσει την τρέχουσα.
Μπορεί να μην είναι σωστό, αλλά αν κάποιος πέσει πάνω σε αυτή τη σελίδα, σκέφτηκε ότι μπορεί να θέλει μια απλή λύση...
Σημειώστε επίσης ότι το -f
είναι η συντομογραφία του --force
, οπότε
git push origin <your_branch_name> -f
θα λειτουργήσει επίσης.
Πρώτα απ' όλα, δεν θα έκανα καμία αλλαγή απευθείας στο "main" repo. Αν θέλετε πραγματικά να έχετε ένα "main" repo, τότε θα πρέπει μόνο να το σπρώχνετε προς αυτό, ποτέ να μην το αλλάζετε άμεσα.
Όσον αφορά το σφάλμα που λαμβάνετε, έχετε δοκιμάσει το git pull
από το τοπικό σας repo, και στη συνέχεια το git push
στο κύριο repo; Αυτό που κάνετε αυτή τη στιγμή (αν κατάλαβα καλά) είναι να επιβάλλετε το push και μετά να χάσετε τις αλλαγές σας στο "main" repo. Θα πρέπει πρώτα να συγχωνεύσετε τις αλλαγές τοπικά.
Θα το συνιστούσα πραγματικά σε:
να προωθήσετε μόνο στο κύριο repo
βεβαιωθείτε ότι το κύριο αποθετήριο είναι ένα γυμνό αποθετήριο, ώστε να μην έχετε ποτέ πρόβλημα με το δέντρο εργασίας του κύριου αποθετηρίου να μην είναι συγχρονισμένο με τη βάση του .git
. Βλέπε "Πώς να προωθήσετε ένα τοπικό αποθετήριο git σε έναν άλλο υπολογιστή;",
Αν πρέπει να κάνετε τροποποίηση στο κύριο (γυμνό) repo, κλωνοποιήστε το (στον κύριο διακομιστή), κάντε την τροποποίησή σας και επαναφέρετε το push back σε αυτό
Με άλλα λόγια, κρατήστε ένα γυμνό repo προσβάσιμο τόσο από τον κεντρικό διακομιστή όσο και από τον τοπικό υπολογιστή, ώστε να έχετε ένα ενιαίο upstream repo από/προς το οποίο να τραβήξετε/τραβήξετε.