Что делает '..' средний в мерзавце переходят ссылка?

В вашем сценарии вам вообще не нужно использовать или повторно внедрять getDerivedStateFromProps. Вам просто нужно создать новую переменную, чтобы получить новую форму данных. Использование состояния в этом сценарии вызовет еще один повторный рендеринг, который не является хорошим с точки зрения производительности.

import React from 'react';

const App = ({ count }) => {
  const derivedCount = count > 100 ? 100 : count;

  return (
    
Counter: {derivedCount}
); } App.propTypes = { count: PropTypes.number.isRequired }

Демонстрация здесь: https://codesandbox.io/embed/qzn8y9y24j?fontsize=14

Подробнее о различных способах решения подобных сценариев можно прочитать без используя getDerivedStateFromProps здесь: https://reactjs.org/blog/2018/06/07/you-probbly-dont-need-derived-state.html

Если вы действительно нужно использовать отдельное состояние, вы можете использовать что-то подобное

import React, { useState } from 'react';

const App = ({ count }) => {
  const [derivedCounter, setDerivedCounter] = useState(
    count > 100 ? 100 : count
  );

  useEffect(() => {
    setDerivedCounter(count > 100 ? 100 : count);
  }, [count]); // this line will tell react only trigger if count was changed

  return 
Counter: {derivedCounter}
; };

33
задан Chris Stryczynski 7 June 2018 в 17:56
поделиться

3 ответа

Я думаю, что это диапазон. Команда ".." покажет вам коммиты между исходной / главной последней фиксацией и тем, что является последней фиксацией в ветке, над которой вы работаете.

Вы также можете указать ветку, которую вы хотите сравнить, поместив ее после .., поэтому он станет

git log origin/master..<branch_name>

. Вы также можете использовать идентификаторы фиксации для фильтрации вывода, например:

git log 663f4c..fec6b

Попробуйте git help log , чтобы увидеть другие параметры: -)

4
ответ дан 27 November 2019 в 17:54
поделиться

С git log (и всеми другими командами Git, которые принимают аналогичный набор аргументов), это спецификация того, как найти диапазон ревизий, да. Помните, что в общем мире Git это означает некий подграф графа ревизий - для большинства людей это обычно означает просто диапазон ревизий в списке. (И если вы мало что делаете, если какое-либо ветвление, оно упрощается и в Git).

Спецификация редакции содержит набор положительных ссылок (начальные точки) и отрицательных ссылок (точки остановки) и дополнительных фильтров (ограничение количество ревизий, текст коммита grep и т. д.). Git начинает с положительных ссылок и возвращается к истории изменений, останавливается, когда он встречает исправления, которые доступны из отрицательных ссылок (не обязательно только тогда, когда он достигает одной из самих отрицательных ссылок).

Возможно, довольно сбивает с толку то, что существуют различные сокращенные обозначения, которые эволюционировали, которые стремятся сделать все это проще в использовании, но при этом каким-то образом удается запутать - мне пришлось потратить немало времени на выяснение того, что означают слова «master..maint», «maint..master» и т. д. и когда какие использовать.

Когда вы просто скажите «origin / master», тогда это означает, что «origin / master» является положительной ссылкой и нет отрицательных ссылок. Итак, Git начинает с origin / master и проходит через все доступные ревизии - вы получаете полную историю origin / master.

"origin / master .." - это сокращение для "

Итак, если вы сделали пару локальных коммитов поверх исходной версии, у вас будет такая ситуация:

steve@monolith:~/src/git <master>$ git log --pretty=oneline --abbrev-commit --decorate -n 4
ea3107d (refs/heads/master) Add another dummy comment
869c260 Add dummy comment
6345d7a (refs/remotes/origin/master, refs/remotes/origin/HEAD) Merge branch 'maint'
be427d7 allow -t abbreviation for --track in git branch

И теперь "git log origin / master .." означает, что git запускается с HEAD (ea3107d), который недоступен из origin / master, поэтому он печатает это. Затем он возвращается к родительскому элементу HEAD (869c260), которого все еще нет, поэтому он печатает это. Затем следующий родительский элемент - 6345d7a, который является origin / master, поэтому он останавливается.

Обратите внимание, что "git log ..origin / master" делает противоположное - пытается вернуться от origin / master к ГЛАВА. В этом случае он ничего не печатает. Но если бы я проверил "origin / maint", он напечатал бы ревизии в origin / master, которых не было в origin / maint: так что в общем, попробуйте думать о "A..B" как о "ревизиях в B, которые не являются в", и помните, что опускание A или B означает «ГОЛОВА».

Просто для дополнительной беспорядочной путаницы есть также обозначение «A ... B». Так что не забудьте посчитать количество точек! В случае, если A и B находятся в строке исправлений, реальной разницы нет. Но то, что "A ... B" означает, это исправления в A или B, которые не находятся ни в одной из баз слияния для A и B. Таким образом, если A и B находятся на расходящихся ветвях, он показывает все коммиты, сделанные на любом из так как они расходились.

«Длинная форма» для диапазона ревизий («B - not A») позволяет вам указывать такие вещи, как «все ревизии в локальных ветвях, которые не находятся ни в одной ветке удаленного отслеживания» («- -ветвями - not --remotes "). Этот список аргументов анализируется многими командами Git ("git rev-list" является основной), включая gitk. Таким образом, вы можете выполнить команду «gitk --branches --not --remotes», чтобы увидеть свои локальные изменения графически.

И, наконец, для мега-бонусной путаницы такие команды, как «git diff», допускают такой же сокращенный синтаксис, но он не означает (совершенно) одно и то же. git diff фактически берет две ревизии и сравнивает их, что не то же самое, что диапазон - помните, что диапазон ревизий в Git - это подграф, а не просто список. «git diff A..B» эквивалентно «git diff A B». "git diff A ... B" означает "показать изменения в B с момента его отклонения от A". Смешение? Немного: например, git log A ... B и git log B ... A означают одно и то же, но git diff A ... B и git diff B ... A "не надо.

чтобы увидеть ваши локальные изменения графически.

И, наконец, для мега-бонусной путаницы, команды вроде "git diff" принимают тот же вид сокращенного синтаксиса, но это не означает (совсем) то же самое. git diff фактически берет две ревизии и сравнивает их, что не то же самое, что диапазон - помните, что диапазон ревизий в Git - это подграф, а не просто список. «git diff A..B» эквивалентно «git diff A B». "git diff A ... B" означает "показать изменения в B с момента его отклонения от A". Смешение? Немного: например, git log A ... B и git log B ... A означают одно и то же, но git diff A ... B и git diff B ... A "не надо.

чтобы увидеть ваши локальные изменения графически.

И, наконец, для мега-бонусной путаницы, команды вроде "git diff" принимают тот же вид сокращенного синтаксиса, но это не означает (совсем) то же самое. git diff фактически берет две ревизии и сравнивает их, что не то же самое, что диапазон - помните, что диапазон ревизий в Git - это подграф, а не просто список. «git diff A..B» эквивалентно «git diff A B». "git diff A ... B" означает "показать изменения в B с момента его отклонения от A". Смешение? Немного: например, git log A ... B и git log B ... A означают одно и то же, но git diff A ... B и git diff B ... A "не надо.

принимайте такой же сокращенный синтаксис, но это не означает (совсем) то же самое. git diff фактически берет две ревизии и сравнивает их, что не то же самое, что диапазон - помните, что диапазон ревизий в Git - это подграф, а не просто список. «git diff A..B» эквивалентно «git diff A B». "git diff A ... B" означает "показать изменения в B с момента его отклонения от A". Смешение? Немного: например, git log A ... B и git log B ... A означают одно и то же, но git diff A ... B и git diff B ... A "не надо.

принимайте такой же сокращенный синтаксис, но это не означает (совсем) то же самое. git diff фактически берет две ревизии и сравнивает их, что не то же самое, что диапазон - помните, что диапазон ревизий в Git - это подграф, а не просто список. «git diff A..B» эквивалентно «git diff A B». "git diff A ... B" означает "показать изменения в B с момента его отклонения от A". Смешение? Немного: например, git log A ... B и git log B ... A означают одно и то же, но git diff A ... B и git diff B ... A "не надо.

что не то же самое, что диапазон - помните, что диапазон ревизий в Git - это подграф, а не просто список. «git diff A..B» эквивалентно «git diff A B». "git diff A ... B" означает "показать изменения в B с момента его отклонения от A". Смешение? Немного: например, git log A ... B и git log B ... A означают одно и то же, но git diff A ... B и git diff B ... A "не надо.

что не то же самое, что диапазон - помните, что диапазон ревизий в Git - это подграф, а не просто список. «git diff A..B» эквивалентно «git diff A B». "git diff A ... B" означает "показать изменения в B с момента его отклонения от A". Смешение? Немного: например, git log A ... B и git log B ... A означают одно и то же, но git diff A ... B и git diff B ... A "не надо.

49
ответ дан 27 November 2019 в 17:54
поделиться
git log origin/master

Будет похоже (фальшивая команда):

git log INITIAL..origin/master

В то время как:

git log origin/master..

Is:

git log origin/master..HEAD
22
ответ дан 27 November 2019 в 17:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: