Ich habe nur ein paar Commits mit gequetscht git rebase
und ein gemacht git push --force
(was böse ist, ich weiß).
Jetzt haben die anderen Softwareentwickler eine andere Historie und wenn sie eine machen git pull
, wird Git zusammengeführt. Gibt es eine Möglichkeit, dies zu beheben, außer eine rm my-repo; git clone [email protected]:my-repo.git
?
Ich brauche so etwas wie das Gegenteil von git push --force
, habe aber git pull --force
nicht die beabsichtigten Ergebnisse geliefert.
git checkout master && git branch -D test && git checkout -b test origin/test
Antworten:
Um die neuen Commits zu erhalten
Zurücksetzen
Sie können das Commit für einen lokalen Zweig mithilfe von zurücksetzen
git reset
.So ändern Sie das Commit eines lokalen Zweigs:
Seien Sie jedoch vorsichtig, wie es in der Dokumentation heißt:
Wenn Sie die Änderungen, die Sie lokal vorgenommen haben, tatsächlich beibehalten möchten, führen Sie
--soft
stattdessen einen Reset durch. Dadurch wird der Festschreibungsverlauf für den Zweig aktualisiert, es werden jedoch keine Dateien im Arbeitsverzeichnis geändert (und Sie können sie dann festschreiben).Rebase
Sie können Ihre lokalen Commits zusätzlich zu jedem anderen Commit / Zweig wiedergeben, indem Sie
git rebase
:Dadurch wird die Rebase im interaktiven Modus aufgerufen, in dem Sie auswählen können, wie jedes einzelne Commit angewendet werden soll, das nicht in dem Verlauf enthalten ist, auf dem Sie die Rebasis durchführen.
Wenn die Commits, die Sie entfernt haben (mit
git push -f
), bereits in den lokalen Verlauf aufgenommen wurden, werden sie als Commits aufgeführt, die erneut angewendet werden. Sie müssten im Rahmen der Neueinstellung gelöscht werden oder werden einfach wieder in den Verlauf aufgenommen für den Zweig - und erscheinen beim nächsten Push wieder in der Remote-Historie.In der Hilfe finden Sie
git command --help
weitere Details und Beispiele zu den oben genannten (oder anderen) Befehlen.quelle
git reset origin/otherbranch --hard
reset --hard
, oder Option 2:reset --soft
+rebase
, nicht wahr?git reset --soft origin/master
ändert den Festschreibungsverlauf so, dass die Unterschiede zwischen Fernbedienung und Stufe mit der Fernbedienung übereinstimmen, die dann festgeschrieben werden . In diesem Szenario wäre keine Neubasis erforderlich (und Sie würden aufgrund der nicht festgeschriebenen Änderungen daran gehindert), da es keinen Unterschied im Festschreibungsverlauf gibt. Die beiden Optionen sind Zurücksetzen oder Wiederherstellen - keine Kombination aus beiden. Bitte stellen Sie eine Frage, wenn Ihr Szenario anders ist als das, das ich hier beantwortet habe.Dadurch werden keine Zweige repariert, die bereits den Code enthalten, den Sie nicht möchten (siehe unten, wie das geht), aber wenn sie einen Zweig gezogen haben und jetzt möchten, dass er sauber ist (und nicht "voraus") Ursprung / irgendein Zweig) dann einfach:
Hinweis: Sie können diese alle kombinieren, indem Sie && zwischen sie setzen
Anmerkung 2: Florian hat dies in einem Kommentar erwähnt, aber wer liest Kommentare, wenn er nach Antworten sucht?
Hinweis 3: Wenn Sie Zweige kontaminiert haben, können Sie neue Zweige erstellen, die auf dem neuen "dummen Zweig" basieren, und nur die Commits von Cherry Pick auswählen.
Ex:
Jetzt ist Feature-New Ihre Filiale ohne die zusätzlichen (möglicherweise schlechten) Commits!
quelle
git checkout -b base-branch origin/base-branch
mitgit checkout --track origin/base-branch
Mit Rebase ziehen
Ein regulärer Pull ist Fetch + Merge, aber was Sie wollen, ist Fetch + Rebase. Dies ist eine Option mit dem
pull
Befehl:quelle