Вибірково повернути або перевірити зміни у файлі в Git?


88

Чи існує команда, яка дозволяє частково скасувати зміни у файлі (або файлах) у робочому каталозі?

Припустимо, ви багато разів редагували файл, але ви усвідомлюєте, що хочете скасувати деякі зміни до стану фіксації, але не інші.

Я передбачаю такий варіант, git checkoutякий дуже схожий git add -p, тобто він проходить по файлу шмат за куском і запитує, хочете ви його зберегти чи ні.

Відповіді:


85

Ви могли б використовувати

git add -p <path>

щоб індексувати фрагменти, які ви хочете зберегти в певному файлі, тоді

git checkout -- <path>

відкинути зміни робочого дерева, які ви не хотіли зберігати, перевіривши поетапну версію файлу.

Нарешті, можна використовувати

git reset -- <path>

щоб повернути інсценізовану версію файлу до останньої завершеної версії файлу, щоб залишити ваші зміни без змін.


У цьому простому випадку використання, який кожна інша система контролю версій просто називає "повернути", чому команда Git така незрозуміла?
Ян Хеттіч,

5
@Jan Чи revertдозволяє команда інших систем контролю версій вибрати, які зміни у файлі скасовуються? Щиро запитую, оскільки я маю досвід лише з CVS та Git. У Git git checkout -- path/to/fileє одна команда, яка повертає всі зміни у цьому файлі, але це не те саме, що вище.
michiakig

3
Є також git checkout --patchі git reset --patchякі працюють, як git add --patchу останньому git.
Matt Connolly,

2
@Rudie, як --правило, вказують на закінчення розбору варіантів, і що будь-які аргументи, що надходять після нього, слід тлумачити буквально. Це означає, що вам не доведеться додавати ./будь-яке ім'я файлу, яке починається зі знака мінус, якщо ім'я файлу постає після --.
zrajm

коли я використовую git checkout --patchрізницю, здається, назад. Мінуси - це ДОДАВАННЯ тексту до моєї робочої копії, а символи плюсу - ВИДАЛЕННЯ рядків з моєї робочої копії.
Феліпе Альварес

115

З версією git> = 1.7.1 я можу

git checkout -p

Я не впевнений, коли ця функція була введена.


11
Варто зазначити, що ви також git reset -pможете вибірково відміняти зміни в зоні / індексі. Я також не знаю, з якою версією Git це було представлено.

Це правильна відповідь, чому її не прийняли.
Wukong

1
@wukong, оскільки ця відповідь була опублікована через 2 роки після запитання. На цей момент (2009 р.) Відповідь Чарльза було найкращим рішенням
помех

8

git checkout $fileповертає стан файлу $fileдо останнього зафіксованого стану. Я думаю, ви можете використати git checkout SHA-1 -- $fileдля повернення файлу до коміту, визначеного SHA-1.


1
так, не зовсім те, що я хочу, оскільки я хочу зберегти деякі зміни, які я вніс у файл, а повернути інші
1800 ІНФОРМАЦІЯ

1

Скільки комітів потрібно повернути назад і вибрати з них? Якщо це лише один, можливо, візьміть гілку безпосередньо перед нею, перевірте файл, який ви створили, а потім використовуйте, git add -pщоб додати його, як ви цього хотіли. Потім ви можете повернутися туди, де ви були, і перевірити файл із вашої тимчасової гілки.

це є:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp

Інші альтернативи включають повернення назад і редагування коміту за допомогою git rebase -i(позначення коміту як edit, потім виконання git reset HEAD^та повторення коміту при скиданні назад в оболонку).

Якщо зміни, які вам потрібно вибрати, розподілені по серії комітів, може бути краще витягти їх як патчі (або патч, що охоплює всі) і відредагувати патч вручну, видаливши зміни, які ви хочете зберегти, і подача залишку в git apply --reverse.


Я насправді не хочу скасовувати нічого, що було здійснено, я хочу скасувати зміни, які є лише у моїй робочій копії
1800 ІНФОРМАЦІЯ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.