Изменяет привязку к определенным файлам

У меня есть большой проект git, который я, глупо, импортировал в eclipse и запускал autoformat. Теперь каждый файл в проекте отображается как измененный. Вместо того, чтобы передавать мои форматированные файлы, я предпочел бы вернуть все файлы, которые я только отформатировал, и не имел других изменений. Например:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)

#     modified: dir/file1.cpp
#     modified: dir/file1.h
#     modified: dir/file2.cpp
#     modified: dir/file2.h
#     modified: dir/file3.cpp
#     modified: dir/file3.h
#     modified: dir/file4.cpp
#     modified: dir/file4.h

Я знаю, что file2.cpp, file2.h и file3.cpp были изменены содержимым (т.е. не только отформатировано). Я хочу занести изменения в эти три файла, а затем проверить старую ревизию, чтобы после этого я мог повторно использовать изменения этих файлов. Я бы предпочел избежать чего-то вроде:

$ cp file2.cpp ~/tmp
$ git checkout blahblahblah
$ cp ~/tmp/file2.cpp .

Если есть очевидный способ сделать это, который не включает в себя stashing, дайте мне знать. независимо от выполняемой работы.

Ответ 1

Вы можете add файлы с изменениями, которые вы хотите сохранить, а затем stash остальные файлы и очистить тайник:

git add file2.cpp file2.h file3.cpp
git stash --keep-index
git stash clear

(Имейте в виду, что это очистит все ваших штампов.)

Это оставит вас с file2.cpp, file2.h и file3.cpp поставленными для фиксации. Если вы затем захотите зашить эти файлы (а не зафиксировать их):

git reset
git stash

Теперь вы будете в своем предыдущем коммите, только с тремя файлами.

Ответ 2

Я знаю, что file2.cpp, file2.h и file3.cpp были изменены содержимым (т.е. не только отформатировано).
Я хочу занести изменения в эти три файла, а затем проверить старые версии, чтобы я мог повторно использовать изменения этих файлов после.

С Git 2.13 (Q2 2017), Git stash будет официально объявлять изменения для определенных файлов с помощью

git stash push [--] [<pathspec>...]

См. commit 9e14090, совершить 1ada502, commit df6bba0 (28 февраля 2017 г.) и commit 9ca6326, commit 6f5ccd4, совершить f5727e2 (19 февраля 2017 г.) Thomas Gummerer (tgummerer).
(объединено Junio ​​C Hamano - gitster - в commit 44c3f09, 10 марта 2017 г.

Как теперь документировано:

Чтобы быстро сделать снимок, вы можете опустить "push".
В этом режиме аргументы без опционов не допускаются для предотвращения ошибок с ошибками подкомандой от создания нежелательного заклада.
Два исключения для этого: stash -p, который действует как псевдоним для stash push -p и pathspecs, которые разрешены после двойного дефиса -- для устранения неоднозначности.

Когда pathspec присваивается 'git stash push', новый stash записывает измененные состояния только для файлов, которые соответствуют pathspec.
Записи индекса и рабочие файлы дерева затем возвращаются в состояние в HEAD только для этих файлов, оставляя файлы, которые не соответствуют pathspec нетронутыми.

Обратите внимание, как указано medmunds в комментариях, что git stash будет использовать paths относительно корневой папки Git repo.

Ответ 3

Хорошая опция использует интерактивный режим закладок.

git stash --patch

Он работает в основном как интерактивный режим добавления: вам будет представлена ​​серия различий, показывающая изменения, которые у вас есть в рабочем дереве, и вы должны выбрать, какие файлы (или только определенные части файла!) вы хотите задеть, остальное останется без изменений.

От man git-stash:

С помощью --patch вы можете в интерактивном режиме выбирать куски из разницы между HEAD и рабочим деревом, которые должны быть спрятаны. Запись stash сконструирована так, что ее состояние индекса совпадает с состоянием индекса вашего репозитория, а его рабочая строка содержит только те изменения, которые вы выбрали в интерактивном режиме. Затем выбранные изменения откатываются из вашей рабочей строки. См. Раздел "Интерактивный режим" раздела git -add (1), чтобы узнать, как управлять режимом -patch.

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

Ответ 4

Это хорошее использование для git diff и git apply IMO:

git diff file2.cpp file2.h file3.cpp > ../my-changes.patch
git checkout ...
git apply ../my-changes.patch

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

Обратите внимание, что вам может потребоваться использовать параметр --reject для применения, если патч не применяется чисто. Также см. Справочную страницу .

Ответ 5

Вы также можете использовать git stash -p. Таким образом, вы можете выбрать, какие ханки должны быть добавлены в stash, можно также выбрать целые файлы.

Вам будет предложено несколько действий для каждого столбца:

y - stash this hunk
n - do not stash this hunk
q - quit; do not stash this hunk or any of the remaining ones
a - stash this hunk and all later hunks in the file
d - do not stash this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help