Git – Machen Sie den lokalen HEAD zum neuen Master

Lesezeit: 5 Minuten

Ich beschloss, ein paar Commits zurückzugehen, weil der Pfad, dem ich folgte, falsch war. Also habe ich ausgecheckt Added cordova to .gitignore committen und einige Änderungen vorgenommen. Wie unten abgebildet:

Geben Sie hier die Bildbeschreibung ein

Jetzt, wo ich drücken Bei den neuen Modifikationen erscheint eine Fehlermeldung:
error: src refspec (detached from aad6423) does not match any.

Wie kann ich Git anweisen, die vorherigen Commits (in Lila) zu verwerfen und mit meinem lokalen HEAD als Master fortzufahren?

  • Wenn Sie mit anderen Personen zusammenarbeiten, wäre die richtige Vorgehensweise wahrscheinlich, Ihre Änderungen rückgängig zu machen master. siehe stackoverflow.com/a/1470452/671543

    – njzk2

    12. November 2014 um 16:47 Uhr


  • Mögliches Duplikat von Git: Verschiebe den Zweigzeiger auf einen anderen Commit

    – Andreas C

    12. November 2014 um 16:50 Uhr

  • Noch eine weitere einfache Aufgabe, die durch Git erschwert wird. Die Git-Entwickler sollten Stack Overflow als Feedback in ihrer SDLC-Schleife verwenden. Sie müssen einen UX-Experten einstellen, weil sie es eindeutig nicht alleine schaffen können.

    – jww

    22. August 2017 um 21:03 Uhr

Machen Sie HEAD zu Ihrem neuen Lokal master:

$ git checkout -B master

Erzwingen Sie Ihre Änderungen:

$ git push -f

  • Dies kann gefährlich sein, wenn Sie mit anderen zusammenarbeiten. Seien Sie sich bewusst, dass Force Pushing die Geschichte umschreiben wird, was dazu führt, dass andere mit der neuen Geschichte umgehen müssen.

    – Brian J

    12. November 2014 um 16:48 Uhr

  • @ BrianJ Einverstanden, Max ‘Antwort lautet, was Sie in 99% der Fälle tun sollten. Aber so machst du genau das, was das OP gefragt hat.

    – Tavian Barnes

    12. November 2014 um 16:50 Uhr

  • Das ist für mich wie Magie. 🙂 Ich benutze übrigens Sourcetree. Gefährlich für andere, aber ich hatte den gleichen Fall mit OP. Ich brauchte meinen KOPF, um der Meister zu sein. Vielen Dank!

    – Glenn Posadas

    28. Dezember 2017 um 16:37 Uhr

  • Dies ist die richtige Antwort, wenn Sie sich nicht für Entwickler und Geschichte und all den anderen Hokuspokus interessieren. Ich möchte einfach nur MEIN Repo wieder auf Kurs bringen … das macht es gut.

    – d’Artagnan Immergrüner Barbosa

    15. April 2020 um 18:08 Uhr

Benutzer-Avatar
max

Auch wenn Sie diesen alten Zweig nicht mehr wollen, mag Git es wirklich nicht, den Verlauf umzuschreiben oder Änderungen zu verwerfen. Einfach zurücksetzen und zusammenführen.

git branch new_master              # name current detached HEAD
git checkout master                # switch back to master
git revert --no-edit HEAD~4..HEAD  # create commits reverting back to where the history split
git merge new_master               # merge
git branch -d new_master           # don't need it anymore

  • Ich denke, das ist die richtige Antwort, obwohl ich es nicht versucht habe. Wenn Sie bereits in das Remote-Repository gepusht haben, können Sie Ihre Änderungen grundsätzlich mit überschreiben git push -f, aber das ist etwas asozial, besonders wenn andere Entwickler bereits mit Ihren Änderungen synchronisiert haben. An dieser Stelle müssen Sie einen Reverse-Patch anwenden master Dadurch wird es wieder so, wie es vor der Gabelung war, und wenden Sie dann Ihr neues an HEAD verpflichte dich dazu und drücke dann.

    – Eduard Falk

    12. November 2014 um 16:48 Uhr

  • du kannst rebasen topic wenn Sie keine Diamanten mögen (oder sogar Rosinen auswählen, da es anscheinend nur 1 Commit gibt)

    – njzk2

    12. November 2014 um 16:49 Uhr

  • Noch eine weitere einfache Aufgabe, die durch Git erschwert wird. Die Git-Entwickler sollten Stack Overflow als Feedback in ihrer SDLC-Schleife verwenden. Sie müssen einen UX-Experten einstellen, weil sie es eindeutig nicht alleine schaffen können.

    – jww

    22. August 2017 um 21:03 Uhr

  • Ich denke, das ist eigentlich eine ziemlich komplizierte Aufgabe. Sie haben zwei völlig widersprüchliche Codezweige, von denen einer bereits in ein Remote-Repository gepusht ist (das andere Entwickler möglicherweise bereits gezogen haben), und Sie möchten sie in Einklang bringen. Es gibt mehrere Möglichkeiten, dies zu tun, daher erwarte ich nicht, dass git es automatisch handhabt.

    – max

    24. August 2017 um 22:22 Uhr

Benutzer-Avatar
pjz

Also würde ich das in ein paar Schritten machen:

git checkout -b new_master

um einen guten Hinweis darauf zu bekommen, was Sie als neuen Meister haben möchten.

git checkout master ; git checkout -b old_master

um einen Hinweis auf den alten Meister zu behalten, falls Sie zurückgehen wollen oder etwas später; Sie können diesen Zweig später jederzeit löschen, wenn Sie sich sicher sind.

git checkout master ; git reset --hard new_master

Dadurch wird der HEAD des Zweigs, auf dem Sie sich befinden (master), auf die angegebene Referenz (new_master) zurückgesetzt.

git push -f origin

Dadurch wird ein Force-Push Ihres neuen Master-Zweigs auf die Fernbedienung durchgeführt. Beachten Sie, dass dies eine schlechte Vorgehensweise ist, wenn jemand anderes Ihr Remote-Repo verwendet, da dies möglicherweise deren Abrufe / Pulls unterbricht.

  • Was ist Gitco? Ah, es ist Git-Checkout.

    – Eoin

    16. August 2019 um 21:04 Uhr


  • Danke, ich fand diese Antwort am logischsten und am wenigsten beängstigend, da ich glaube, dass sie alles gesichert und keine Probleme verursacht hat.

    – Eoin

    16. August 2019 um 21:08 Uhr

Da Sie eine Divergenz haben, müssen Sie den entfernten Master zerstören und die lokale Version hochschieben. Je nach vorhandener Sicherheit ist dies möglicherweise nicht möglich. Dies hat auch andere Implikationen, je nachdem, wer sonst noch auf Master basierende Arbeit leistet. Dies sollte mit äußerster Vorsicht erfolgen.

git push origin :master // deletes remote master
git push origin master  // pushes local master to remote

Ein anderer (wahrscheinlich besserer) Ansatz wäre, die Commits auf Master zurückzusetzen und die Reverts (die selbst Commits sind) zu committen. Wählen Sie dann die Arbeit aus, die Sie in Ihrem Lokal erledigt haben. Erstellen Sie zunächst lokal einen neuen Themenzweig, um Ihre Arbeit zu speichern.

git checkout -b <topic_branch_name>  // create new branch to save local work
git checkout master
git reset --hard HEAD // sync local master to remote HEAD

git revert <last commit to master>
git revert <second-to-last commit to master>
...
git revert <Added cordova to .gitignore commit>
git push

git cherry-pick <commit hash from topic branch commit(s)>

Benutzer-Avatar
Dan

Da Sie die Änderungen in den Upstream verschoben haben, ist es besser, sie mit einem anderen Commit rückgängig zu machen. Ein Commit, das die Änderungen rückgängig macht. Das Entfernen von Commits oder Branches von Upstream ist Schlecht trainieren. Weitere Informationen finden Sie in dieser Antwort.

  • @EdwardFalk Nur der Push zum neuen Commit ist fehlgeschlagen. Aber wenn der Zweig geändert wird (entfernen Sie die bereits gepushten Commits), wird dies Konflikte für alle anderen Entwickler auslösen.

    – Dan

    12. November 2014 um 16:47 Uhr

  • @EdwardFalk Nur der Push zum neuen Commit ist fehlgeschlagen. Aber wenn der Zweig geändert wird (entfernen Sie die bereits gepushten Commits), wird dies Konflikte für alle anderen Entwickler auslösen.

    – Dan

    12. November 2014 um 16:47 Uhr

1054520cookie-checkGit – Machen Sie den lokalen HEAD zum neuen Master

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy