Θέλω να απορρίψω όλες τις αλλαγές που έγιναν μετά τη δέσμευση <commit-hash>
.
Έτσι το έκανα:
git reset --hard <commit-hash>
Τώρα θέλω να κάνω το ίδιο με το απομακρυσμένο μου. Πώς μπορώ να το κάνω αυτό; Έχω κάνει κάποιες μεταβιβάσεις (και pushes) μετά το <commit-hash>
και θέλω απλά να τις απορρίψω όλες. Απλά κάτι πήγε φρικτά στραβά στον τρόπο και δεν θέλω να το κάνω χειρότερο από ότι είναι ήδη. ;(
Βασικά θέλω να γυρίσω πίσω το origin/master
μου στο <commit-hash>
Υποθέτοντας ότι το υποκατάστημά σας ονομάζεται master
τόσο εδώ όσο και απομακρυσμένα, και ότι το απομακρυσμένο σας ονομάζεται origin
θα μπορούσατε να κάνετε:
git reset --hard <commit-hash>
git push -f origin master
Ωστόσο, θα πρέπει να αποφύγετε να το κάνετε αυτό αν κάποιος άλλος εργάζεται με το απομακρυσμένο αποθετήριο σας και έχει τραβήξει τις αλλαγές σας. Σε αυτή την περίπτωση, θα ήταν καλύτερα να επαναφέρετε τις μεταβιβάσεις που δεν θέλετε, και στη συνέχεια να τις προωθήσετε κανονικά.
Επικαιροποίηση: εξηγήσατε παρακάτω ότι άλλοι άνθρωποι έχουν τραβήξει τις αλλαγές που προωθήσατε, οπότε είναι καλύτερο να δημιουργήσετε μια νέα δέσμευση που να ανακαλεί όλες αυτές τις αλλαγές. Υπάρχει μια ωραία εξήγηση των επιλογών σας για να το κάνετε αυτό στην αυτή την απάντηση από τον Jakub Narębski. Το ποια είναι πιο βολική εξαρτάται από το πόσα commits θέλετε να επαναφέρετε και ποια μέθοδος σας φαίνεται πιο λογική.
Δεδομένου ότι από την ερώτησή σας είναι σαφές ότι έχετε ήδη χρησιμοποιήσει το git reset --hard
για να επαναφέρετε τον κλάδο σας master
, ίσως χρειαστεί να ξεκινήσετε χρησιμοποιώντας το git reset --hard ORIG_HEAD
για να μετακινήσετε τον κλάδο σας πίσω στο σημείο που ήταν πριν. (Όπως πάντα με το git reset --hard
, βεβαιωθείτε ότι το git status
είναι καθαρό, ότι βρίσκεστε στο σωστό branch και ότι γνωρίζετε το git reflog
ως εργαλείο ανάκτησης προφανώς χαμένων commits). Θα πρέπει επίσης να ελέγξετε ότι το ORIG_HEAD
δείχνει στο σωστό commit, με το git show ORIG_HEAD
.
Επίλυση προβλημάτων:
Αν λάβετε ένα μήνυμα όπως το "! [remote rejected] a60f7d85 -> master (pre-receive hook declined)",
τότε πρέπει να επιτρέψετε την επανεγγραφή του ιστορικού κλάδου για τον συγκεκριμένο κλάδο. Στο BitBucket για παράδειγμα έλεγε "Rewriting branch history is not allowed". Υπάρχει ένα κουτάκι ελέγχου με το όνομα Allow rewriting branch history
το οποίο πρέπει να τσεκάρετε.
Χρησιμοποιήστε τις άλλες απαντήσεις αν δεν σας πειράζει να χάσετε τις τοπικές αλλαγές. Αυτή η μέθοδος μπορεί να καταστρέψει την απομακρυσμένη σας, αν επιλέξετε το λάθος hash δέσμευσης για να επιστρέψετε.
Αν θέλετε απλώς να κάνετε το απομακρυσμένο να ταιριάζει με ένα commit που βρίσκεται ήδη στον τοπικό σας κλάδο:
Μην κάνετε μην καμία επαναφορά.
Χρησιμοποιήστε το git log
για να βρείτε το hash του commit που θέλετε να είναι το remote. git log -p
για να δείτε τις αλλαγές, ή git log --graph --all --oneline --decorate
για να δείτε ένα συμπαγές δέντρο. (Το να έχετε αυτό το τελευταίο ως ψευδώνυμο στο κέλυφος σας είναι πολύ βολικό).
Αντιγράψτε το hash.
Εκτελέστε μια εντολή όπως:
<the-hash>:<the remote branch>,
π.χ.
git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
Έλυσα πρόβλημα όπως το δικό σας με αυτές τις εντολές:
git reset --hard <commit-hash>
git push -f <remote> <local branch>:<remote branch>