527 Stimmen

Git Pull nach erzwungenem Update

Ich habe gerade einige Commits mit git rebase und machte eine git push --force (was böse ist, ich weiß).

Die anderen Software-Ingenieure haben eine andere Geschichte, und wenn sie eine git pull wird Git zusammengeführt. Gibt es eine Möglichkeit, dies zu beheben, außer eine rm my-repo; git clone git@example.org:my-repo.git ?

Ich brauche so etwas wie das Gegenteil von git push --force aber git pull --force nicht zu den gewünschten Ergebnissen geführt hat.

755voto

AD7six Punkte 59030

Um die neuen Übertragungen zu erhalten

git fetch

Zurücksetzen

Sie können die Übergabe für einen lokalen Zweig zurücksetzen, indem Sie git reset .

Um den Commit eines lokalen Zweigs zu ändern:

git reset origin/main --hard

Seien Sie jedoch vorsichtig, wie es in der Dokumentation heißt:

Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an verfolgten Dateien im Arbeitsbaum seit <commit> werden verworfen.

Wenn Sie alle Änderungen, die Sie lokal vorgenommen haben, tatsächlich behalten wollen, führen Sie eine --soft stattdessen zurücksetzen. Dadurch wird die Commit-Historie für den Zweig aktualisiert, aber es werden keine Dateien im Arbeitsverzeichnis geändert (und Sie können sie dann committen).

Rebase

Sie können Ihre lokalen Commits zusätzlich zu jeder anderen Commit/Branch wiedergeben, indem Sie git rebase :

git rebase -i origin/main

Dadurch wird rebase im interaktiven Modus aufgerufen, in dem Sie auswählen können, wie jeder einzelne Commit, der sich nicht in der Historie befindet, auf die Sie rebasen wollen, angewendet werden soll.

Wenn die von Ihnen entfernten Commits (mit git push -f ) bereits in die lokale Historie gezogen wurden, werden sie als Commits aufgelistet, die erneut angewendet werden - sie müssten als Teil des Rebase gelöscht werden oder sie werden einfach wieder in die Historie des Zweigs aufgenommen - und tauchen beim nächsten Push wieder in der entfernten Historie auf.

Verwenden Sie die Hilfe git command --help für weitere Details und Beispiele zu jedem der oben genannten (oder anderen) Befehle.

114voto

herman Punkte 10467

Ziehen mit rebase

Ein normaler Pull ist fetch + merge, aber was Sie wollen ist fetch + rebase. Dies ist eine Option mit dem pull Befehl:

git pull --rebase

In Ihrem speziellen Fall wurden Commits entfernt, die Sie nicht erneut anwenden möchten. Dies muss manuell geschehen. Daher muss der Rebase interaktiv sein, damit diese Übertragungen übersprungen werden können:

git pull --rebase=interactive

oder ab Git 2.26 kann zu verkürzt werden:

git pull --rebase=i

21voto

Tom Prats Punkte 6668

Dies wird nicht Zweige reparieren, die bereits den Code enthalten, den Sie nicht haben wollen (siehe unten, wie man das macht), aber wenn sie irgendeinen Zweig gezogen haben und nun wollen, dass er sauber ist (und nicht "vor" dem Ursprung/irgendeinem Zweig), dann können Sie einfach:

git checkout some-branch   # where some-branch can be replaced by any other branch
git branch base-branch -D  # where base-branch is the one with the squashed commits
git checkout -b base-branch origin/base-branch  # recreating branch with correct commits

Hinweis: Sie können alle diese Funktionen kombinieren, indem Sie && dazwischen setzen

Anmerkung2: Florian erwähnte dies in einem Kommentar, aber wer liest schon Kommentare, wenn er nach Antworten sucht?

Hinweis3: Wenn Sie verunreinigte Zweige haben, können Sie neue Zweige erstellen, die auf dem neuen "dummen Zweig" basieren, und einfach Übertragungen (cherry-picking) übernehmen.

Ex:

git checkout feature-old  # some branch with the extra commits
git log                   # gives commits (write down the id of the ones you want)
git checkout base-branch  # after you have already cleaned your local copy of it as above
git checkout -b feature-new # make a new branch for your feature
git cherry-pick asdfasd   # where asdfasd is one of the commit ids you want
# repeat previous step for each commit id
git branch feature-old -D # delete the old branch

Jetzt ist feature-new Ihr Zweig ohne die zusätzlichen (möglicherweise schlechten) Commits!

13voto

Gayan Weerakutti Punkte 8759

Um Änderungen aus dem entfernten Repository in Ihr lokales Repository zu holen:

git fetch

Benennen Sie den Verfolgungszweig um:

git branch -m <old-branch-name> <new-name>

Erstellen Sie einen neuen lokalen Zweig, der den entfernten Zweig verfolgt:

git checkout -b <old-branch-name>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X