Могу ли я сделать старую ревизию подсказкой и нажать (используя Mercurial)?

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

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

$ hg up -r 3200

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

Ответ 1

Удержание вещей может быть выполнено несколькими способами в 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 и сделаете фиксацию, то подсказка будет обозначать вновь созданную версию 3208 в вашем репозитории. В другом репозитории наконечник может быть чем-то другим, в зависимости от того, что было вытащено от вас и когда оно было вытащено.

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

[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 не будет обновляться до закрытых головок, поэтому вы избегаете этой проблемы.

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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