Git/recommit: различия между версиями

Материал из ALT Linux Wiki
< Git
(Import from freesource.info)
 
 
(не показано 7 промежуточных версий 5 участников)
Строка 1: Строка 1:
[[Category:Devel]]
{{DISPLAYTITLE:git/recommit}}
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/git/recommit}}


== Как поправить commit ==
== Правка последнего коммита ==


Для ''последнего'' коммита достаточно <tt>git commit --amend</tt>, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения "заодно".
Для правки ''последнего'' коммита достаточно <tt>git commit --amend</tt>, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения «заодно».


''ниже -- фрагмент письма Alexey Tourbin в [http://lists.altlinux.org/pipermail/devel/2006-December/039344.html devel@]''
== Правка коммитов в общем случае ==
[...]
В общем случае для редактирования коммитов удобно применять <code>git rebase --interactive</code>. Это выглядит примерно так:
$ git rebase -i коммит^
[ Нам показывают в редакторе список коммитов. Перед тем, который хотим исправить, меняем pick на edit. Сохраняем и выходим. ]
You can amend the commit now, with
        git commit --amend
Once you are satisfied with your changes, run
        git rebase --continue
[ Теперь текущим стал тот коммит, который мы хотим исправить. ]
$ vim нужный/файл  # исправляем всё, что хотим
$ git commit --am нужный/файл
$ git rebase --continue


То есть по сути иногда не хочется делать новые коммиты, которые
То же самое можно сделать и вручную.
являются мелкими исправлениями к предыдущим коммитам.  Поэтому я
предлагаю такое правило для использования git push --force: нельзя
заменять коммиты дальше последнего публичного тага, или же дальше
коммита, отправленного на сборку в incominger.


Допустим, что эти условия выполнены, а исправления мелких/глупых ошибок
== Правка коммитов вручную, без git-rebase<ref>Основано на письме Alexey Tourbin в [http://lists.altlinux.org/pipermail/devel/2006-December/039344.html devel@]</ref> ==
не хочется оформлять отдельно. Для примера объясню, как поправить
 
пред-предпоследний коммит.
Иногда не хочется делать новые коммиты, которые являются мелкими исправлениями к предыдущим коммитам.  Поэтому я предлагаю такое правило для использования git push --force: нельзя заменять коммиты дальше последнего публичного тага, или же дальше коммита, отправленного на сборку (без специальных усилий изменение такого коммита приведёт к тому, что следующая сборка будет отвергнута).
 
Допустим, что эти условия выполнены, а исправления мелких/глупых ошибок не хочется оформлять отдельно. Для примера объясню, как поправить пред-предпоследний коммит.


Сначала нужно сохранить текущую работу во временный бранч:
Сначала нужно сохранить текущую работу во временный бранч:
Строка 34: Строка 45:
После этого уже можно сделать
После этого уже можно сделать
<pre>$ git push --force git.alt</pre>
<pre>$ git push --force git.alt</pre>
(Последнее означает, что содержимое <tt>.git/remotes/git.alt</tt> может выглядеть
 
как <tt>URL: git.alt:/people/$USER/packages/%name.git</tt>)
== Ссылки ==
 
<references/>
 
{{Category navigation|title=git|category=git|sortkey={{SUBPAGENAME}}}}

Текущая версия от 02:01, 13 марта 2010


Правка последнего коммита

Для правки последнего коммита достаточно git commit --amend, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения «заодно».

Правка коммитов в общем случае

В общем случае для редактирования коммитов удобно применять git rebase --interactive. Это выглядит примерно так:

$ git rebase -i коммит^
[ Нам показывают в редакторе список коммитов. Перед тем, который хотим исправить, меняем pick на edit. Сохраняем и выходим. ]
You can amend the commit now, with

       git commit --amend

Once you are satisfied with your changes, run

       git rebase --continue

[ Теперь текущим стал тот коммит, который мы хотим исправить. ]
$ vim нужный/файл  # исправляем всё, что хотим
$ git commit --am нужный/файл
$ git rebase --continue

То же самое можно сделать и вручную.

Правка коммитов вручную, без git-rebase[1]

Иногда не хочется делать новые коммиты, которые являются мелкими исправлениями к предыдущим коммитам. Поэтому я предлагаю такое правило для использования git push --force: нельзя заменять коммиты дальше последнего публичного тага, или же дальше коммита, отправленного на сборку (без специальных усилий изменение такого коммита приведёт к тому, что следующая сборка будет отвергнута).

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

Сначала нужно сохранить текущую работу во временный бранч:

$ git branch save

Потом нужно откатить работу до пред-предпоследнего коммита:

$ git reset --hard HEAD^^

Теперь нужно поправить пред-предпоследний коммит, который стал текущим:

$ vim ...
$ git commit -a --am

Затем поверх пред-предпоследнего коммита нужно накатить предпоследний и последний коммиты из сохраненного бранча:

$ git cherry-pick -r save^
$ git cherry-pick -r save

Осталось только удалить временный бранч:

$ git branch -D save

После этого уже можно сделать

$ git push --force git.alt

Ссылки

  1. Основано на письме Alexey Tourbin в devel@