#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)