Отступите на пару ревизий в ветке git - PullRequest
4 голосов
/ 31 марта 2010

Я все еще новичок в Git, так что терпите меня. Я начал добавлять функцию в свой проект в моей текущей ветке и зафиксировал ее, а затем обнаружил, что сначала мне нужно добавить более важную функцию. (Если бы я подумал об этом, я бы просто поместил новую функцию в другую ветку, но, увы, задним числом это 20/20.)

Я хочу вернуться к своей предыдущей фиксации, добавить более важную функцию, а затем добавить менее важную функцию, которую я уже зафиксировал. Есть идеи?

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 31 марта 2010

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

git checkout -b newfeature <oldcommit>

Где <oldcommit> - это либо идентификатор фиксации, либо относительная ссылка, например (например) HEAD~3 три коммита до текущей HEAD.

Как только функция будет завершена, вы можете вернуться в исходную ветку и выбрать либо объединить ее, либо перебазировать работу поверх ветви newfeature. Одна из замечательных особенностей git заключается в том, что вам не нужно упорядочивать всю свою работу последовательно, более того, часто имеет смысл не навязывать свою историю одной линейной последовательности коммитов.

4 голосов
/ 31 марта 2010

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

Если вы не нажали эту ветку, у вас есть:

o---x---x---F1a---F1b---F1c <-- current branch

Отметить как ветвь F1

$ git branch F1

o---x---x---F1a---F1b---F1c <-- current branch, F1

Сброс вашей текущей ветви до F1

$ git reset x

o---x---x---F1a---F1b---F1c <-- F1
        ^
        |
       current branch    

Сделать вашу функцию 0 F0 (ту, которая должна была быть сделана до F1)

$ git commit ...

o---x---x---F0a---F0b <-- current branch
        ^
        |
        ---F1a---F1b---F1c <-- F1

Перебазировать ветвь F1 поверх текущей ветки

$ git checkout F1
$ git rebase current
$ git checkout current
$ git merge F1 # fast-formward merge

o---x---x---F0a---F0b---F1a'---F1b'---F1c' <-- current branch, F1

Если вы уже нажали на эту функцию, то нужно вернуться назад (см. Ответ Диего )

0 голосов
/ 31 марта 2010

Если вы только что отправили сообщение в местное отделение, это простая задача

  • перейти в другую ветку: git checkout -b moreimportantfeature. В новой ветке не будет внесенных вами изменений. Таким образом, вы можете добавить новую функцию и нажать на удаленном репо, или сделать git rebase otherbranch, чтобы протолкнуть оба изменения

Если вы нажали на репо:

  • используйте git revert HEAD (или какой-либо вариант HEAD ^ n, если вы хотите получить больше коммитов). Затем нажмите ваши изменения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...