it-swarm.com.de

Wie kann ein Merge-Commit mit kombinierter Diff-Ausgabe "git show" werden, auch wenn jede geänderte Datei mit einem der Eltern übereinstimmt?

Nachdem Sie eine "einfache" Zusammenführung durchgeführt haben (eine ohne Konflikte), git show zeigt normalerweise nur so etwas wie

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <[email protected]>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

Dies liegt daran, dass für Zusammenführungen git show verwendet das kombinierte Diff-Format, bei dem Dateien ausgelassen werden, die mit einer der übergeordneten Versionen übereinstimmen.

Gibt es eine Möglichkeit, Git zu zwingen, alle Unterschiede im kombinierten Diff-Modus anzuzeigen?

Tun git show -m zeigt die Unterschiede (mit paarweisen Unterschieden zwischen der neuen und allen übergeordneten Versionen), aber ich würde es vorziehen, wenn die Unterschiede wie im kombinierten Modus mit +/- in den jeweiligen Spalten markiert sind.

171
Tilman Vogel

Nein, das geht nicht mit git show. Aber es wäre sicher manchmal nett und es wäre wahrscheinlich relativ einfach, es in den Git-Quellcode zu implementieren (schließlich müssen Sie es nur anweisen, nicht herauszuschneiden, was es für eine fremde Ausgabe hält). , so dass der Patch dazu wahrscheinlich von den Betreuern der Git akzeptiert würde.

Sei aber vorsichtig, was du dir wünschst. Das Zusammenführen eines Zweigs mit einer einzeiligen Änderung, die vor drei Monaten gegabelt wurde, hat immer noch einen großen Diff im Vergleich zur Hauptzeile, so dass ein derartiger vollständiger Diff fast nicht hilfreich wäre. Deshalb zeigt git es nicht.

4
apenwarr

Sehen Sie sich die Commit-Nachricht an:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <[email protected]>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

beachten Sie die Zeile:

Merge: fc17405 ee2de56

nehmen Sie diese beiden Commit-IDs und kehren Sie sie um. Um das gewünschte Diff zu erhalten, würden Sie Folgendes tun:

git diff ee2de56..fc17405

um nur die Namen der geänderten Dateien anzuzeigen:

git diff --name-only ee2de56..fc17405

und um sie zu extrahieren, kannst du dies zu deiner gitconfig hinzufügen:

exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'

dann benutze es, indem du tust:

git exportfiles ee2de56..fc17405 /c/temp/myproject
240
rip747

Eine bessere Lösung (von @KrisNuttycombe erwähnt):

git diff fc17405...ee2de56

für das Merge Commit:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <[email protected]>
Date:   Tue Feb 22 00:27:17 2011 +0100

um alle Änderungen auf ee2de56 anzuzeigen, die über Commits auf fc17405 erreichbar sind. Beachten Sie die Reihenfolge der Festschreibungs-Hashes - wie in den Zusammenführungsinformationen angegeben: Merge: fc17405 ee2de56

Beachten Sie auch die 3 Punkte ... Anstelle von zwei!

Für eine Liste der geänderten Dateien können Sie Folgendes verwenden:

git diff fc17405...ee2de56 --name-only
65
CoDEmanX

Sie können einen Zweig erstellen, indem Sie HEAD vor dem Zusammenführen auf einen Commit setzen. Dann können Sie Folgendes tun:

git merge --squash testing

Dies wird zusammengeführt, aber nicht festgeschrieben. Dann:

git diff
11
side2k

Scheint hier beantwortet zu sein: http://thread.gmane.org/gmane.comp.version-control.git/191553/focus=191557

Also in ähnlicher Weise läuft

$ git diff --cc $ M $ M ^ 1 $ M ^ 2 $ (git merge-base $ M ^ 1 $ M ^ 2)

sollte einen kombinierten Patch anzeigen, der den Status bei $ M im Verhältnis zu den in den übergeordneten Status und der Zusammenführungsbasis aufgezeichneten Status erklärt.

4
max630

Ich denke du brauchst nur 'git show -c $ ref'. Wenn Sie dies im Git-Repository auf a8e4a59 versuchen, wird ein kombiniertes Diff angezeigt (Plus/Minus-Zeichen in einer von zwei Spalten). Wie im Handbuch zu git-show erwähnt, delegiert es so ziemlich alles an "git diff-tree", sodass diese Optionen nützlich aussehen.

4
patthoyts

in deinem Fall musst du nur

git diff HEAD^ HEAD^2

oder einfach Hash für dich begehen:

git diff 0e1329e55^ 0e1329e55^2
3
gurugray

Wenn Ihr Merge-Commit wie oben Commit 0e1329e5 lautet, können Sie den Diff abrufen, der in diesem Merge enthalten war, indem Sie:

git diff 0e1329e5^..0e1329e5

Ich hoffe das hilft!

2
hesham_EE

Ich habe einen allgemeinen Ansatz entwickelt, um verschiedene Vorgänge mit den Commits einer Zusammenführung durchzuführen.

Schritt Eins: Füge einen Alias ​​zu Git hinzu, indem du ~/.gitconfig:

[alias]
  range = "!. ~/.githelpers && run_on_merge_range"

Zweiter Schritt: In ~/.githelpers, definiere eine bash Funktion:

run_on_merge_range() {
  cmd=$1; shift
  commit=$1; shift
  range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
  echo "git $cmd $range [email protected]"
  if [ -z $range ]; then
    echo "No merge detected"
    exit 1
  fi
  git $cmd $range [email protected]
}

Schritt drei: Profit!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

Wahrscheinlich gibt es hier viel Raum für Verbesserungen. Ich habe dies nur zusammengepeitscht, um eine nervige Situation zu überwinden. Fühlen Sie sich frei, meine Bash-Syntax und/oder Logik zu verspotten.

1
Nerdmaster

Wenn Sie beim Merge-Commit sitzen, zeigt dies die Unterschiede:

git diff HEAD~1..HEAD

Wenn Sie nicht am Merge-Commit teilnehmen, ersetzen Sie einfach HEAD durch das Merge-Commit. Diese Methode scheint die einfachste und intuitivste zu sein.

1
Bruce Dawson

Sie können den Befehl diff-tree mit dem Flag -c verwenden. Dieser Befehl zeigt Ihnen, welche Dateien sich beim Merge-Commit geändert haben.

git diff-tree -c {merged_commit_sha}

Ich habe die Beschreibung des Flags -c von Git-Scm erhalten:

Dieses Flag ändert die Art und Weise, in der ein Merge-Commit angezeigt wird (was bedeutet, dass es nur sinnvoll ist, wenn der Befehl einen oder --stdin erhält). Es werden die Unterschiede zwischen den einzelnen übergeordneten Elementen und dem Zusammenführungsergebnis gleichzeitig angezeigt, anstatt paarweise Unterschiede zwischen einem übergeordneten Element und dem Ergebnis nacheinander anzuzeigen (was mit der Option -m möglich ist). Außerdem werden nur Dateien aufgelistet, die von allen Eltern geändert wurden.

1
Ehsan Mirsaeedi