Πώς να αντικαταστήσετε τον κύριο κλάδο στο Git, εξ ολοκλήρου, από έναν άλλο κλάδο;

Λύση

Θα πρέπει να μπορείτε να χρησιμοποιήσετε τη στρατηγική συγχώνευσης "ours" για να αντικαταστήσετε το master με seotweaks όπως αυτό:

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

Το αποτέλεσμα θα πρέπει να είναι το master σας να είναι τώρα ουσιαστικά seotweaks.

(το "s ours" είναι συντομογραφία του "στρατηγική=δικός μας")

Από τα έγγραφα σχετικά με τη στρατηγική 'ours':

Αυτό επιλύει οποιονδήποτε αριθμό κεφαλών, αλλά το δέντρο που προκύπτει από τη συγχώνευση είναι πάντα αυτό της τρέχουσας κεφαλής του κλάδου, αγνοώντας ουσιαστικά όλες τις αλλαγές από όλους τους άλλους κλάδους. Προορίζεται να χρησιμοποιηθεί για να αντικαταστήσει το παλιό ιστορικό ανάπτυξης των πλευρικών κλάδων. Σημειώστε ότι αυτό διαφέρει από την επιλογή -Xours της αναδρομικής στρατηγικής συγχώνευσης.

Ενημέρωση από σχόλια: Αν λάβετε το μοιραίο: απόρριψη συγχώνευσης άσχετων ιστοριών, τότε αλλάξτε τη δεύτερη γραμμή σε αυτή: git merge --allow-unrelated-histories -s ours master

Σχόλια (39)

Τι θα λέγατε να χρησιμοποιήσετε το git branch -m για να μετονομάσετε το master branch σε ένα άλλο, και στη συνέχεια να μετονομάσετε το seotweaks branch σε master? Κάτι τέτοιο:

git branch -m master old-master
git branch -m seotweaks master
git push -f origin master

Αυτό μπορεί να αφαιρέσει commits στο origin master, παρακαλούμε ελέγξτε το origin master σας πριν εκτελέσετε το git push -f origin master.

Σχόλια (16)

Μπορείτε να μετονομάσετε/αφαιρέσετε το master στο remote, αλλά αυτό θα είναι ένα πρόβλημα αν πολλοί άνθρωποι έχουν βασίσει τη δουλειά τους στο remote master branch και έχουν τραβήξει αυτό το branch στο τοπικό τους repo.
Αυτό μπορεί να μην συμβαίνει εδώ, αφού όλοι φαίνεται να εργάζονται στον κλάδο "seotweaks".

Σε αυτή την περίπτωση μπορείτε να:
git remote --show μπορεί να μην λειτουργήσει. (Κάντε ένα git remote show για να ελέγξετε πώς είναι δηλωμένο το remote σας μέσα στο τοπικό σας repo. Θα υποθέσω ότι είναι origin) (Όσον αφορά το GitHub, τα σχόλια του house9: "Έπρεπε να κάνω ένα επιπλέον βήμα, να πατήσω το κουμπί Admin στο GitHub και να ορίσω το Default Branch σε κάτι διαφορετικό από το master και μετά να το επαναφέρω")

git branch -m master master-old  # rename master on local
git push origin :master          # delete master on remote
git push origin master-old       # create master-old on remote
git checkout -b master seotweaks # create a new local master on top of seotweaks
git push origin master           # create master on remote

Αλλά και πάλι:

  • αν άλλοι χρήστες προσπαθήσουν να κάνουν pull ενώ ο master έχει διαγραφεί στο remote, τα pulls τους θα αποτύχουν ("no such ref on remote")
  • όταν το master ξαναδημιουργείται στο remote, ένα pull θα προσπαθήσει να συγχωνεύσει αυτό το νέο master στο τοπικό τους (τώρα παλιό) master: πολλές συγκρούσεις. Στην πραγματικότητα πρέπει να reset --hard το τοπικό τους master στο remote/master branch που θα πάρουν, και να ξεχάσουν το τρέχον master τους.
Σχόλια (6)