Поточний скидання одного файлу


1004

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

У SVN я б використовував svn revert <filename>(далі - за svn update <filename>потреби), але в Git я повинен використовувати git reset --hard. Однак ця команда не може працювати в одному файлі.

Чи є в Git спосіб скасувати зміни в одному файлі та перезаписати його свіжою копією HEAD?


3
git checkoutнижче відповідь. У git "повернення" - це те, що ти робиш до виконання. "Повернути" відтворює обернену історичну комісію у вашому робочому каталозі, тож ви можете зробити нове зобов'язання, яке "скасовує" повернену комісію. Я вважаю, що це часто плутанина для людей, які приходять на git зі svn.
Ден Рей


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

Це питання передбачає, що відомо, що таке жорсткий перезавантаження.

Відповіді:


1807

Можна використовувати таку команду:

git checkout HEAD -- my-file.txt

... яка буде оновлювати як робочу копію, так my-file.txtі її стан в індексі з такою з HEAD.

--в основному означає: трактувати кожен аргумент після цього пункту як ім'я файлу . Детальніше у цій відповіді . Дякуємо VonC, що вказав на це.


58
Більш повна відповідь. +1;) Для '-', дивись також stackoverflow.com/questions/6561142 / ... (і, в більш загальному випадку , stackoverflow.com/questions/1192180 / ... )
VonC

8
Крім того, не забувайте, що ви можете посилатися на попереднє зобов’язання, HEAD~1щоб вказати передостаннє вчинення.
Ryanmt

14
Ви можете піти з місця, HEADякщо опинилися на чолі поточної філії - дивіться norbauer.com/rails-consulting/notes/…
cxw

4
Будь-яке розуміння, чому resetкоманда (як сказано) "не може зробити важкий перезавантаження шляхами", і чому тоді ця checkoutкоманда не (не може бути?) Використовується для жорсткого скидання всього набору? (Я маю на увазі, чому це було розроблено так.)
Sz.

1
@cxw На жаль, це не зовсім так. На сторінці man git checkout: "Перезапишіть контури в робочому дереві, замінивши вміст в індексі або в <tree-ish>". Тобто, якщо <tree-ish>пропущено, будь-який вміст в індексі буде використовуватися для оновлення робочого дерева. Це може або не відрізняється від HEAD.
tuntap

136

Скинути на голову:

Щоб жорстко скинути один файл до HEAD:

git checkout @ -- myfile.ext

Зауважте, що @це короткий дляHEAD . Старіша версія git може не підтримувати коротку форму.

Скидання до індексу:

Щоб жорстко скинути один файл до індексу , якщо припустимо, що індекс не порожній, інакше для HEAD:

git checkout -- myfile.ext

Сенс у тому, що для безпечності ви не хочете виходити з команди @чи HEADз команди, якщо ви конкретно не маєте намір скинути лише індекс .


1
Що відбувається з "-" перед myfile.ext?
Lance Kind

3
@LanceKind Як я розумію, це використовується для розмежування списку імен файлів, що слідує за ним. Без нього бувають випадки, коли git трактує аргументи неправильно.
Acumenus

2
Не лише імена файлів. Широко використовується конвенція відокремлює варіанти від позиційних аргументів у багатьох комунальних службах. Див. man bashСторінку. Також згадується у цій відповіді: unix.stackexchange.com/a/187548/142855
boweeb

1
Зазвичай, --це використовується для розповіді програми I've finished specifying "options", and from here on, everything will be a positional argument.. Умовно, "варіанти" - це лексеми, подібні до --recursiveяких можуть з'являтися в будь-якому порядку, або навіть поєднуватись у короткому вигляді, як, наприклад, з rm -rf. Навпаки, "позиційні аргументи" набагато більше схожі на аргументи, передані функції на мові програмування: їхнє положення у списку лексем визначає, що саме програма буде робити з ними (це найчастіше назви файлів). --знімає неоднозначність щодо того, що є.
іоносферні


18

З Git 2.23 (серпень 2019 року) ви можете користуватися restore( детальніше ):

git restore pathTo/MyFile

Вище буде відновити MyFileнаHEAD (останньої фіксації) на поточній гілці.

Якщо ви хочете отримати зміни від інших комісій, ви можете повернутися назад до історії комісій. Згадана нижче команда отримає MyFileдва коміти попереднього. Тепер вам потрібна опція -s( --source), оскільки тепер ви використовуєте, master~2а не master(за замовчуванням) для відновлення джерела:

git restore -s master~2 pathTo/MyFile

Ви також можете отримати файл з іншої гілки!

git restore -s my-feature-branch pathTo/MyFile

1
Найпростіший спосіб поки що. На жаль, ця відповідь не приділяє належної уваги.
синріум


4

ви можете скористатися командою нижче для скидання одного файлу

git checkout HEAD -- path_to_file/file_name

Перерахуйте всі змінені файли, щоб отримати path_to_file/filenameкоманду нижче

git status

1

Можна використовувати таку команду:

git reset -- my-file.txt

який буде оновлено як робочу копію, my-file.txtколи буде додано.


Не змінює вміст зміненого файлу, як вимагається.
Рафаель

Коли ви додаєте в скриньку Ви редагували файл?
ADDYQU

1
Це не конкретно суть @ADDQU. Питання полягає в тому, як "жорстко скинути" файл, а не видалити його з поетапного списку.
Рафаель

@Rafael Ви маєте рацію, але я хочу повідомити вам, що є спосіб.
ADDYQU

0

Можна використовувати таку команду:

git checkout filename

Якщо у вас є гілка з тим самим іменем файлу, ви повинні використовувати цю команду:

git checkout -- filename

1
Це не дозволить «важко скинути» файл - він лише копіює стан індексу в робоче дерево. "Жорсткий скидання" спочатку скине індекс.
AH

-21

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

  1. Перегляньте журнал свого файлу

    git log myFile.js

    прихилити 1023057173029091u23f01w276931f7f42595f84f Автор: kmiklas Дата: вівторок 7 серпня 09:29:34 2018 -0400

    JIRA-12345 - Рефактор з новою архітектурою.

  2. Зауважте хеш файлу:

    1023057173029091u23f01w276931f7f42595f84f

  3. Покажіть файл за допомогою хеша. Переконайтесь, що це те, що ви хочете:

    git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js

  4. Перенаправлення файлу на локальну копію

    git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js> myFile.07aug2018.js

  5. Створіть резервну копію поточного файлу.

    cp myFile.js myFile.bak.js

  6. Відкрийте обидва файли у вашому улюбленому текстовому редакторі.

    vim myFile.js
    vim myFile.07aug2018.js

  7. Скопіюйте n 'вставити код з myFile.07aug2018.js на myFile.js та збережіть.

  8. Введіть і натисніть myFile.js

  9. Знову перегляньте журнал і переконайтеся, що ваш файл належним чином.

  10. Скажіть своїм клієнтам витягнути останню версію, радісно спостерігайте, як вона працює зі старою версією на місці.

Не найсексуальніше чи найпопулярніше рішення, і, безумовно, "ручне" скидання / повернення, але воно працює. Це вимагає мінімальних знань про git і не порушує історію фіксації.


2
Ця відповідь набагато складніша та схильна до помилок, ніж будь-яке з рішень, що передували їй роками.
Artif3x

2
Чому хтось повинен використовувати це рішення !? справжня відповідь - лише проста команда.
Мілад Рахімі

1
Це оптимальне рішення для певних обставин. Це заслуга для тих, хто перебуває в роботі, де git не працює, і для тих, хто потребує обходу.
kmiklas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.