Gibt es eine Möglichkeit, eine Zusammenführung in git zu wiederholen?


17

Also habe ich einen ziemlich großen Fehler gemacht. Ich habe einen Commit gemacht, gezogen, zusammengeführt (aber dabei den Code durcheinander gebracht) und dann gepusht. Ich möchte diese Zusammenführung wiederholen und den Code richtig machen. Gibt es eine Möglichkeit, dies zu tun?

Ich benutze Bitbucket.

git 

10
Nur ein Hinweis - dies ist in Bezug auf SO aktuell und hätte nicht migriert werden dürfen. Versuchen Sie einmal, Ihre eigenen Hilfeseiten zu lesen, und notieren Sie sich die von Programmierern häufig verwendeten Softwaretools . Das heißt, es ist auch hier zum Thema - SwiftCore, sei nicht schlecht, dass es migriert wurde, das war nicht deine Schuld.
Bob

Antworten:


13

Ich bin mir nicht sicher, ob dies der "gesegnete" Weg ist, aber hier ist, was ich getan habe, um das gleiche Problem zu lösen, ohne "Push" oder ähnliches erzwingen zu müssen.

Nehmen wir an, Ihre Historie sieht ungefähr so ​​aus (und M ist die überflüssige Zusammenführung):

-A--B--C--M (master points here)
  \      /
   D----E

Beim Laufen git checkout -b merge_fix <commit ID E>wird ein Zweig erstellt, bevor wir Fehler gemacht haben:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Lassen Sie uns nun die Zusammenführung in unserer neuen Niederlassung wiederholen. Wir können nicht einfach zusammenführen master, daher müssen wir den Commit vor dem Zusammenführen manuell auswählen: git merge <commit ID C>Machen Sie nicht die gleichen Fehler, die Sie das letzte Mal gemacht haben!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

Vorausgesetzt, das Commit Gsieht gut aus, möchten wir es jetzt mit der Spitze des masterZweigs synchronisieren . Dieser Befehl weist git an, die Änderungen, die am Master vorgenommen wurden, zu ignorieren und zu erzwingen, dass unsere Änderungen zum Merge-Ergebnis werden:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Schließlich Hmöchten wir (wieder unter der Annahme, dass Commit gut aussieht) einen schnellen Vorlauf durchführen master, um unsere feste Zusammenführung einzuschließen:

git checkout master
git merge merge_fix

Das verschiebt wirklich nur den masterVerzweigungszeiger H, aber ich werde die Gelegenheit nutzen, meine ASCII-Grafik ein wenig aufzuräumen:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

Und da hast du es! Sie haben die Zusammenführung erfolgreich wiederholt, ohne einen Verlauf ungültig zu machen.


6

Du kannst es so machen:

  1. Setzen Sie den Commit vor dem Zusammenführen zurück.
  2. Führen Sie die Zusammenführung erneut durch
  3. Push erzwingen

Das ist:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Denken Sie daran, dass git push --forcealles, was Sie in der Remote-Filiale hatten, neu geschrieben wird, und dass auch andere Benutzer dieser Filiale davon betroffen sein können. (Normalerweise sollten Sie dies nicht tun.)


6
git push --force
Denken Sie

1

git merge --abort und dann können Sie wieder zusammenführen


Ich erhalte nur die Meldung "Es gibt keine Zusammenführung zum

3
Dies ist nur bei Zusammenführungskonflikten möglich.
chanchal118

warum das minus eins? das hat mir geholfen.
swdev

Denn die Frage geht darum, wann du die Zusammenführung bereits beendet (falsch) und gepusht hast.
Robin Green

-1

Bitte überprüfen Sie diese Hoffnung, es ist nützlich für Sie

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

Während dies die OP-Frage beantworten kann, werden nur Link-Antworten auf SO nicht gut akzeptiert. Sie können jedoch in Ihrer Antwort die wichtigsten Auszüge aus dem Link zitieren.

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
Pranav 웃
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.