Могу ли я сделать более старую ревизию с подсказкой и толчком (используя Mercurial)? - PullRequest
10 голосов
/ 22 марта 2011

Скажите, если у меня хорошая ревизия: 3200. Затем я хочу что-то протестировать, и так как в ней 10 строк изменений, и мне нужно удалить несколько строк, хотя я все еще тестирую, я фиксирую сначала, а после некоторые изменения, сделайте коммит снова, и скажем, я сделал 6 коммитов.

Теперь я хочу отложить это, но я не хочу терять все тестирование и написанный код, поэтому я хочу

$ hg up -r 3200

какая хорошая, стабильная ревизия мне нужна, и теперь я могу сделать коммит и нажать как подсказку? (если возможно, я хочу избежать возврата hg backout, потому что это выглядит несколько плохо, и я не хочу выполнять откат, потому что откат имеет побочный эффект: «если кто-то оторвался от меня в течение этого времени, изменение может каким-то образом вернуться в репо ")

Ответы [ 3 ]

12 голосов
/ 22 декабря 2011

Задержка может быть осуществлена ​​несколькими способами в Mercurial.Самый простой способ - просто никуда не толкать.После того, как вы вернетесь в историю с

$ hg update 3200

, вы можете использовать

$ hg push -r .

, чтобы перейти только до версии 3200. . важен - это означает, что родительская версия рабочей копии, который в данном случае равен 3200. Редакция 3200 не будет «наконечником» в вашем локальном хранилище, поскольку у вас все еще есть ревизии 3201–3206, а ревизия с самым высоким номером - всегда , что мы называем «подсказкой».Другими словами, история выглядит следующим образом:

[3199] -- [3200] -- [3201] ... [3205] -- [3206]
             ^                              ^
            "."                           "tip"

, где я отметил текущую родительскую версию рабочей копии и ревизию подсказки.

Когда вы начинаете работать на основе версии 3200,график изменится на

[3199] -- [3200] -- [3201] ... [3205] -- [3206]
                \
                 \-------------------------------- [3207]
                                                      ^
                                                  ".", "tip"

Пожалуйста, постарайтесь не добавлять слишком много акцента на «совет».Он постоянно меняется и вообще не очень интересен.Если вы вернетесь к 3206 и сделаете коммит, то tip будет обозначать вновь созданную ревизию 3208 в вашем хранилище.В другом хранилище tip может быть чем-то другим, в зависимости от того, что было извлечено из вас и когда было извлечено.

Если вам часто нужно сделать hg push -r ., тогда я предлагаю вам создать псевдоним для него.Такой псевдоним был бы более мягким толчком и поэтому мог бы называться "толчком" :

[alias]
nudge = push -r .

С этим в вашем наборе инструментов вы всегда можете сделать

$ hg nudge

чтобы отправить наборы изменений, которые вы только что создали, на сервер, не беспокоясь об отправке любых других веток, которые вы могли бы приостановить.

Наконец, помните, что вы можете использовать

$ hg update 3206
$ hg commit --close-branch -m "Abandoning this line of development"

, чтобы пометить набор изменений 3206 как «закрытый».Это означает, что он не будет отображаться в hg heads и не будет рассматриваться для объединения при запуске hg merge.Вам будет необходимо использовать hg push --force, если вы отправите его на сервер, но это нормально, поскольку вы не создаете несколько открытых головок, вы просто добавляете еще одну закрытую головку.

проблема с несколькими открытыми головами в том, что новый hg clone может обновиться до одного из них, и это может сбить с толку - люди не будут знать, с чего начать.В последних версиях Mercurial hg clone не будет обновляться до закрытых головок, поэтому вы избежите этой проблемы.

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

0 голосов
/ 20 декабря 2011

Крупанс ответ , конечно, правильно, и он уже упоминал проблему наличия двух голов. Но я хотел бы подчеркнуть, что тогда у вас будет две головы одной ветви , и другим людям будет трудно понять, что происходит и какую головку использовать.

По этой причине может быть полезно поместить ваш тестовый код в новую ветку, и для этого вам придется переписать историю. Вы можете сделать это с расширением MQ (при условии, что 3201 является дочерней версией Rev 3200, а 3206 - последняя из ваших фиксаций тестирования:

hg qimport -r 3201:3206
hg qpop -a
hg branch branchname
hg qpush -a
hg qfinish -r 3201:3206

Попробуйте это на клоне вашего репо!

Это должно быть сделано, только если вы еще не отправили эти изменения в другие места.

0 голосов
/ 02 апреля 2011

Судя по вопросу и сопровождающим комментариям, кажется, что вы хотите, чтобы все новые изменения были основаны на 3200, оставляя предыдущую работу на основе 3200 как отдельную ветвь.Это легко сделать:

hg up 3200
# work work
hg ci -m "new work based on 3200"

, но, насколько я могу судить, нет способа пометить 3200 как подсказку.Как только вы зафиксируете что-то на основе 3200, эта новая ревизия станет подсказкой, так что вы можете внести какое-то мягкое изменение и зафиксировать ее, чтобы создать новую подсказку, но это немного глупо.Другой вариант, если вы обеспокоены тем, что коллеги по работе не будут знать, как использовать 3200 в качестве основы для своей работы, поскольку Mercurial не будет помечать его как подсказку, это дать ему тег и сказать членам команды, чтобы они проверяли и обновляли свою рабочую копию.на этот тег, прежде чем начать свою работу.

...