Могу ли я сделать более старую ревизию с подсказкой и толчком (используя Mercurial)?
Скажите, если у меня есть хорошая ревизия: 3200. Затем я хочу что-то протестировать, и так как в ней 10 строк изменений, и мне нужно удалить несколько строк, хотя я все еще тестирую, я фиксирую сначала, а после некоторых изменений, совершить снова, и скажем, я сделал 6 коммитов.
Теперь я хочу отложить это, но я не хочу терять все тестирование и написанный код, поэтому я хочу
$ hg up -r 3200
какая хорошая, стабильная ревизия мне нужна, и теперь я могу ее зафиксировать и нажать как подсказку? (если возможно, я хочу избежать отступления hg backout
потому что это выглядит несколько плохо, и я не хочу откатывать, потому что у отката есть побочный эффект: "если кто-то выдернет у меня за это время, изменение может каким-то образом вернуться в репо")
3 ответа
В 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
не будет обновляться до закрытых головок, чтобы избежать этой проблемы.
Вы можете заново открыть закрытую голову, просто сделав дочерний коммит на его основе. Это означает, что вы можете временно закрыть линию разработки без каких-либо побочных эффектов, за исключением примечания на графике о том, что ветка была закрыта в какой-то момент.
Из вопроса и сопровождающих комментариев кажется, что вы хотите, чтобы все новые изменения были основаны на 3200, оставляя предыдущую работу на основе 3200 как отдельную ветвь. Это легко сделать:
hg up 3200
# work work
hg ci -m "new work based on 3200"
но нет никакого способа отметить 3200 как подсказку, насколько я могу судить. Как только вы зафиксируете что-то, основанное на 3200, эта новая ревизия станет подсказкой, так что вы можете внести небольшое изменение и зафиксировать ее, чтобы создать новую подсказку, но это немного глупо. Другой вариант, если вы обеспокоены тем, что коллеги по работе не будут знать, как использовать 3200 в качестве основы для своей работы, поскольку Mercurial не будет помечать его как подсказку, это дать ему тег и сказать членам команды, чтобы они проверяли и обновляли свою рабочую копию. на этот тег, прежде чем начать свою работу.
Ответ крупанца, конечно, правильный, и он уже упоминал о проблеме наличия двух голов. Но я хотел бы подчеркнуть, что тогда у вас будет две главы одной ветви, и другим людям будет трудно понять, что происходит и какую головку использовать.
По этой причине может быть полезно поместить ваш тестовый код в новую ветку, и для этого вам придется переписать историю. Вы можете сделать это с расширением MQ (при условии, что 3201 является дочерней версией Rev 3200, а 3206 является последним из ваших коммитов тестирования:
hg qimport -r 3201:3206
hg qpop -a
hg branch branchname
hg qpush -a
hg qfinish -r 3201:3206
Попробуйте это на клоне вашего репо!
Это следует делать только в том случае, если вы еще не отправили эти изменения в другие места.