45 Stimmen

git-Äquivalent zu svn status -u

Was ist das Git-Äquivalent von svn status -u oder ausführlicher svn status --show-updates . Die svn status --show-updates Befehl zeigt die Aktualisierungen, die der svn update Befehl vom Server mitbringen wird.

Gracias.

2 Stimmen

Ihre Frage wäre besser, wenn Sie angeben würden, was der Befehl svn bewirkt. Dies würde nur Git-Kenntnisse zur Beantwortung erfordern, und wenig oder gar keine svn-Kenntnisse.

1 Stimmen

Danke, ich habe die notwendige Erklärung hinzugefügt.

34voto

tialaramex Punkte 3680

Mir fällt keine Möglichkeit ein, dies zu tun, ohne die Aktualisierungen tatsächlich abzurufen (vielleicht kann das jemand anders). Angenommen, Sie befinden sich auf dem Standardzweig "master" und der Upstream, aus dem diese hypothetischen Aktualisierungen kommen, ist der standardmäßige entfernte "origin", versuchen Sie....

git fetch
git log --name-only ..origin/master

Beachten Sie die doppelten Punkte kein einzelner Punkt oder eine Elipse 1 .

Dies gibt Ihnen eine Liste von Protokolleinträgen für Änderungen, die nur Upstream sind, mit den betroffenen Dateinamen, Sie können die Parameter für git log ändern, um mehr oder weniger Informationen zu erhalten.

Beachten Sie, dass das "Abrufen" dieser Aktualisierungen in Git nicht dasselbe ist wie das Anwenden dieser Aktualisierungen auf Ihren lokalen Zweig. Sie wissen zweifellos bereits, wie man das mit git pull macht.


1 Und woher kommen die doppelten Punkte? name1..name2 gibt einen Bereich an. Wenn name1 weggelassen wird, HEAD verwendet wird. Diese Syntax bezieht sich auf alle Commits, die von name2 zurück zu, aber nicht einschließlich, HEAD . [ "Von unten nach oben gehen" ]

4 Stimmen

+1 Da ich relativ neu bei Git bin, musste ich ein wenig recherchieren, um zu verstehen, warum die doppelten Punkte. Danach fühlte ich mich gezwungen, Ihre Antwort zu erweitern, um anderen Git-Neulingen zu helfen.

31voto

Jakub Narębski Punkte 286531

Beide Martinho Fernandes y tialaramex die Antworten korrekt beschreiben, was Sie tun müssen. Lassen Sie mich beschreiben warum es ist, wie es ist.


Subversion

Subversion es zentralisiert Versionskontrollsystem. Das bedeutet, dass es nach dem Client-Server-Prinzip funktioniert: Der Server speichert alle Daten über die Version (Repository), der Client hat nur das Arbeitsverzeichnis (Dateien) sowie einige Verwaltungs- und Hilfsdaten. Das bedeutet, dass der Client für die meisten Befehle den Server kontaktieren muss. Das bedeutet auch, dass es viele Befehle gibt, die nach dem Status des Projektarchivs auf dem Server oder der Serverkonfiguration fragen, wie z.B. " svn status --show-updates " in Frage.

(Nebenbei bemerkt: eine der Hilfsdaten, die Subversion auf dem Client speichert, sind die "unberührten" Versionen der Dateien, was bedeutet, dass die Überprüfung von Änderungen, die Sie vorgenommen haben, keine Verbindung zum Server erfordert (was langsam ist)... aber es bedeutet auch, dass der SVN-Checkout größer sein kann als das Git-Repository).

"svn update" (erforderlich vor der Übergabe, wenn das Repository Änderungen im angegebenen Zweig enthält) lädt die letzte Version von der Gegenstelle herunter y führt die von Ihnen vorgenommenen Änderungen mit den Änderungen aus der Ferne zusammen (versucht, diese zusammenzuführen). IMHO ist dieser Update-before-commit-Workflow nicht sehr zielführend.


Git

Git es distribué Versionskontrollsystem. Das bedeutet, dass es nach dem Peer-to-Peer-Prinzip funktioniert: Jeder "Client" verfügt über alle Daten zu den Versionen (vollständiges Repository). Das zentrale Repository ist nur aufgrund sozialer Konventionen und nicht aufgrund technischer Beschränkungen zentral. Das bedeutet, dass bei der Kontaktaufnahme mit anderen entfernten Repositorien die Anzahl der "fernausgeführten" Befehle sehr gering ist. Sie können mit "git ls-remote" (und "git update show") nach Referenzen (heads aka. branches und tags) fragen, Sie können mit "git fetch" (oder "git remote update") / "git push" Daten abrufen (pull) oder veröffentlichen (push), und wenn der Server so konfiguriert ist, dass er dies zulässt, können Sie mit "git archive --remote" einen Schnappschuss des Zustands des entfernten Repositorys erhalten.

Um also Commits zu untersuchen, die sich im entfernten Repository befinden, aber nicht in Ihrem Repository vorhanden sind, müssen Sie Daten auf Ihren Rechner herunterladen. Aber "git pull" ist eigentlich nichts anderes als "git fetch", das die Daten herunterlädt, und "git merge", das sie zusammenführt (mit ein bisschen Zucker, um Commit-Nachrichten vorzubereiten und den Zweig auszuwählen, der zusammengeführt werden soll). Sie können dann "git fetch" (oder "git remote update") verwenden, die neuen Commits mit "git log" und "gitk" untersuchen (wobei Sie nicht auf feste Ausgaben beschränkt sind), und dann, wenn alles in Ordnung ist, die Änderungen mit "git merge" zusammenführen.

Dies ist nicht spezifisch für Git, sondern für alle verteilten Versionskontrollsysteme, auch wenn die Art und Weise, wie SCM abgeholte, aber nicht zusammengefasste Daten präsentiert, unterschiedlich sein kann (Git verwendet Remote-Tracking-Zweige im 'remote/<remotename>/*'-Namensraum, Mercurial verwendet, soweit ich weiß, unbenannte Köpfe).

HTH

0 Stimmen

Ihre Antwort ist im Wesentlichen eine Rationalisierung, warum svn status -u erfordert zwei git-Befehle, die eigentlich verschiedene Befehle sein können ( get remote update , git fetch , usw.). Die Grundlage Ihrer Argumentation ist jedoch falsch. Sie sagen: "Jeder 'Client' hat alle Daten über Versionen (vollständiges Repository). Das zentrale Repository ist nur aufgrund sozialer Konventionen und nicht aufgrund technischer Beschränkungen zentral". Dies trifft in der Praxis nicht zu, denn die lokalen Repos sind im Allgemeinen veraltet, verglichen mit dem zentralen Repository des Unternehmens oder was auch immer.

0 Stimmen

@EML Ihr Kommentar ist falsch. 1) Sie sagten, diese Antwort sei eine Rationalisierung mit einem negativen Ton, was Unsinn ist. Dieser Kommentar war sinnlos, aufrührerisch und fehlgeleitet. 2) Die Grundlage dieser Antwort ist korrekt und genau. Der ganze Sinn von git fetch ist, das Gegenteil von dem zu tun, was Sie versuchen, als Mangel von Git zu beschreiben, also liegen Sie leider völlig falsch. Wenn Sie erwarten, dass Sie Aktualisierungen sehen, ohne etwas zu aktualisieren, verwenden Sie das Tool falsch. git fetch lädt, wie in der Antwort erläutert, die gesamte Repository-Historie herunter.

13voto

R. Martinho Fernandes Punkte 217895

Wenn du holst:

git fetch <remote>

anstatt zu ziehen:

git pull <remote>

von der Fernbedienung aus, können Sie die Änderungen dann mit git log . Um die Änderungen zu übernehmen:

git merge <remote>/<remote-branch>

4voto

nickgrim Punkte 5361

Sie können verwenden git ls-remote um die SHA von Referenzen in einem entfernten Repository aufzulisten; so können Sie sehen, ob es irgendwelche Änderungen gibt, indem Sie die Ausgabe von:

$ git show-ref origin/master     # <-- Where this repo thinks "origin/master" is
5bad423ae8d9055d989a66598d3c4473dbe97f8f refs/remotes/origin/master
$ git ls-remote origin master    # <-- Where "origin" thinks "master" is
060bbe2125ec5e236a6c6eaed2e715b0328a9106    refs/heads/master

Weichen sie voneinander ab, so sind Änderungen zu holen:

$ git remote update
Fetching origin
...
From github.com:xxxx/yyyy
5bad423..060bbe2  master     -> origin/master

3voto

Malo Punkte 31

Für mich, um Dateien anzuzeigen, die geändert werden, ist es :

git fetch (1)
git diff --name-only ..origin/master (2)
  1. Holt Änderungen in die Git-"Datenbank" (nur das .git-Verzeichnis) und ändert keine Dateien.
  2. Zeigt die Namen der Dateien an, die nach einer Zusammenführung geändert werden

Um Dateien zu aktualisieren (nicht nur die Git-"Datenbank"), führen Sie einen Git-Merge durch

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