Вы просите лучший способ; Там не обязательно лучший способ. Однако есть много способов достижения sh вашей цели.
Во-первых, помните, что Git хранит на том уровне, на котором вы его используете, commits . Каждый коммит содержит полный и полный снимок всех ваших файлов. Когда вы используете git checkout
(или в Git 2.23 или позже, git switch
), вы обычно делаете это, выбирая какой-то commit (часто с использованием имени ветви). Это извлекает этот снимок всех ваших файлов. Теперь вы можете работать с этой версией из каждого файла.
Это означает, что тривиально легко перейти к предыдущей версии, но только если вы хотите каждый файл из этой предыдущей версии. Сначала вы должны выбрать конкретный коммит, который вы хотите - возможно, запустив git log
и просматривая каждый коммит, пока не найдете тот, который вам нужен - затем использовать его уникальный идентификатор ha sh, чтобы проверить его:
git checkout a123456
или:
git switch a123456
в предположении, что сокращение ha sh равно a123456
. (Если вы используете мышь, чтобы вырезать и вставить идентификатор ha sh, просто возьмите и пропустите все это.) Это в основном возвращает вас назад во времени к этому конкретному коммиту. Чтобы вернуться к «текущему времени», вы просто go вернетесь к своему коммиту с ответвлением по ветке, набрав git checkout master
или git switch feature
или что-либо еще (снова, используя git switch
, если вы используете Git 2.23 или более позднюю версию, или git checkout
если старше Git, или вы просто предпочитаете придерживаться более старой команды).
Но это не то, что вы хотите. Это вернуло бы все ваших файлов к этой версии. Вы хотите вернуть только часть одного файла к этой версии. Так что теперь у вас есть много вариантов. Один из них может быть лучшим для вас.
В следующих нескольких разделах помните: Каждый коммит имеет полный и полный снимок всех ваших файлов. Git предоставляет инструменты для работы с этими снимками. Некоторые работы лучше всего выполнять с некоторыми конкретными инструментами, и иногда вы можете использовать инструмент с хорошим эффектом, например, используя отвертку с плоским жалом, как долото - но инструмент вправо облегчит его.
Рассмотрите возможность использования git revert
Команда git revert
по существу 1 сравнивает commit с его непосредственным родительским коммитом, вычисляет, что изменилось , и un-делает это изменение. Поскольку вы выполняли много небольших коммитов, возможно, фрагмент кода, который вы хотите изменить назад , - это то, что вы изменили only , если сравнить коммит, в котором вы изменили этот фрагмент кода , против коммита до этой точки.
Если это так, git revert <hash>
отменит это одно изменение, сделав новый коммит из результата. Вы получите именно то, что хотите, с помощью одной простой команды Git.
Если изменение, которое вы совершили , больше, чем изменение, которое вы хотите , вы все еще можете использовать git revert
. Использование git revert -n
, Git будет применять каждое «отменение» к каждому файлу, который был изменен в этом коммите, но на самом деле не commit отмену. Затем вы можете исправить все что угодно, в том числе использовать git checkout HEAD -- <em>path</em>
, чтобы отменить отмену любого конкретного файла. 2 Это, очевидно, больше работы, чем один возврат, который делает все, но все же может быть полезным способом используйте инструмент "back out commit".
1 Я говорю по существу , потому что внутри Git использует механизм слияния , чтобы сделать работу по возврату. Это означает, что вы можете получить конфликтов слияния , когда сделаете возврат. Если он у вас есть, и вы не хотите с ним иметь дело, вы можете использовать git revert --abort
, чтобы отменить попытку возврата, и вернуть все обратно, как было при запуске.
Обратите внимание, что для git revert --abort
для работы необходимо запустить откат с «чистой» настройкой. Однако обычный git revert
требует этого в любом случае. С другой стороны, git revert -n
нет, поэтому будьте осторожны при использовании git revert -n
для запуска с чистой установкой, где git status
говорит nothing to commit, working tree clean
.
2 В Git 2.23 и более поздних версиях вы можете использовать git restore
для этого, если хотите. Однако метод git checkout HEAD --
все еще работает.
Рекомендуется использовать git checkout -p
Если вы нашли снимок - любой снимок - который имеет версию кода, которую вы хотите, вы можете запустить:
git checkout -p <hash> -- <path>
чтобы Git сравнить версию файла с именем path
с версия файла в снимке, обозначенная hash
. То есть git checkout -p
извлекает зафиксированную версию файла во временную область, а затем запускает git diff
, чтобы сравнить временную копию с той, что у вас есть в вашей обычной области рабочего дерева. Затем, для каждого изменения, которое показывает git diff
, Git предложит сделать копию рабочего дерева похожей на подтвержденную копию.
Теперь вы можете сказать Git, что нужно использовать только diff-hunks (части изменений), которые вы хотите, а не другие части. Обратите внимание, что этот процесс очень интерактивный: он требует много человеческого времени.
Рассмотрите возможность использования git show
Опять же, каждый коммит содержит полный снимок всех файлов. Но что, если вы просто хотите посмотреть на - и, возможно, сохранить в каком-то другом файле - содержимое одного файла из одного конкретного коммита? Команда git show
может сделать это:
git show <hash>:<path>
отображает, как показано на вашем пейджере, подтвержденную копию файла с именем path
, как она появляется в коммите, идентифицированном hash
. Вы можете использовать операцию перенаправления вашей оболочки:
git show <hash>:path/to/file.ext > path/to/file.ext.old
, чтобы выгрузить все содержимое в файл. Обратите внимание, что если вы находитесь в подкаталоге, например path/to
, вам может потребоваться:
git show <hash>:path/to/file.ext > file.ext.old
или:
git show <hash>:./file.ext > file.ext.old
как более короткий способ сделать это ( использование полного пути требует cd
(сначала на верхний уровень вашего репозитория).
Теперь у вас есть эта конкретная версия файла, и вы можете использовать любой инструмент, который вам нравится - например, ваш повседневный файл - редактор - как для текущей, так и для старой версии файла.