[devel] [git-*] add --patch, stash, rebase --interactive
Michael Shigorin
mike на osdn.org.ua
Сб Янв 2 10:21:40 UTC 2010
On Fri, Jan 01, 2010 at 01:26:15PM +0300, Денис Смирнов wrote:
> >> Переписывание истории -- один из очень ценных инструментов в
> >> git, позволяющий публиковать красивые репозитории а не
> >> нечитаемый кошмар :)
> MS> Напомню также: http://tomayko.com/writings/the-thing-about-git
> MS> (git add --patch, git rebase --interactive, git stash)
> Вот к этим волшебным приемам пока не привык :(
=== git add --patch ===
Например, налепил на скору руку коммитов для фиксации состояния
и читабельного git diff, а потом затарил на всякий, reset --soft
на последний нормальный коммит, делаешь git status и смотришь:
этот файлик целиком git add, а в этом правки, которые растащить
по разным коммитам бы надо, вот его git add --patch и по hunk'ам
принимаешь или оставляешь на потом.
Набил будущий коммит в индекс, git commit и дальше по git diff.
=== git stash ===
Делаешь что-то и либо откладываешь, либо мысль пришла,
либо заметил, что у майнтейнера гит обновился и надо бы
сперва смержиться, а потом продолжать -- но ещё не дописал
"до точки" и коммит делать не хочется, можно забыть потом
переделать.
Запихиваешь (stash) на "полку" всё незакоммиченное, делаешь
мыслю, мержишь апстрим либо что ещё там -- и git stash apply,
который сбегает в заначку и приспособит её поверх текущего
состояния. Только в случае с "откладываешь" перед apply стоит
git stash list, вдруг там больше одного набилось.
=== git rebase --interactive ===
А вот этого зверя раз или два попробовал, но у меня обычно
не бывает надобности в том, что он позволяет -- в т.ч.
редактирование последовательности коммитов, а также их слияние
или разбиение -- перевод куска по ссылке со ссылки выше:
Пусть надо переработать 10 последних патчей, делаем:
$ git rebase -i HEAD~10
что запустит $EDITOR и покажет нечто вроде:
# Rebasing 16d3800..14f3d11 onto 16d3800
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 6270640 Simplify write_tree using strbuf's.
pick 27c528a Further strbuf re-engineering.
pick fd82c9a Eradicate yet-another-buffer implementation in buitin-rerere.c
pick eee488f More strbuf uses in cache-tree.c.
pick 16878b5 Add strbuf_rtrim and strbuf_insert.
pick e9081af Change semantics of interpolate to work like snprintf.
pick 99c3ef5 Rework pretty_print_commit to use strbufs instead of custom buffers.
pick 203db5d Use strbuf_read in builtin-fetch-tool.c.
pick a20d939 Use strbufs to in read_message (imap-send.c), custom buffer--.
pick 14f3d11 Replace all read_fd use with strbuf_read, and get rid of it.
~
~
Здесь можно заменить pick на edit, если хочется поменять
что-нибудь в коммите, или на squash, чтобы объединить его
с тем, который строчкой выше.
Подсказка не говорит явно, но возможно также и изменять
порядок коммитов.
--
---- WBR, Michael Shigorin <mike на altlinux.ru>
------ Linux.Kiev http://www.linux.kiev.ua/
Подробная информация о списке рассылки Devel