Как удалить выбранные записи журнала фиксации из репозитория 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


это возможно? если да, то как?



Это довольно новый проект, так что не имеет филиалов на данный момент, следовательно, не сливается, а также.

643   9  

9 ответов:

git-rebase (1) делает именно это.

$ git rebase -i HEAD~5

git awsome-ness [git rebase -- interactive] содержится пример.

  1. не используйте git-rebase на публичных (дистанционного) нарушает.
  2. убедитесь, что ваш рабочий каталог чист (commit или stash вашего текущего изменения).
  3. выполните приведенную выше команду. Он запускает ваш $EDITOR.
  4. заменить pick до C и D by squash. Он объединит 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 rebase

git 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

    Ничего не найдено.