^[0-9]+(\.[0-9]{1,2})?$
И поскольку регулярные выражения ужасны для чтения, а тем более понятны, вот многословный эквивалент:
^ # Start of string [0-9]+ # Require one or more numbers ( # Begin optional group \. # Point must be escaped or it is treated as "any character" [0-9]{1,2} # One or two numbers )? # End group--signify that it's optional with "?" $ # End of string
Вы можете заменить
[0-9]
на\d
в большинстве реализаций регулярных выражений (в том числе PCRE , наиболее распространенный). Я оставил его как[0-9]
, как мне кажется, его легче читать.Кроме того, вот простой скрипт Python, который я использовал для проверки:
import re deci_num_checker = re.compile(r"""^[0-9]+(\.[0-9]{1,2})?$""") valid = ["123.12", "2", "56754", "92929292929292.12", "0.21", "3.1"] invalid = ["12.1232", "2.23332", "e666.76"] assert len([deci_num_checker.match(x) != None for x in valid]) == len(valid) assert [deci_num_checker.match(x) == None for x in invalid].count(False) == 0
Принятие хеша фиксации, которую Вы хотите, c5f567
:
git checkout c5f567 -- file1/to/restore file2/to/restore
контроль мерзавца страница справочника дает больше информации.
, Если Вы хотите вернуться к фиксации прежде c5f567
, добавьте ~1
(работы с любым числом):
git checkout c5f567~1 -- file1/to/restore file2/to/restore
Как примечание стороны, я всегда чувствовал себя неловко из-за этой команды, потому что она используется для обеих обычных вещей (изменяющийся между ответвлениями) и необычных, разрушительных вещей (отменяющий изменения в рабочем каталоге).
Обратите внимание, однако, что git checkout ./foo
и git checkout HEAD ./foo
не точно то же самое; рассматриваемый вопрос:
$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A
(Второе add
этапы файл в индексе, но это делает не , фиксируются.)
Git checkout ./foo
средства возвращаются, соединяют каналом ./foo
от индекс ; добавление HEAD
дает Мерзавцу команду возвращаться, которые соединяют каналом в индексе к HEAD
пересмотр прежде, чем сделать так.
Забавно, git checkout foo
не будет работать, если рабочая копия будет в каталоге, названном foo
; однако, и git checkout HEAD foo
и git checkout ./foo
будет:
$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo
git checkout -- foo
, Который сбросит foo
для ЗАГОЛОВКА. Вы можете также:
git checkout HEAD^ foo
для одного пересмотра назад, и т.д.
Я должен включиться EasyGit здесь, который является оберткой для создания мерзавца более доступным новичкам, не смущая опытных пользователей. Одна из вещей, которые это делает, , дают больше значений git revert
. В этом случае Вы просто сказали бы:
eg revert foo/bar foo/baz
git revert <hash>
вернется данная фиксация. Это кажется, что Вы думаете git revert
только влияние новая фиксация.
, Который не решает Вашу проблему, если Вы хотите вернуться, изменение в определенном файле и той фиксации изменило больше, чем тот файл.
ClassCastException
, выходя RuntimeException
...
– Lukas Eder
25 September 2012 в 22:53
Я думаю, что находил его.... от http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
Иногда, Вы просто хотите возвратиться и забыть о каждом изменении мимо определенного момента, потому что они неправы.
Запускаются с:
$ git log
, который показывает Вам список недавних фиксаций и их хеши SHA1.
Затем, тип:
$ git reset --hard SHA1_HASH
, чтобы восстановить состояние к данной фиксации и стереть все более новые фиксации из записи постоянно.
Можно быстро рассмотреть изменения, внесенные в файл с помощью различной команды:
git diff <commit hash> <filename>
Затем для возвращения определенного файла к той фиксации используют команду сброса:
git reset <commit hash> <filename>
Вы, возможно, должны использовать --hard
опция, если у Вас есть локальные модификации.
А хороший рабочий процесс для managaging waypoints должен использовать теги для чистой маркировки точек во временной шкале. Я не могу вполне понять Ваше последнее предложение, но что можно хотеть, отличают ответвление от предыдущего момента времени. Чтобы сделать это, используйте удобную команду контроля:
git checkout <commit hash>
git checkout -b <new branch name>
можно затем повторно основывать это против магистрали, когда Вы готовы объединить те изменения:
git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
static
- удаленный. Я don' t понимают, как Ваша вторая точка применяется.
– OldCurmudgeon
18 March 2013 в 10:27
Необходимо быть осторожными при высказывании "отката". Если Вы раньше имели одну версию файла в $A фиксации и затем позже внесли два изменения в двух отдельных $B фиксаций и $C (поэтому, что Вы видите, третье повторение файла), и если Вы говорите, "Я хочу откатывать к первому", Вы действительно имеете в виду это?
, Если Вы хотите избавиться от изменений и второе и третье повторение, это очень просто:
$ git checkout $A file
и затем Вы фиксируете результат. Команда просит, чтобы "Я хотел проверить файл от состояния, зарегистрированного $A фиксации".
, С другой стороны, то, что Вы имели в виду, должно избавиться от изменения второе повторение (т.е. $B фиксации) введенный при хранении того, что $C фиксации сделал в файл, Вы захотите вернуться $B
$ git revert $B
Примечание, которое, кто бы ни создал $B фиксации, не могло быть очень дисциплинировано и, возможно, фиксировало полностью несвязанное изменение в той же фиксации, и это возвращается, может коснуться файлов кроме файл , Вы видите незаконные изменения, таким образом, можно хотеть проверить результат тщательно после выполнения так.
Вот то, как rebase
работы:
<час>git checkout <my branch> git rebase master git checkout master git merge <my branch>
Предполагают, что Вы имеете
---o----o----o----o master \---A----B <my branch>
, первые две команды... фиксируют ведущее устройство перебазы мерзавцев контроля мерзавца
... проверяют ответвление изменений, к которым Вы хотите обратиться эти master
ответвление. Эти rebase
команда берет фиксации от [1 110] (которые не найдены в [1 111]), и повторно применяет их к главе [1 112]. Другими словами, родитель первой фиксации в [1 113] больше не является предыдущей фиксацией в master
история, но текущий глава [1 115]. Две команды совпадают с:
git rebase master <my branch>
могло бы быть легче помнить эту команду как обоих, которые "основа" и "изменить" ответвления является явной.
. Заключительный результат истории:
<час>---o----o----o----o master \----A'----B' <my branch>
заключительные две команды...
git checkout master
git merge <my branch>
... делают слияние ускоренной перемотки вперед для применения всего <my branch>
изменения на [1 117]. Без этого шага переосновная фиксация не становится добавленной к [1 118]. Конечный результат:
---o----o----o----o----A'----B' master, <my branch>
master
и <my branch>
обе ссылки B'
. Кроме того, от этой точки безопасно удалить <my branch>
ссылка.
git branch -d <my branch>
С мерзавца v2.23.0 существует новое восстановление мерзавца метод, который, как предполагается, принимает часть того, что git checkout
было ответственно за (даже принятый ответ упоминает, что git checkout
довольно сбивает с толку). Посмотрите выделения изменений на блог .
GitHub, поведение по умолчанию этой команды состоит в том, чтобы восстановить состояние рабочего дерева с содержанием, прибывающим из source
параметр (который в Вашем случае будет хешем фиксации).
Так на основе ответа Greg Hewgill (принимающий хеш фиксации c5f567
) команда была бы похожа на это:
git restore --source=c5f567 file1/to/restore file2/to/restore
Или если Вы хотите восстановить к содержанию одной фиксации прежде c5f567:
git restore --source=c5f567~1 file1/to/restore file2/to/restore
Если Вы знаете, сколько фиксаций необходимо возвратиться, можно использовать:
git checkout master~5 image.png
Это предполагает, что Вы идете master
ответвление и версия, которую Вы хотите, являются 5 фиксациями назад.
Можно использовать любую ссылку на фиксацию мерзавца, включая SHA-1, если это является самым удобным. Дело в том, что команда похожа на это:
git checkout [commit-ref] -- [filename]
У меня только что была такая же проблема, и я нашел этот ответ наиболее простым для понимания ( commit-ref
- это значение SHA изменения в log, к которому вы хотите вернуться):
git checkout [commit-ref] [filename]
Это поместит эту старую версию в ваш рабочий каталог, и оттуда вы можете зафиксировать ее, если хотите.