В чем разница между `git sta sh show` и` git show`? - PullRequest
2 голосов
/ 27 апреля 2020

Я могу просмотреть спрятанные изменения как:

$ git stash show -p stash@{0}
diff --git a/t/database/test.t b/t/database/test.t
index 3e9dcf87..4326d7e0 100644
--- a/t/database/test.t
+++ b/t/database/test.t
@@ -249,6 +249,8 @@ begin
     loop raise notice ''before: %%'', r; end loop;
   end if;

+  -- delete OLD if NEW.sys_period is empty
+  -- or create pid to track full version history. See transaction time
   UPDATE %1$s
   SET
     -- NOTICE: Here new values for sys_time column should be now() instead of sys_time()

Но когда я делаю git show stash@{0} или git show -p 803d7231, отображается только информация без изменений:

commit 803d7231aebc79819d69b5e8505c4be7f747441f (refs/stash)
Merge: 2b30b862 3f34d241
Author: Eugen Konkov <kes-kes@yandex.ru>
Date:   Mon Apr 27 12:34:43 2020 +0300

    On bi-temporal: TODO: Bi-Temporal improvement: track how data is changed

Почему git show не отображается diff?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Sta sh на самом деле является коммитом слияния, а git show скроет блок сравнения, который выглядит как принятое изменение слияния.

Вы можете использовать опцию -m:

git show -m stash@{0}

или явно запросите diff между stash@{0} и его первым родителем (ваш последний активный коммит):

git diff stash@{0}^ stash@{0}

Подробнее

1. stash на самом деле является коммитом слияния

git stash фактически создает два коммита:

  • первый сохраняет содержимое индекса, когда вы ставите sh
  • второй хранит содержимое рабочего дерева, которое вы ставите sh

Вы можете посмотреть историю stash@{0}:

$ git log --graph --oneline stash@{0}
*   afffe0c (refs/stash) WIP on master: 6615405 commit: created file "a.txt"
|\  
| * 6ebdc03 index on master: 6615405 commit: created file "a.txt"
|/  
* 6615405 (HEAD -> master) commit: created file "a.txt"
* 170d9f8 empty

2. Различия между git stash show и git show

git stash show -p знают, что вы обычно хотите просмотреть разницу между stash@{0} и вашей работой (ее первым родителем);

git show stash@{0}, с другой стороны, отображает этот коммит как коммит слияния.

Если изменения были поставлены при сохранении, тогда эти модификации будут частью коммита index on xxx : ..., а git show не будет, по умолчанию отображать этот блок различий.

См. git help show:

Для коммитов показывает сообщение журнала и текстовый дифференциал. Он также представляет коммит слияния в специальном формате, который создается git diff-tree - cc.

и git help diff-tree, * Опция 1059 *:

--cc

Этот флаг изменяет способ отображения исправления фиксации слияния аналогично опции - c. Он подразумевает опции - c и -p и дополнительно сжимает выходные данные патча, пропуская неинтересные фрагменты, чье содержимое в родительских элементах имеет только два варианта, и в результате объединения выбирается один из них без изменений. Когда все фрагменты неинтересны, сам коммит и сообщение журнала коммитов не отображаются, как в любом другом случае «пустого различий».

1 голос
/ 27 апреля 2020

Sta sh - это коммит слияния, у которого есть 2 родителя. В соответствии с do c, git show <merge-commit> представляет коммит слияния в специальном формате, выданном git diff-tree --cc.

- cc

Этот флаг изменяет способ отображения исправления слияния, аналогично опции - c. Он подразумевает опции - c и -p и дополнительно сжимает выходные данные патча, опуская неинтересные фрагменты, чье содержимое в родительских элементах имеет только два варианта, и в результате объединения выбирается один из них без изменений. Когда все фрагменты неинтересны, сам коммит и сообщение журнала фиксации не отображаются, как и в любом другом случае «пустых различий».

Я думаю, что никакой дифференциал не отображается, потому что все фрагменты неинтересны и поэтому опущено в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...