Как я могу увидеть изменения, внесенные без сохранения в текущее рабочее дерево? Я хотел бы знать, какие изменения будут внесены, прежде чем их применять!
Как я могу увидеть изменения, внесенные без сохранения в текущее рабочее дерево? Я хотел бы знать, какие изменения будут внесены, прежде чем их применять!
Ответы:
Смотрите самые последние тайники:
git stash show -p
Смотрите произвольный тайник:
git stash show -p stash@{1}
Из git stash
справочных страниц:
По умолчанию команда показывает diffstat, но она принимает любой формат, известный для git diff (например, git stash show -p stash @ {1} для просмотра второго самого последнего хранилища в форме патча).
stash@{0}
по умолчанию; вам нужен только аргумент, если вы хотите посмотреть на предыдущие тайники.
{0}
.
-p
стенд?
Чтобы увидеть самые последние тайники:
git stash show -p
Чтобы увидеть произвольный тайник:
git stash show -p stash@{1}
Также я использую git diff для сравнения тайника с любой веткой.
Ты можешь использовать:
git diff stash@{0} master
Чтобы увидеть все изменения по сравнению с филиалом мастера.
Или Вы можете использовать:
git diff --name-only stash@{0} master
Чтобы легко найти только измененные имена файлов.
git diff stash@{0} master
получите различие вашего тайника с текущим мастером (которое включает в себя работу, выполненную на мастере после тайника было сделано), а не файлы / строки, которые изменил бы тайник, о чем вопрос.
git difftool --tool=... stash@{0} HEAD
git diff stash@{0}^ stash@{0}
git diff stash@{0} master -- filename
чтобы получить изменения в конкретном файле.
Если ветвь, на которой основаны ваши спрятанные изменения, за это время изменилась, эта команда может быть полезна:
git diff stash@{0}^!
Это сравнивает тайник с коммитом, на котором он основан.
~/.gitconfig
:laststash = diff stash@{0}^!
git difftool stash^!
для сравнения последнего тайма с коммитом, на котором он основан, git difftool stash HEAD
для сравнения последнего тайма с текущим коммитом (stash @ {n} для более ранних тайников)
Если ваше рабочее дерево грязное , вы можете сравнить его с тайником, сначала зафиксировав грязное рабочее дерево, а затем сравнив его с тайником. После этого вы можете отменить коммит с грязным рабочим деревом (так как вы можете не захотеть иметь этот грязный коммит в вашем журнале коммитов).
Вы также можете использовать следующий подход для сравнения двух тайников друг с другом (в этом случае сначала нужно просто вставить один из тайников).
Передайте свое грязное рабочее дерево:
git add .
git commit -m "Dirty commit"
Diff тайник с этим коммитом:
git diff HEAD stash@{0}
Затем, после этого, вы можете отменить коммит и вернуть его в рабочий каталог:
git reset --soft HEAD~1
git reset .
Теперь вы разобрали грязное рабочее дерево со своим тайником и вернулись к тому месту, где были изначально.
git stash show -l
. Различает ли последний тайник рабочую (грязную) копию? Как вы используете это, не получая error: switch l requires a value
?
git stash show -l
. Что касается того, почему это не работает для вас, я могу только догадываться, что вы можете использовать более старую версию git? Я на git v2.20.1, и работает без нареканий без ошибок.
@ Ответ Магне - единственный, который (очень поздно) встречается, чтобы ответить на наиболее гибкую / полезную интерпретацию вопроса, но он немного сложнее, чем необходимо. Вместо фиксации и сброса просто спрячьте свою рабочую копию, сравните, а затем распакуйте.
git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop
Это показывает разницу между вершиной стека stash и вашей рабочей папкой, временно делая изменения рабочей папки стать вершиной стека stash (stash @ {0}), перемещая исходную верхнюю часть вниз на одну (stash @ {1} ) затем сравнивая, используя исходную вершину в позиции «новый набор», чтобы увидеть изменения, которые могут возникнуть в результате применения ее поверх текущей работы.
"Но что, если у меня нет текущей работы?" Тогда вы в нормальном скучном деле. Просто используйте ответ @ Amber
git stash show
или ответ @ czerasz
git diff stash@{0}
или признать, что копить и расстегивать быстро и легко в любом случае, просто распакуйте изменения и осмотрите их. Если вы не хотите, чтобы они в данный момент выбрасывались (текущий индекс / рабочая папка меняется). В полном объеме это
git stash apply
git diff
git reset
git checkout
git stash save -u
Это работает для меня на git версии 1.8.5.2:
git diff stash HEAD
git stash apply
.
Если у вас есть инструменты для сравнения (например, вне всякого сравнения)
git difftool stash HEAD
git stash apply
.
HEAD
. Я мог бы изменить ответ @ yerlilbilgin, чтобы удалить HEAD, но я думаю, что любой, кто использует git, может понять эту часть, и если я удлиню ответ, это сделает его менее читабельным. Нет вины на @yerlibilgin.
Один из способов сделать это, ничего не перемещая, - воспользоваться тем, что patch
может читать git diff (в основном, unified diff)
git stash show -p | patch -p1 --verbose --dry-run
Это покажет вам пошаговый предварительный просмотр того, что обычно делает патч. Дополнительным преимуществом этого является то, что патч не помешает самому записать патч в рабочее дерево, если по какой-то причине вам просто нужен git, чтобы замолчать о коммитах перед изменением, продолжайте и удалите --dry- бегите и следуйте подробным инструкциям.
Объединяя то, что я узнал в этой теме и в этой , когда я хочу увидеть «что находится в тайнике», я сначала запускаю:
git stash show stash@{0}
Это покажет, какие файлы были изменены. Затем, чтобы получить хороший визуальный diff в difftool, я делаю:
git difftool --dir-diff stash@{0} stash@{0}^
Это покажет все различия сразу данного тайника против его родителя.
Вы можете настроить инструмент сравнения ~/.gitconfig
, например, с помощью Meld :
...
[diff]
tool = meld
FWIW Это может быть немного избыточно для всех других ответов и очень похоже на принятый ответ, который является точным; но, возможно, это поможет кому-то.
git stash show --help
даст вам все, что вам нужно; включая информацию о тайнике.
показать [<stash>]
Показать изменения, записанные в хранилище, в виде различий между сохраненным состоянием и его исходным родителем. Когда нет, показывает последний. По умолчанию команда показывает diffstat, но она принимает любой формат, известный для git diff (например, git stash show -p stash @ {1} для просмотра второго самого последнего хранилища в форме патча). Вы можете использовать переменные конфигурации stash.showStat и / или stash.showPatch, чтобы изменить поведение по умолчанию.
Она список заначки
git stash list
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2
Так что получите номер тайника и сделайте:
Ты можешь сделать:
git stash show -p stash@{1}
Но если вам нужен diff (это другое, чтобы показать тайник, поэтому я пишу этот ответ. Diff
Рассмотрите текущий код в вашей ветке и show
просто покажите, что вы будете применять )
Ты можешь использовать:
git diff stash@{0}
или
git diff stash@{0} <branch name>
Еще одна интересная вещь:
git stash apply
git stash apply stash@{10}
Это применяет тайник, не удаляя его из списка, вы можете git checkout .
удалить эти изменения или, если вы счастливыgit stash drop stash@{10}
удалить тайник из списка.
Отсюда я никогда не рекомендую использовать git stash pop
и использовать комбинацию git stash apply
и git stash drop
если вы примените тайник в неправильной ветке ... ну, иногда трудно восстановить ваш код.
В зависимости от того, с чем вы хотите сравнить тайник (локальное рабочее дерево / родительский коммит / главный коммит), на самом деле доступно несколько команд, среди которых старая git diff
и более конкретная git stash show
:
╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff ║ git stash show ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree ║ git diff stash@{0} ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit ║ git diff stash@{0} HEAD ║ / ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝
Хотя git stash show
на первый взгляд выглядит более удобным для пользователя, на git diff
самом деле он более мощный, поскольку позволяет задавать имена файлов для более сфокусированного сравнения. Я лично настроил псевдонимы для всех этих команд в своем плагине zsh git .