Расширенные сценарии Git - PullRequest
6 голосов
/ 06 ноября 2011

У меня есть несколько сложных сценариев, которые я хотел бы решить, но я не знаю как. Я надеюсь, что вы можете помочь:

  1. A - B - C - D - E. Я хотел бы добавить изменения из commit D в commit B и удалить commit D. Как?
  2. A - B - C. Commit B содержит файл, который не должен был быть зафиксирован. Как убрать его из коммита?
  3. A - B - C - D. Commit C содержит файл, который должен был быть зафиксирован с помощью commit B. Как удалить его из коммита C и добавить в коммит B?

Обратите внимание: все коммиты находятся только в моей рабочей копии и еще не были отправлены.

1 Ответ

8 голосов
/ 06 ноября 2011

Мои ответы довольно часто используют git rebase.Если вы новичок в ребазинге, обязательно прочитайте эту главу о git rebase сначала

  1. git cherry-pick B Как вы сами узнали, вы могли быrebase -i A и поменяйте местами ревизии C / D, сдавив B + D.
  2. git rebase -i B, отметьте B как правку и примените изменения.

    Теперь для действительно удалить объекты из базы данных объектов, вам может понадобиться использовать фильтр-ветвь для всех ветвей, содержащих объект.После этого может потребоваться некоторое время для истечения срока действия reflogs.Если объект чувствителен к безопасности, вы можете захотеть git gc --aggressive --prune=tomorrow.В книге Pro Git есть раздел удаление объектов . С git-filter-branch всегда не забывайте включать --tag-name-filter cat, см. Комментарии

  3. Если все C должно быть в B,просто

    git rebase -i B пометьте C с помощью сквоша, и он будет сдавливать коммиты вместе.

    Если это станет более сложным (требуется только один файл из C,перейдите к пункту B), я бы разделил задание на более мелкие этапы, которые можно решить, как описано выше:

    • разделить коммит C на две части: одну (C.1) иобъединить в коммит B и один (C.2), чтобы сохранить в качестве нового «C».Например, из приведенной выше главы Git Pro:

      Если вы хотите, например, разделить коммит, вы должны указать 'edit' для этого коммита:

      pick   fc62e55 added file_size
      pick   9824bf4 fixed little thing
      edit   21d80a5 added number to log
      pick   76b9da6 added the apply command
      pick   c264051 Revert "added file_size"
      

      И затем, когда вы попадаете в командную строку, вы возвращаете этот коммит и создаете два (или более) новых.Допустим, 21d80a5 изменил два файла, file1 и file2, и вы хотели разделить их на отдельные коммиты.Вы можете сделать это после того, как из-за перебазирования вы перешли в командную строку:

      $ git reset HEAD^
      $ git add file1
      $ git commit 'first part of split commit'
      $ git add file2
      $ git commit 'second part of split commit'
      $ git rebase --continue
      

      И теперь вместо 5 коммитов у вас будет 6.

    • , перебазирование для объединения коммитов B иC.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...