Gibt es in Git die Option "git pull --dry-run"?

76

Gibt es so etwas wie git pull --dry-runzu sehen, wie Sachen zusammengeführt werden, bevor es meinen Arbeitsbaum durcheinander bringt?

Im Moment mache ich:

git fetch origin && git merge --no-commit --no-ff

Ich habe auf der Manpage nichts zu "git-pull" gesehen.

Zur Verdeutlichung benötige ich es nur in einem Ant-Skript für die Bereitstellung, um festzustellen, ob Konflikte auftreten. git pullBeenden Sie dann das Beenden des Builds, schlagen Sie die Bereitstellung fehl und lassen Sie den Verzeichnisbaum unverändert git pull.

Danila Ladner
quelle
1
Warum sollte es Konflikte geben? Macht Ihr Bereitstellungsskript lokale Commits und wenn ja, warum?
CB Bailey
Bei der Betrachtung dieser Antworten haben wir meines Erachtens einen großen Unterschied zur verteilten Quellcodeverwaltung übersehen: Ein Pull / Fetch greift auf ein ganzes Repository zu, nicht nur auf einen Zweig. Sie müssen einzelne Zweige angeben, wie in den folgenden Antworten gezeigt.
wird
@CBBailey ... Wenn viele Leute an vielen Zweigen arbeiten (z. B. verschiedene Versionen und Funktionen), kommt es häufig zu Überschneidungen. Die vorherige Überprüfung erleichtert die Planung Ihrer Zusammenführungs- und späteren Pull-Anforderung. Ein äquivalenter Befehl mit SVN lautet : svn -q -u.
wird

Antworten:

67

Ich habe mich immer auf die inhärenten Fähigkeiten von Git verlassen, um mich zurückzubekommen, wenn eine Zusammenführung fehlschlägt.

Um abzuschätzen, wie die Zusammenführung erfolgen könnte, können Sie wie folgt beginnen:

$ git fetch origin branch  # Fetch changes, but don't merge
$ git diff HEAD..origin/branch # Diff your current head to the fetched commit

... personal judgement of potential merge conflicts ...

$ git merge origin/branch # merge with the fetched commit

Wenn die Dinge nicht wie geplant liefen, schauen Sie sich Ihre an reflogund setzen Sie sie auf den gewünschten Zustand zurück:

$ git reflog
...
abc987  HEAD@{0}: merge activity
b58aae8 HEAD@{1}: fetch origin/branch
8f3a362 HEAD@{2}: activity before the fetch
...
$ git reset --hard HEAD{2}
rynmrtn
quelle
Sie können dies auch versuchen, da das Ziehen dem Zusammenführen von http://stackoverflow.com/questions/501407/is-there-a-git-merge-dry-run-option
scireon
fatal: ambiguous argument 'HEAD..origin/branch': unknown revision or path not in the working tree.
Grün
@ Green versuchen Git Reset - Hard HEAD @ {2}
Alex Shenfield
34

Sie müssen zuerst abrufen, um Ihren lokalen Ursprung / Master zu aktualisieren

git fetch origin

Dann können Sie tun:

git diff --name-only origin/master

Listet die Dateien auf, die sich geändert haben.

git diff origin/master directory_foo/file_bar.m

Listet den zeilenweisen Diff der Datei directory_foo / file_bar.m auf.

GayleDDS
quelle
1
Vielen Dank für den Tipp mit der --name-only flag
cw24
20

Sie können den gewünschten Effekt erzielen, indem Sie aus Ihrem aktuellen Zweig einen neuen Wegwerfzweig erstellen und diesen ausführen git pull. Wenn Sie mit den Ergebnissen nicht zufrieden sind, ist der ursprüngliche Zweig intakt.

gcbenison
quelle
Sie bedeuten git stash?
WesternGun
4
Nein, Git Stash ist ganz anders. Das bringt Ihre lokalen Änderungen woanders hin.
RichieHH
11
# fetch new commits from origin
$ git fetch

# check what are the differences and judge if safe to apply
$ git diff origin/master

# actually merge the fetched commits 
$ git pull
Aufseher
quelle
5
Warum das Downvote? Ich habe einen gemacht git diff this-answer/top-answerund es wurde kein signifikanter Fehler gefunden. Bitte hinterlassen Sie einen Kommentar, wenn Sie eine Ablehnung abgeben : git commit -m "why would you downvote, blah blah blah".
WesternGun
3

Da das Ziehen das Zusammenführen impliziert, würde ich mit dem Ausführen fortfahren, git merge --abortwenn Ihr Skript feststellt, dass Konflikte vorliegen und das Zusammenführen fehlgeschlagen ist.

kostix
quelle
Wenn Sie dies gegen eine entfernte Niederlassung tun git fetch origin branchwürden (eine erste), wäre es git merge --abort origin/branchrichtig?
Nick Devereaux