Получайте добавленные и удаленные файлы из вывода git diff с помощью HEAD - PullRequest
0 голосов
/ 01 апреля 2019

Я использую git diff, чтобы получить различия между коммитом и его родителем для конкретного файла.Я использую эту команду:

git diff parent-sha child-sha  -- file/to/path

Вот моя проблема: с этой командой я могу получать добавленные, удаленные и измененные файлы для конкретного коммита.Но когда я пробую это на моем текущем коммите, я могу получить только измененные / удаленные файлы.Я ищу способ получить удаленные и добавленные файлы для текущего коммита (по сравнению с его родителем).

Например, вот мои незафиксированные изменения: enter image description here

Если я запускаю git diff HEAD -- yarn.lock

Я получаю это

diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index c06acb9..0000000
--- a/yarn.lock
+++ /dev/null
@@ -1,10383 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"7zip-bin@~4.1.0":
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-4.1.0.tgz#33eff662a5c39c0c2061170cc003c5120743fff0"
-  integrity sha512-AsnBZN3a8/JcNt+KPkGGODaA4c7l3W5+WpeKgGSbstSLxqWtTXqd1ieJGBQ8IFCtRg8DmmKUcSkIkUc0A4p3YA==
-
-"@angular-devkit/architect@0.11.4":
-  version "0.11.4"
-  resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.11.4.tgz#f0cc3b4f1dd0128f6b41d3bb760bcf4c324cd063"
-  integrity sha512-2zi6S9tPlk52vyqN67IvFoeNgd0uxtrPlwl3TdvJ3wrH7sYGJnkQ+EzAE7cKUGWAV989BbNtx2YxhRDHnN21Fg==

но ничего на git diff -- src/app/models/DiffFileInformation.ts

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Следующие 3 команды не совпадают:

git diff
git diff HEAD
git diff HEAD^ HEAD

Предположим, мы инициализировали репо и сделали два коммита и некоторые дополнительные незафиксированные изменения.

git init foo
cd foo
touch a.txt b.txt
git add .
git commit -m 'first commit'

echo hello >> a.txt
echo hello >> b.txt
git commit -m 'hello'

echo world >> a.txt
echo world >> b.txt
# stage a.txt and leave b.txt alone
git add a.txt
  1. Чтоgit diff возвращает?

git diff сравнивает рабочее дерево и индекс.Рабочее дерево имеет измененную версию a.txt и b.txt, а индекс имеет только измененную версию a.txt.Таким образом, разница между рабочим деревом b.txt и индексом b.txt:

hello
world

VS

hello

git diff возвращает:

diff --git a/b.txt b/b.txt
index ce01362..94954ab 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +1,2 @@
 hello
+world
Что возвращает git diff HEAD?

Сравнивает файлы в ревизии HEAD с файлами в рабочем дереве.a.txt в HEAD равно

hello

a.txt в рабочем дереве равно

hello
world

b.txt совпадает с a.txt, поэтому git diff HEAD возвращает:

diff --git a/a.txt b/a.txt
index ce01362..94954ab 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1,2 @@
 hello
+world
diff --git a/b.txt b/b.txt
index ce01362..94954ab 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +1,2 @@
 hello
+world
Что возвращает git diff HEAD^ HEAD?

Сравнивает файлы первой ревизии с файлами последней.В HEAD^ оба a.txt и b.txt пусты.В HEAD оба:

hello

Таким образом, мы получаем вывод git diff HEAD^ HEAD как:

diff --git a/a.txt b/a.txt
index e69de29..ce01362 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+hello
diff --git a/b.txt b/b.txt
index e69de29..ce01362 100644
--- a/b.txt
+++ b/b.txt
@@ -0,0 +1 @@
+hello

Если мы поменяем местами HEAD^ и HEAD, git diff HEAD HEAD^ возвращает:

diff --git a/a.txt b/a.txt
index ce01362..e69de29 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +0,0 @@
-hello
diff --git a/b.txt b/b.txt
index ce01362..e69de29 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +0,0 @@
-hello

HEAD и HEAD^ могут быть любые коммиты, доступные в хранилище.Вместо того, чтобы поменять местами ревизии, мы также можем получить обратный дифференциал с опцией -R, git diff -R HEAD^ HEAD.

Не уверен, какова ваша цель.Может быть, вы можете найти решение здесь .Описаны дополнительные синтаксисы git diff.

1 голос
/ 01 апреля 2019

Ответ ElpieKay правильный (и я проголосовал за него), но он может помочь вам подумать о проблеме, если вы сделаете шаг назад и подумаете о commits и о том, как работает Git .

Каждый коммит содержит несколько вещей, которые мы можем разбить на две основные категории: data и metadata . data в коммите - это снимок исходного кода, а метаданные - это дополнительная информация о данных, таких как, кто сделал снимок, когда и так далее. on (и, что важно, родительский хэш-идентификатор для родителя этого коммита, или, если это коммит слияния, все его родительские хеш-идентификаторы, но я думаю, что теперь эта часть хорошо контролируется). Обратите внимание, что все внутри коммита замораживается на все время . Вы не можете изменить какую-либо часть данных или метаданных.

Фактически, это относится к всем внутренним объектам Git. Идентификатор хэша объекта Git представляет собой криптографическую контрольную сумму содержимого этого объекта. Это отлично подходит для архивирования - каждый сделанный коммит не может быть изменен никогда , но совершенно бесполезен для выполнения любой новой работы . Чтобы выполнить новую работу, Git должен предоставить несколько мест, где файлы могут быть изменены .

У каждой системы контроля версий есть эта проблема, и в целом все они решают ее одинаково: место, где вы работаете с вашим файлом, - ваше рабочее дерево . Файлы в рабочем дереве податливы. Файлы в коммитах нет. Это означает, что есть что-то принципиально иное в рабочем дереве, чем в коммите. Рабочее дерево может быть предложенным коммитом, но оно все еще податливо, так что это не фактический коммит. (У него также нет метаданных.)

Итак, в Git рабочее дерево не имеет хеш-идентификатора . Но по какой-то причине Git делает это еще дальше. Вместо того, чтобы рабочее дерево было предложено следующим коммитом, Git добавляет третью сущность, расположенную между HEAD - текущим коммитом - и рабочим деревом. Этот третий объект называется index , или промежуточной областью , или даже иногда кеш . (Вы увидите все три имени в документации Git. Все они ссылаются на одно и то же.) В этом индексе Git хранит предложенный следующий коммит. Затем Git предоставляет такие команды, как git add, которые копируют из рабочего дерева (где у вас есть файлы и вы можете с ними работать) до индекса (для обновления предложенного следующего коммита) .

Это означает, что git diff должен иметь возможность:

  • сравнить фиксацию с фиксацией
  • сравнить фиксацию с индексом
  • сравнить коммит с рабочим деревом
  • сравнить индекс с рабочим деревом

Он предоставляет четыре различных способа сделать это, в зависимости от аргументов и --cached флага, который вы передаете в git diff:

  • git diff <em>hash1</em> <em>hash2</em> сравнение фиксации с фиксацией
  • git diff --cached <em>hash</em> сравнивает фиксацию с индексом
  • git diff <em>hash</em> сравнивает коммит с рабочим деревом
  • git diff сравнивает индекс с рабочим деревом

Выберите, какой вы хотите, добавьте -- <path>, чтобы ограничить вывод diff, и все готово.

1 голос
/ 01 апреля 2019

git diff HEAD -- path покажет вам ваши локальные изменения.

Файл src/app/models/DiffFileInformation.ts не отслеживается и не обрабатывается, поэтому он не будет отображаться в вашем diff.

Чтобы увидеть его вdiff, вам нужно сначала поставить его (добавить).

...