Как удалить выбранные записи журнала фиксации из репозитория Git, сохраняя их изменения?
Я хотел бы удалить выбранные записи журнала фиксации из линейного дерева фиксации, чтобы записи не отображались в журнале фиксации.
мое дерево фиксации выглядит примерно так:
R--A--B--C--D--E--HEAD
Я хотел бы удалить записи B и C, чтобы они не отображались в журнале фиксации, но изменения от A до D должны быть сохранены. Может быть, введя одну фиксацию, чтобы B и C стали BC, и дерево выглядит так.
R--A--BC--D--E--HEAD
или, в идеале, после A приходит D непосредственно. D ' представляет изменения от A до B, B до C и C до D.
R--A--D'--E--HEAD
это возможно? если да, то как?
Это довольно новый проект, так что не имеет филиалов на данный момент, следовательно, не сливается, а также.
9 ответов:
git-rebase (1) делает именно это.
$ git rebase -i HEAD~5git awsome-ness [git rebase -- interactive] содержится пример.
- не используйте
git-rebaseна публичных (дистанционного) нарушает.- убедитесь, что ваш рабочий каталог чист (
commitилиstashвашего текущего изменения).- выполните приведенную выше команду. Он запускает ваш
$EDITOR.- заменить
pickдоCиDbysquash. Он объединит C и D в B. Если вы хотите удалить фиксацию, просто удалите ее строку.если вы потеряли, типа:
$ git rebase --abort
# detach head and move to D commit git checkout <SHA1-for-D> # move HEAD to A, but leave the index and working tree as for D git reset --soft <SHA1-for-A> # Redo the D commit re-using the commit message, but now on top of A git commit -C <SHA1-for-D> # Re-apply everything from the old D onwards onto this new place git rebase --onto HEAD <SHA1-for-D> master
вот способ удалить определенный идентификатор фиксации, зная только идентификатор фиксации, который вы хотите удалить.
git rebase --onto commit-id^ commit-idобратите внимание, что это фактически удаляет изменения, внесенные фиксацией.
чтобы расширить ответ Дж. Ф. Себастьяна:
вы можете использовать git-rebase, чтобы легко вносить все виды изменений в историю фиксации.
после запуска git rebase -- interactive вы получаете следующее в своем $ EDITOR:
pick 366eca1 This has a huge file pick d975b30 delete foo pick 121802a delete bar # Rebase 57d0b28..121802a onto 57d0b28 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commitвы можете перемещать строки, чтобы изменить порядок фиксации и удалять строки, чтобы удалить эту фиксацию. Или вы можете добавить команду для объединения (сквоша) двух коммитов в один коммит (предыдущий коммит-это выше коммит), редактировать коммиты (что было изменено), или перефразировать сообщения фиксации.
Я думаю, что pick просто означает, что вы хотите оставить эту фиксацию в покое.
(пример:здесь)
вы можете не интерактивно удалить B и C в вашем примере с:
git rebase --onto HEAD~5 HEAD~3 HEADили символически,
git rebase --onto A C HEADобратите внимание, что изменения в B и C будут не быть в D; они будут ушел.
Я считаю, что этот процесс намного безопаснее и легче понять, создав другую ветвь из SHA1 A и выбрав нужные изменения, чтобы я мог убедиться, что доволен тем, как выглядит эта новая ветвь. После этого легко удалить старую ветку и переименовать новую.
git checkout <SHA1 of A> git log #verify looks good git checkout -b rework git cherry-pick <SHA1 of D> .... git log #verify looks good git branch -D <oldbranch> git branch -m rework <oldbranch>
еще один способ,
git rebase -i ad0389efc1a79b1f9c4dd6061dca6edc1d5bb78a (C's hash) and git push origin master -fвыберите хэш, который вы хотите использовать в качестве базы, и приведенная выше команда должна сделать его интерактивным, чтобы вы могли раздавить все top сообщения ( нужно оставить самые старые)
просто собрал ответы всех людей: (M new to git plz используйте его только для справки)
git rebase для удаления любых коммитов
git log
-first check from which commit you want to rebasegit rebase-i HEAD~1
-Here i want to rebase on the second last commit- commit count starts from '1') -this will open the command line editor (called vim editor i guess)затем экран будет выглядеть примерно так:
pick 0c2236d добавлена новая строка.
Rebase 2a1cd65..0c2236d на 2a1cd65 (1 команда)
#
команды:
p, pick = использовать commit
r, reword = использовать фиксацию, но редактировать сообщение фиксации
e, edit = использовать commit, но остановить для внесения поправок
s, squash = использовать commit, но объединиться в предыдущий commit
f, fixup = как "сквош", но отбросить это сообщение журнала фиксации
x, exec = выполнить команду (остальная часть строки) с помощью shell
d, drop = удалить commit
#
эти строки могут быть переупорядочены; они выполняются сверху вниз.
#
если вы удалите строку здесь, что фиксация будет потеряна.
#
однако, если вы удалите все, перебазирование будет прервана.
#
обратите внимание, что пустые коммиты закомментированы ~ ~
~
~
~
~
~
~
~
~
~здесь измените первую строку в соответствии с вашими потребностями (используя команды, перечисленные выше, т. е. "drop" для удаления фиксации и т. д.) После завершения редактирования нажмите": x", чтобы сохранить и выйти из редактора (это только для редактора vim)
а то
git push
если его показывает проблема, то вам нужно принудительно нажмите изменения на remote (это очень важно : не заставляйте нажимать, если вы работаете в команде)
git push-F origin
вы можете использовать git cherry-pick для этого. "cherry-pick" применит фиксацию на ветке, которую вы сейчас используете.
затем сделать
git rebase --hard <SHA1 of A>затем примените фиксации D и E.
git cherry-pick <SHA1 of D> git cherry-pick <SHA1 of E>это пропуск в " и " с фиксацией. Сказав, что может быть невозможно применить фиксацию D к ветви без B, поэтому YMMV.
Comments