Git эквивалент меркуриальных фаз?

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

IE:

hg commit -sm "Partial work"
# Crap, prod is down
hg up -r <public version number>
hg commit -m "Fixin prod"
hg out
  1 outgoing change, "Fixin prod"
hg push
hg rebase -r <secret revisions> -d.
# later
hg commit --amend -m "Finished work"
hg phase -dr.
hg out
  1 outgoing change, "Finished work"
hg push 

Как бы вы сделали это в Git?

2 ответа

Использование веток:

$ git checkout -b dev #create a new branch based on the current commit in master
# .... work ....
$ git commit -a -m 'super awesome new feature'
# oh noes, production crapped itself!
$ git checkout master
# ... fix ...
$ git commit -a -m 'fixed bug #666'
$ git push master
$ git checkout dev #since we created the branch with -b the first time, we're good now.
$ git merge master # update our dev branch with the changes in master
# ... work on new features ...
# all done and commited and tested
$ git checkout master
$ git merge dev && git branch -d dev # delete the dev branch
$ git push && profit

Или просто использовать git stash:

# ... work on new feature ...
# oh noes, production caught a killer virus from aliens
$ git stash
# ... fix and commit and push ...
$ git stash apply # reapply your stashed code
# resume hacking on your new feature.

Я лично предпочитаю метод ветвей, так как он чище.

Как бы вы сделали это в Git?

Я никогда не использую поведение по умолчаниюgit pushMsgstr " push.default к "nothing". Тогда есть 2 способа нажать:

  1. Задавать remote.<name>.push, Для моего github-материала у меня обычно это есть .git/config:

    [remote "origin"]
    ...
     push = refs/heads/export/*:refs/heads/*
    

Поэтому, если я решу, что какой-то коммит готов к отправке, я добавлю туда ветку "export/<feature>"Пока я не сделаю это, коммит не будет продвинут"git push".

  1. или просто всегда явно указывайте, в какую ветку вы переходите в командной строке. Как это:

    $git push origin 3f42873:refs/heads/12345_foo
    

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

Синтаксис refspec описан здесь: https://www.kernel.org/pub/software/scm/git/docs/git-push.html

Другие вопросы по тегам