2013-08-28 4 views
30

Gibt es git-Befehl (oder eine kurze Abfolge von Befehlen), die sicher wird und sicher wie folgt vor:Git Befehl jede Filiale zur Kasse und lokale Änderungen überschreiben

  • von irgendwelchen lokalen Änderungen loszuwerden,
  • holen Sie den gegebenen Zweig vom Ursprung wenn notwendig,
  • Kasse der gegebene Zweig?

Zur Zeit bin ich fest mit:

git fetch -p 
git stash 
git stash drop 
git checkout $branch 
git pull 

aber es stört mich, weil ich mich für Passwort zweimal (durch fetch und pull) gefragt. Generell wäre ich mit jeder Lösung zufrieden, solange das Passwort nur einmal benötigt wird.

Ein paar Anmerkungen:

  • es für eine Anwendung ein Teil homebrewed Deployment-Skript ist (der Code auf GitHub gehostet wird),
  • es keinen Unterschied, ob der Zweig bereits abgerufen wurde sein sollte Ursprung oder nicht (dh die erste Bereitstellung eines neuen Zweiges sollte idealerweise keine zusätzlichen Schritte erfordern),
  • Das Skript befindet sich auf einem Remote-Computer, auf den mehrere Personen zugreifen können, daher werden keine Anmeldeinformationen und Benutzer/Kennwort gespeichert muss eingegeben werden (aber nur einmal wenn möglich),
  • Ich interessiere mich nicht für lokale Änderungen, ich möchte immer eine unverfälschte Kopie des gegebenen Zweiges (der weitere Teil des Deployment-Skripts erzeugt lokale Änderungen),
  • Ich kann nicht jedes Mal ein neues Repository klonen oder exportieren, es braucht zu viel Zeit.
+1

1. 'git reset --hard' 2.' git checkout $ branch' 3. 'git pull Herkunft $ branch' – g19fanatic

Antwort

47

Sie könnten eine Lösung ähnlich wie „Force git to overwrite local files on pull

git fetch --all 
git reset --hard origin/abranch 
git checkout $branch 

folgen, dass nur eine Abruf verbunden wäre.

+0

Ich benutze diese Lösung, aber ich habe am Ende noch einen 'git checkout $ branch' hinzugefügt, weil sonst die von git zurückgegebene aktuelle Filialinformation falsch war. – szeryf

+0

@szeryf ok, ich habe diese Antwort bearbeitet. – VonC

+0

@VonC, Danke. Das hat wirklich Master mit Zweig überschrieben. – psun

17

Paar Punkte:

  • Ich glaube git stash + git stash drop konnte mit git reset --hard
  • ... oder, noch kürzer, fügen -f zu checkout Befehl ersetzt werden:

    git checkout -f -b $branch 
    

    Das wird alle lokalen Änderungen verwerfen, so als wären wir git reset --hard ed vor der Kasse.

Wie für die Hauptfrage: statt im letzten Schritt das Ziehens, könnten Sie einfach den entsprechenden Zweig von der Fernbedienung in Ihrer lokale Niederlassung fusionieren: git merge $branch origin/$branch, ich glaube es nicht die Fernbedienung nicht trifft. Wenn dies der Fall ist, beseitigt es die Notwendigkeit für Nachweise und damit Ihre größte Sorge.

+0

Die -b muss möglicherweise groß geschrieben werden. 'git checkout -f -B $ branch' setzt den lokalen Zweig zurück, wenn dieser bereits existiert. – xer0x

4

git reset und git clean kann in manchen situationen übertrieben sein (und eine große zeitverschwendung sein).

Wenn Sie einfach eine Nachricht wie "Die folgenden nicht aufgezeichneten Dateien werden überschrieben ..." und Sie möchten, dass die remote/origin/upstream diese widersprüchlichen nicht geordneten Dateien überschreiben, dann ist git checkout -f <branch> die beste Option.

Wenn Sie wie ich sind, war Ihre andere Option zu reinigen und führen Sie eine - Hard Reset und dann kompilieren Sie Ihr Projekt.