Відповіді:
Можна використовувати
git checkout -- file
Ви можете зробити це без --
(як це запропонував nimrodm), але якщо ім'я файлу має вигляд гілки чи тегу (або іншого ідентифікатора редакції), воно може заплутатися, тому --
найкраще використовувати.
Ви також можете перевірити певну версію файлу:
git checkout v1.2.3 -- file # tag v1.2.3
git checkout stable -- file # stable branch
git checkout origin/master -- file # upstream master
git checkout HEAD -- file # the version from the most recent commit
git checkout HEAD^ -- file # the version before the most recent commit
git reset HEAD <filename> ; git checkout -- <filename>
HEAD^^
за 2 коміти з останніх або HEAD^^^
за 3 комісії назад. Ви також можете використовувати HEAD~2
або HEAD~3
, що стає зручнішим, якщо ви хочете повернути більше комісій назад, тоді як HEAD^2
означає "другий з батьків цього комітету"; через об'єднання об'єднань комісія може мати більше одного попереднього прихильності, тому з HEAD^
числом вибирає, хто з цих батьків, тоді як з HEAD~
номером завжди вибирає першого з батьків, але це число здійснює назад. Дивіться git help rev-parse
докладнішу інформацію.
Просто використовуйте
git checkout filename
Це замінить ім'я файлу останньою версією з поточної гілки.
УВАГА: ваші зміни будуть відкинуті - резервна копія не зберігається.
git checkout x
і x трапляється як назва гілки, а також ім'я файлу, я не впевнений, що таке поведінка за замовчуванням, але я думаю, що git припустить, що ви хочете перейти на гілку x. Під час використання --
ви говорите, що наступне - це назви файлів.
--
її. Хоча все-таки правильно, як зазначає @hasen, якщо між іменем файлу та іменами гілок є неоднозначність, то тут у вас може виникнути дуже небажана поведінка!
--
приємного та легкого. Коли ви називаєте гілки, використовуючи назви файлів, десь має бути погано задуматися ...
git checkout <commit> <filename>
Я використовував це сьогодні, тому що зрозумів, що мій фавікон був перезаписаний кілька фільмів тому, коли я зробив реплікацію до drupal 6.10, тому мені довелося повернути його. Ось що я зробив:
git checkout 088ecd favicon.ico
git log --oneline <filename>
дасть вам більш компактний журнал і включить лише зміни до конкретного файлу
git reflog <filename>
Якщо ваш файл уже є поетапним (трапляється, коли ви робите додавання git і т. Д. Після редагування файлу), щоб скасувати зміни.
Використовуйте
git reset HEAD <file>
Тоді
git checkout <file>
Якщо ви вже не ставили, просто використовуйте
git checkout <file>
Якщо ви хочете просто скасувати зміни попереднього комітету до цього одного файлу, ви можете спробувати це:
git checkout branchname^ filename
Це дозволить перевірити файл таким, яким він був до останнього фіксації. Якщо ви хочете піти ще кілька разів назад, використовуйте branchname~n
позначення.
branchname^
Я завжди плутаюсь із цим, тому ось тестовий випадок нагадування; скажімо, у нас є цей bash
сценарій для тестування git
:
set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt
На даний момент зміна не ставиться в кеш-пам'яті, так git status
:
$ 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)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
Якщо з цього моменту ми це зробимо git checkout
, результат такий:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Якщо замість цього ми це зробимо git reset
, результат:
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ 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)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
Отже, у цьому випадку - якщо зміни не є поетапними, git reset
це не має значення, тоді git checkout
як зміни перезаписуються.
Тепер скажімо, що остання зміна вищезазначеного сценарію є поетапною / кешованою, тобто ми також зробили git add b.txt
в кінці.
У цьому випадку git status
на даний момент є:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
Якщо з цього моменту ми це зробимо git checkout
, результат такий:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Якщо замість цього ми це зробимо git reset
, результат:
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ 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)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
Отже, у такому випадку - якщо зміни будуть поетапними, git reset
вони в основному вносять поетапні зміни в нестандартні зміни - при git checkout
цьому зміни будуть повністю замінені.
Ця відповідь призначена для команди, необхідної для скасування локальних змін, які знаходяться в декількох конкретних файлах в одній або декількох папках (або каталогах). Це відповідь конкретно стосується питання, коли користувач має більше одного файлу, але користувач не хоче скасувати всі локальні зміни:
якщо у вас є один або кілька файлів, ви можете застосувати одну і ту ж команду (
git checkout -- file
) до кожного з цих файлів, перерахувавши кожне їх розташування, розділене пробілом, як у:
git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
майте на увазі пробіл вище name1 / name2 / fileOne.ext nameA / subFolder / fileTwo.ext
Для декількох файлів в одній папці:
Якщо вам потрібно скасувати зміни для всіх файлів у певному каталозі, скористайтеся git checkout таким чином:
git checkout -- name1/name2/*
Зірочка у наведеному вище полягає в хитрість скасування всіх файлів у цьому місці під ім'ям1 / ім'я2.
Так само, наступне може скасувати зміни у всіх файлах для кількох папок:
git checkout -- name1/name2/* nameA/subFolder/*
знову пам’ятайте пробіл між name1 / name2 / * nameA / subFolder / * у зазначеному вище.
Примітка: name1, name2, nameA, subFolder - усі ці приклади прикладних папок вказують на папку або пакет, де можуть знаходитися файли, про які йдеться.
Якщо ви ще не надіслали або іншим чином не поділилися своїми зобов'язаннями:
git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend