Как увидеть разницу из HEAD только для несвязанных файлов?

#git

#git

Вопрос:

После устранения конфликта слияния я хочу увидеть фактическую разницу моих несвязанных файлов, прежде чем добавлять их для разрешения конфликта.

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

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

Как я могу увидеть разницу между HEAD и фактическим содержимым файлов, только для конфликтующих файлов?


Вот как создать репозиторий (в пустом каталоге):

 git init
# Create files foo.txt and bar.txt on master.
git commit --allow-empty -m "Initial commit"
echo 'foo content' > foo.txt
echo 'bar content' > bar.txt
git add .
git commit -m A
# Create a branch "b" that change both files.
git checkout -b b
echo 'Foo content' > foo.txt
echo 'Bar content' > bar.txt
git add .
git commit -m B
# Get back on master and add a commit that change foo.txt.
git checkout -
echo 'foo content and more' > foo.txt
git add foo.txt
git commit -m C
# Try to merge b in master: CONFLICT!
git merge b
# Fix the conflict.
echo 'Foo content and more' > foo.txt
  

Теперь git diff HEAD выдает мне список всех изменений, включая bar.txt которые не противоречат друг другу:

 diff --git a/bar.txt b/bar.txt
index 085e7f5..6401b08 100644
--- a/bar.txt
    b/bar.txt
@@ -1  1 @@
-bar content
 Bar content
diff --git a/foo.txt b/foo.txt
index 6633fd8..a65c68b 100644
--- a/foo.txt
    b/foo.txt
@@ -1  1 @@
-foo content and more
 Foo content and more
  

С другой стороны, git diff выдает мне только конфликтующие файлы, но не показывает мне фактическую разницу между фактическим содержимым на диске и HEAD .

 diff --cc foo.txt
index 6633fd8,6fc4556..0000000
--- a/foo.txt
    b/foo.txt
@@@ -1,1 -1,1  1,1 @@@
- foo content and more
 -Foo content
  Foo content and more
  

Мне бы нужна команда с тем же выводом, что и git diff HEAD -- foo.txt , но без указания конфликтующих файлов.

git diff --magic-flag HEAD :

 diff --git a/foo.txt b/foo.txt
index 6633fd8..a65c68b 100644
--- a/foo.txt
    b/foo.txt
@@ -1  1 @@
-foo content and more
 Foo content and more
  

Комментарии:

1. Попробуйте git diff HEAD -- $(git status -s | grep ^UU | awk '{print $NF}') . Но я думаю, что есть решения получше.

2. Я испытываю ту же боль и в основном использую тот же метод, что и @ElpieKay здесь, за исключением того, что обычно я просто смотрю на один конкретный файл, который, как мне кажется, я разрешил, то есть на явный git diff HEAD -- foo.txt , который вам не нравится делать. Было бы полезно иметь небольшой скрипт, который извлекает UU файлы.

Ответ №1:

Эта команда, похоже, выполняет свою работу:

 git diff HEAD -- $(git diff --name-only --diff-filter=U)
  

Я присвоил ему псевдоним как git dhu (d, если head uобъединен), в ~/.gitconfig :

 [alias]
dhu = !git diff HEAD -- $(git diff --name-only --diff-filter=U)