Wie kann ich eine Vorschau von Git-Pull anzeigen, ohne etwas abzurufen?


204

Ist es überhaupt möglich?

Grundsätzlich gibt es ein Remote-Repository, aus dem ich mit nur:

git pull

Jetzt möchte ich eine Vorschau anzeigen, was sich durch diesen Zug ändern würde (ein Unterschied), ohne etwas auf meiner Seite zu berühren. Der Grund dafür ist, dass das, was ich ziehe, möglicherweise nicht "gut" ist und ich möchte, dass jemand anderes es repariert, bevor mein Repository "schmutzig" wird.


4
Ihre Bearbeitung ist komisch. Durch einen "Git-Abruf" wird Ihr Arbeitsbaum in keiner Weise geändert. Es spielt also keine Rolle, ob Sie lokale Änderungen nicht festgeschrieben haben. Und es ist unklar, welchen Teil des Abrufs Sie rückgängig machen möchten, da er Ihren Arbeitsbaum nicht berührt.
dkagedal

Danke dkagedal, ich habe das geschrieben, bevor ich vollständig verstanden habe, wie Git funktioniert. Ich habe diese Bearbeitung entfernt.
Milan Babuškov

Antworten:


233

Führen Sie nach a git fetcheine aus git log HEAD..origin/master, um die Protokolleinträge zwischen Ihrem letzten gemeinsamen Commit und dem Hauptzweig des Ursprungs anzuzeigen. Um die Unterschiede anzuzeigen, verwenden Sie entweder git log -p HEAD..origin/master, um jeden Patch anzuzeigen, oder git diff HEAD...origin/master(drei Punkte, nicht zwei), um einen einzelnen Unterschied anzuzeigen .

Normalerweise muss ein Abruf nicht rückgängig gemacht werden, da beim Abrufen nur die Remote- Zweige und keiner Ihrer Zweige aktualisiert werden . Wenn Sie nicht bereit sind, alle Remote-Commits zu ziehen und zusammenzuführen, können Sie git cherry-picknur die gewünschten Remote-Commits akzeptieren. Später, wenn Sie bereit sind, alles zu bekommen, wird ein git pullTestament in den restlichen Commits zusammengeführt.

Update: Ich bin mir nicht ganz sicher, warum Sie die Verwendung von Git Fetch vermeiden möchten. Alles, was Git Fetch tut, ist die Aktualisierung Ihrer lokalen Kopie der Remote-Zweige. Diese lokale Kopie hat nichts mit Ihren Zweigen zu tun, und sie hat nichts mit nicht festgeschriebenen lokalen Änderungen zu tun. Ich habe von Leuten gehört, die Git-Fetch in einem Cron-Job ausführen, weil es so sicher ist. (Normalerweise würde ich das aber nicht empfehlen.)


Ich glaube, ich habe diesen Teil von "nichts mit MEINEN Zweigen zu tun" beim Lesen der Dokumente verpasst. Vielen Dank.
Milan Babuškov

1
Aus irgendeinem Grund funktioniert das bei mir nicht. Ich habe git diff HEAD ... origin / master ausprobiert und es wurden noch keine Änderungen aufgelistet, wenn ich 'origin origin ziehen' mache, werden die Änderungen abgerufen und zusammengeführt. Liegt das daran, dass ich das Remote-Repository mit git remote add eingerichtet habe?
screenm0nkey

@ screenm0nkey: Ich weiß es nicht (ohne weitere Informationen zu kennen). Ich empfehle, eine neue Frage zu stellen, wenn Sie sich immer noch nicht sicher sind.
Greg Hewgill

1
Was für mich funktioniert (nach dem Git-Abruf): Git-Log-Ursprung / Master
Slaman

2
git diff ...@{u}ist das gleiche, als git diff HEAD...origin/masterob Ursprung / Meister der vorgelagerte Zweig ist
kambunctious

47

Ich denke, Git Fetch ist das, wonach du suchst.

Die Änderungen und Objekte werden abgerufen, ohne dass sie in den Index Ihres lokalen Repos übernommen werden.

Sie können später mit Git Merge zusammengeführt werden .

Manpage

Bearbeiten: Weitere Erläuterungen

Direkt aus dem Git- SVN Crash Course Link

Wie erhalten Sie neue Änderungen aus einem Remote-Repository? Sie holen sie:

git fetch http://host.xz/path/to/repo.git/ 

Zu diesem Zeitpunkt befinden sie sich in Ihrem Repository und können wie folgt untersucht werden:

git log origin 

Sie können die Änderungen auch unterscheiden. Sie können auch das Git-Protokoll HEAD..origin verwenden , um nur die Änderungen anzuzeigen , die Sie nicht in Ihrer Branche haben. Wenn Sie sie dann zusammenführen möchten, tun Sie einfach:

git merge origin

Beachten Sie, dass, wenn Sie keinen abzurufenden Zweig angeben, standardmäßig die Tracking-Fernbedienung verwendet wird.

Wenn Sie die Manpage lesen, erhalten Sie ehrlich gesagt das beste Verständnis für Optionen und deren Verwendung.

Ich versuche dies nur anhand von Beispielen und Speicher zu tun. Derzeit habe ich keine Box zum Testen. Sie sollten sich Folgendes ansehen:

git log -p //log with diff

Ein Abruf kann mit git reset --hard ( Link ) rückgängig gemacht werden. Alle nicht festgeschriebenen Änderungen in Ihrem Baum sowie die von Ihnen abgerufenen Änderungen gehen jedoch verloren.


Wenn Sie zwei Dinge erklären, könnte das gut sein: 1. Wie mache ich Git-Fetch rückgängig? 2. Wie sehe ich den Unterschied?
Milan Babuškov

1
1) Git-Fetch rückgängig machen? 2) Git Diff HEAD..origin
Chris Vest

Der Unterschied wird gemacht, wie Christian sagte, ein Abruf kann mit git reset rückgängig gemacht werden - hart, jedoch gehen alle nicht festgeschriebenen Änderungen in Ihrem Baum sowie die Änderungen, die Sie abgerufen haben, verloren.
Brian Gianforcaro

Suchen Sie git reset --softoder --mixed? Überprüfen Sie die Manpage.
Aristoteles Pagaltzis

1
Wenn ich das richtig verstehe, besteht keine Notwendigkeit, einen "Git-Abruf" rückgängig zu machen, da er Ihre Arbeitskopie und auch nicht Ihr Repository nicht berührt. "git fetch" speichert Objekte und Refs in .git / FETCH_HEAD
Thorsten Niehues

21

Sie können von einem Remote-Repo abrufen, die Unterschiede erkennen und dann ziehen oder zusammenführen.

Dies ist ein Beispiel für ein Remote-Repo namens originund einen Zweig namens masterTracking the Remote-Zweig origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

Ich habe einen benutzerdefinierten Git-Alias ​​erstellt, um dies für mich zu tun:

alias.changes=!git log --name-status HEAD..

damit kannst du das machen:

$git fetch
$git changes origin

Auf diese Weise können Sie Änderungen auf einfache und einfache Weise in der Vorschau anzeigen, bevor Sie eine merge.


du bist Gott. Dies sollte innerhalb von Git selbst kommen
Z. Khullah

3

Ich benutze diese beiden Befehle und kann sehen, welche Dateien geändert werden müssen.

  1. Wenn Sie zuerst den Git-Abruf ausführen , erhalten Sie eine Ausgabe wie diese (Teil der Ausgabe):

    ...
    72f8433..c8af041 entwickeln -> Ursprung / entwickeln
    ...

Diese Operation gibt uns zwei Festschreibungs-IDs, die erste ist die alte und die zweite ist die neue.

  1. Vergleichen Sie dann diese beiden Commits mit git diff

    git diff 72f8433..c8af041 | grep "diff --git"

Dieser Befehl listet die Dateien auf, die aktualisiert werden:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Zum Beispiel werden app / controller / xxxx.php und app / view / yyyy.php aktualisiert.

Wenn Sie zwei Commits mit git diff vergleichen , werden alle aktualisierten Dateien mit geänderten Zeilen gedruckt . Mit grep werden jedoch nur die Zeilen gesucht und abgerufen , die diff --git aus der Ausgabe enthalten.


3

Ich komme vielleicht zu spät zur Party, aber das hat mich zu lange nervt. Nach meiner Erfahrung möchte ich lieber sehen, welche Änderungen ausstehen, als meine Arbeitskopie zu aktualisieren und diese Änderungen zu behandeln.

Dies geht in die ~/.gitconfigDatei:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Es ruft den aktuellen Zweig ab und führt dann einen Unterschied zwischen der Arbeitskopie und diesem abgerufenen Zweig durch. Sie sollten also nur die Änderungen sehen, die damit einhergehen würden git pull.


1
Könnten Sie die Referenzzeichenfolge gegen austauschen HEAD..@{u}? Es ist einfacher und erfordert nicht, dass die Fernbedienung als "Ursprung" bezeichnet wird oder dass Ihr Zweig genauso benannt wird wie auf der Fernbedienung.
Michael - Wo ist Clay Shirky

Dies ist ein gut gemachter Alias, aber ich bin mir nicht sicher, warum Sie dies überhaupt tun möchten. Sie werden sich irgendwann mit den Änderungen befassen müssen, oder? Sie sollten in der Lage sein, den Zusammenführungsteil abzubrechen, git pullwenn Ihnen das, was es tut, nicht gefällt. Ich bin mir also nicht sicher, was der Anwendungsfall dafür ist.
Marnen Laibow-Koser

Ich weiß, dass ich mich irgendwann mit den Änderungen befassen muss, aber wie ich schrieb, möchte ich manchmal nicht. Ich möchte nur wissen, ob etwas kaputt geht und ich muss noch etwas Zeit dafür reservieren - oder ob ich es einfach danach tun kann git pull. Ich denke auch, darum ging es in der Frage von op.
Andy P

-1

Wenn Sie nicht möchten, dass git-fetch Ihre lokale .git aktualisiert, kopieren Sie einfach Ihr lokales Repo in ein temporäres Verzeichnis und ziehen Sie dort. Hier ist eine kurze Hand:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Ex.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

'gtp' muss im Stammverzeichnis des lokalen Repos ausgeführt werden, in dem sich .git befindet.
AX Labs

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.