2010-11-24 21 views
32

Ich muss zugeben, dass ich nicht mit Gits erweiterte Funktionen gespielt habe, aber auf meinem aktuellen Projekt musste ich.Machen git Master HEAD Punkt zum aktuellen HEAD der Filiale

Die Situation: Jemand versuchte, einige Features zu implementieren und comitted sie den Meister, jetzt war ich zu tun genannt, was diese andere Person versucht zu tun (aber nicht), also das erste, was ich tat, war

git checkout -b clean_start HASH 

Hash ist eine korrekte SHA1 Hash von etwa 20 Commits vor dem aktuellen Master und das hat funktioniert. Ich habe jetzt einige Änderungen an diesem Zweig vorgenommen und bin jetzt an einem Punkt, an dem ich den aktuellen Master-Zweig des Remote-Repositorys (mit den von der anderen Person vorgenommenen Änderungen) in meine lokale Zweigstelle ändern möchte.

Mit anderen Worten, ich möchte den Kopf des Masters 20 commits zurück verschieben und dann meinen neuen sauberen Zweig in es zusammenführen.

Ist das genau das, was ich tun muss? Mit Rücksprung HEAD ~ 20 etc. oder gibt es einen Befehl, der genau so einen Kopfzug macht?

Antwort

28

Sie können dies tun, wenn die Remote-Repository Schübe gezwungen akzeptieren:

git push --force origin clean_start:master 

Beachten Sie, dass, wenn jemand anderes das Repository hat geklont, ein Push von ihnen möglicherweise diese rückgängig machen könnte. Wenn Sie Ihren lokalen Hauptzweig und die Remote-Master-Zweig, fusionieren, aber in der Dateistruktur von Ihrem Zweig halten (den Dateibaum Ursprungs Master verwirft), können Sie dies wie folgt tun:

git merge -s ours --no-commit origin/master 
git commit # Separate step so that you can use your own commit message. 
git checkout master 
git merge clean_start # Fast-forward 
git push origin master 

Dies erstellen ein Zusammenführungs-Commit mit beiden Zweigen (Ihrem Master und dem Master des Ursprungs) als dessen Eltern, aber der Baum ist identisch mit Ihrem aktuellen Zweig-Tipp. Mit anderen Worten, es wird eine symbolische Zusammenführung erstellt, bei der keine tatsächliche Codezusammenführung erfolgt ist.

Wenn es Ihnen nichts ausmacht, dass andere Personen, die im Repo arbeiten, unterbrochen werden, können Sie den ersten Ansatz verwenden. Aber wenn Sie mit anderen Leuten arbeiten, die bereits diese Commits haben, wird der zweite Ansatz narrensicherer sein und Geschichte bewahren.

+0

haben Sie Ihre Nachricht bearbeiten "clean_start: Master" schließen? –

+0

Ja, ich vergaß, dass er sich aus einem zweiten Zweig entwickelte, nicht aus Meister. Ich habe auch meine andere Liste von Befehlen aktualisiert, um diesen Fehler zu kompensieren. – cdhowie

24
  1. Sie Master speziell zeigen können, wo Sie es wollen sein:

    git update-ref refs/heads/master clean_start 
    

    (wenn Sie die neuen Änderungen in clean_start verfolgen und Master dort zeigen wollen)

    Vorsicht Das, worauf der Meister hinwies (etwa 20 Commits wert), wird "verloren" sein.

    Sie müssen den Push von Master zwingen, aus diesem Grund:

    git push origin master -f 
    
  2. Wenn Sie Ihren lokalen Master zu verlassen, wo es statt und clean_start Platz auf dem Remote-Master drücken, gerade dies zu tun:

    git push origin clean_start: master -f

    hoffe, das hilft.

    PS. Führen Sie zuerst gitk --all & aus, damit Sie sehen können, was visuell passiert, während Sie dies tun.

16

Der git reset Befehl existiert, in welchem ​​HEAD Punkte zu ändern.

In Ihrem Fall, können Sie dies tun:

git checkout master    # switch to the master branch 
git reset --hard clean_start  # point HEAD to the clean_start branch 
git push -f origin master:master # force push the new HEAD to server 
+0

Das hat bei mir funktioniert, danke. –

+0

Dies ist ein einfacher Befehl und funktioniert wie ein Zauber. – lastboy

+0

Arbeitete, Danke :) –