Чи можна попросити git diff включити неперевірені файли у свій різний вихід? Або я найкраще ставлю Git додати нові файли, які я створив, і існуючі файли, які я редагував, і використовую
git diff --cached
?
Чи можна попросити git diff включити неперевірені файли у свій різний вихід? Або я найкраще ставлю Git додати нові файли, які я створив, і існуючі файли, які я редагував, і використовую
git diff --cached
?
Відповіді:
З останніми версіями git ви можете створити git add -N
файл (або --intent-to-add
), який додає крапку нульової довжини до індексу в цьому місці. Підсумок полягає в тому, що ваш "незавершений" файл тепер стає модифікацією для додавання всього вмісту до цього файлу з нульовою довжиною, і це відображається у висновку "git diff".
git diff
echo "this is a new file" > new.txt
git diff
git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file
На жаль, як зазначалося, ви не можете, git stash
поки у вас є --intent-to-add
файл, який очікує на розгляд. Хоча, якщо вам потрібно зберігати, просто додайте нові файли та зберігайте їх. Або ви можете використовувати спосіб емуляції:
git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(налаштування псевдоніма є вашим другом тут).
git add -N .
Я вважаю, що ви можете відрізнятись від файлів у вашому індексі та відірваних файлів, просто надавши шлях до обох файлів.
git diff --no-index tracked_file untracked_file
git diff --no-index untracked_file_1 untracked_file_2
для отримання git diff
синтаксичного забарвлення і т. Д. На різний ... прекрасний.
/dev/null
замість: git diff --no-index -- /dev/null <untracked_file>
.
cat untracked_file_1
, або, можливо, printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
вам дійсно потрібен зелений вихід. :) (Хоча на більш серйозну увагу, зауважте, що заміна команд видалить з вашого файлу проміжні нові рядки.)
Для мого інтерактивного з день в день gitting (де я дифф робочого дерева проти ГОЛОВІ всього час, і хотів би мати неотслежіваемих файли , що входять до диффе), add -N/--intent-to-add
є непридатним для використання, так як вона ламається git stash
.
Тож ось моя git diff
заміна. Це не особливо чисте рішення, але оскільки я дійсно використовую його лише інтерактивно, я все в порядку з хаком:
d() {
if test "$#" = 0; then
(
git diff --color
git ls-files --others --exclude-standard |
while read -r i; do git diff --color -- /dev/null "$i"; done
) | `git config --get core.pager`
else
git diff "$@"
fi
}
Введення тексту d
буде включати в розрізнені файли, що не відслідковуються (про що я хвилююсь у своєму робочому процесі), і d args...
буде вести себе як звичайне git diff
.
Примітки:
git diff
насправді просто окремі розрізнені, тому неможливо сказати d
вихід із "справжнього розрізника" - за винятком того, що всі не відстежені файли відсортовані останніми.git diff
. Якщо хтось з'ясував, як це зробити, або, можливо, якусь функцію додасть git
у якийсь момент у майбутньому, будь ласка, залиште тут записку!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
вирішення, яке я запропонував для старших гейтів , спрацьовує git stash
, припускаючи, що ви вже отримали e69de29bb у своєму db, наприклад, намагаючись використовувати add -N
раніше. Тож мабуть це не зовсім рівнозначно git add -N
чомусь: tbh Я не впевнений як.
test
, до речі, виконуєте порівняння рядків, а не числову рівність . Не повинен нічого впливати, але test "$#" -eq 0
точніше, що призначено.
less
так що вам не потрібно натискати q
на кожен файл, і він виглядає точно так git diff
, видаляючи пагін файлу ( -P
), додаючи його назад ( | less
), зберігаючи колір ( --color=always
) та інтерпретуючи його як колір ( less -r
або less -R
). Отже, це:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(наприклад, if [ -t 1 ]; then color_arg=--color; fi
чи щось таке), оболонка - це спосіб перевірити, чи є її вихід терміналом, що є корисним способом прийняти рішення про забарвлення. І xargs
може дати спосіб позбутися циклу while. Вам все одно знадобиться -n 1
на цьому, тож він все одно запустить git ще чимало разів, і все одно потрібно парним шляхом, але ... це позбудеться, while
і read
, може, це краще?!? Я залишаю це читачеві.
Не на 100% до речі, але якщо ви чомусь не хочете додавати свої файли до індексу, як це запропоновано прийнятою відповіддю, ось ще один варіант:
Якщо файли не відслідковуються, очевидно, різниця - це весь файл, тож ви можете просто переглянути їх менше:
less $(git ls-files --others --exclude-standard)
Переміщення між ними :n
і :p
на наступний і попередній ..
Оновлення з коментарів: Якщо вам потрібен формат патча, ви також можете комбінувати його з git diff
:
git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less
Ви також можете перенаправити висновок на файл або використовувати іншу команду diff у цьому випадку.
git diff /dev/null <untracked_tile>
та отримати патч у форматі патча, а не "просто" файл
git add -A
git diff HEAD
Створіть виправлення, якщо потрібно, а потім:
git reset HEAD
git add -p
дуже часто (що я, до речі, рекомендую, до речі) ... Це дійсно дає спосіб робити основне, це просто ... слід зазначити, що він має потенціал для небажаної сторони ефекти.
це працює для мене:
git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt
Останній крок необов’язковий, він залишить файл у попередньому стані (без відстеження)
корисно, якщо ви також створюєте виправлення:
git diff --cached my_file.txt > my_file-patch.patch
Зміни працюють при поетапному та нестадійному виконанні цієї команди. Нові файли працюють під час постановки:
$ git diff HEAD
Якщо вони не ставлять поетапно, ви побачите лише відмінності файлів.
git add
від кожного не відстежуваного файлу
git add
її, це найпростіше, якщо ваш випадок використання - перевірити, що ви тільки що додали / хочете додати
Для одного файлу:
git diff --no-index /dev/null new_file
Для всіх нових файлів:
for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;
Як псевдонім:
alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"
Для всіх змінених та нових файлів, об’єднаних як одна команда:
{ git --no-pager diff; gdnew }
Зазвичай, коли я працюю з командами віддаленого розташування, для мене важливо, щоб я мав попередні знання про те, що зміни зроблені іншими командами в тому ж файлі, перш ніж я слідкувати за етапами git unntrack -> staged -> виконувати для цього я написав скрипт bash, який допоможіть мені уникнути зайвого вирішення конфлікту злиття з віддаленою командою або створіть нову локальну філію та порівняйте та об'єднайте на головну гілку
#set -x
branchname=`git branch | grep -F '*' | awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{print $2}" `
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file
git difftool FETCH_HEAD $file ;
done
у вищенаведеному скрипті я забираю віддалену головну гілку (не потрібно її головну гілку), щоб вона FETCH_HEAD склала список лише моїх модифікованих файлів і порівняла модифіковані файли з git difftool
тут багато difftool, підтримуваних git, я налаштовую "Meld Diff Viewer" для гарного порівняння графічного інтерфейсу.
Припустимо, що у вас немає місцевих комітетів,
git diff origin/master
git diff
команду, яка включає непозахищені файли. Ця команда не включає їх. Крім того, існують чи ні місцеві комітети, абсолютно нічого спільного з цим питанням немає.
git merge --squash mybranch
, і git diff master
показав мені зміни у відслідковуваних файлах.
git diff
не показує відмінності у відслідковуваних файлах: оскільки вони не відслідковуються, за визначенням ніколи не відображаються різниці. Це просто так, як працює Git. :)