Как изменить порядок / объединить коммиты с помощью git rebase?
после нескольких часов игры с rebase РЕПО все еще выглядит иначе, чем мне нужно:
Я хотел бы решить следующие задачи:
[некоторые из которых были в порядке, прежде чем я начал возиться с rebase : (]
- переместить верхний фиксатор ("удалено постороннее...") до того, как ветка выключена (прямо над "исправить для #226").
- объедините два коммита, которые находятся в ветви "twist/main". "запятая" и " переехал загружен..."должны быть одинаковыми фиксация, и мне вообще не нужно сообщение фиксации "запятая".
- объедините недавно объединенную фиксацию" перемещение загружено "в ветку" резервное копирование "и избавьтесь от "твиста".
- переместить "master" туда, где теперь говорится "backup".
- что означает этот тег" remote/origins/master"?
Я понимаю, что это требует много, но, пожалуйста, включите фактические команды GIT.
Я не против читать и пробовать самостоятельно, но я немного смущен результатами, не соответствующими тому, что я ожидал, и я действительно не хочу случайно уничтожать любые коммиты.
3 ответов
во-первых, переупорядочить backup
commits.
# Safety, should be a no-op if your gitk snapshot is accurate
git checkout backup
# Temporary branch
git branch backup-save backup
# Move top commit onto 'Fix for #226:
git rebase --onto origin/master HEAD^
# Go back to saved branch's parent (i.e. without the moved commit)
git reset --hard backup-save^
# Rebase onto the moved commit (HEAD@{1} is where HEAD was 1 step
# ago i.e. before the reset.)
git rebase HEAD@{1}
# Don't need the saved branch any more (although you might want
# to keep it for a bit just in case). This deletes it:
git branch -D backup-save
объедините два коммита на twist, игнорируя сообщение Top commit.
git checkout twist
git reset --soft HEAD^
# Just re-save the commit message, alternatively to skip the
# editor step do this: git commit --amend -C HEAD
git commit --amend
слияние twist
филиала в backup
, снимите ветку twist.
git checkout backup
git merge twist
git branch -d twist
движение master
. Есть несколько причудливых способов, но это самый простой. Я предполагаю, что вы хотите master
к точке редактируемого backup
положение, а не там, где оно изначально было.
git checkout master
git reset --hard backup
remote/origins/master
- это удаленная ветвь отслеживания и сообщает вам, где указатель ветви для master
ветка в удаленном репозитории origin
есть или, скорее, был, когда вы в последний раз принесли, толкнули или потянули.
как не бояться
я хотел бы показать вам, что независимо от того, насколько плохо вы испортите, коммиты никогда не будут уничтожены*, и вы всегда можете вернуться к тому, с чего начали.
я сделал искусственное дерево git, которое имеет ту же форму, что и вы проиллюстрировали:
теперь я собираюсь стереть последние три коммита из ветви "backup":
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
$ git reset --hard HEAD~3
HEAD is now at 07e71d9 Merged "getDepsForScript" function
$ git log --oneline
07e71d9 Merged "getDepsForScript" function
...
Упс, это было плохо. Давайте вернемся к тому, с чего начали. Сначала посмотрим, что мы сделал:
$git reflog
07e71d9 HEAD@{0}: HEAD~3: updating HEAD
9b41f46 HEAD@{1}: commit: Removed extraneous whitespace
...
вы можете видеть,что когда мы сбрасываем, все, что сделал git, - это указать на эту старую фиксацию. Но никакие обязательства не были фактически потеряны-они просто стали сиротами, а не частью какой-либо ветви. Давайте снова сделаем их частью ветви "backup":
$ git reset --hard 9b41f46
HEAD is now at 9b41f46 Removed extraneous whitespace
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
Git означает никогда не говорить, что вам жаль.
*свободные объекты в конечном итоге собирают мусор, но не до тех пор, пока им не исполнится по крайней мере две недели.
как сделать то, что вы Хотеть.
сначала давайте объединим два коммита в master:
$ git checkout master
$ git rebase -i HEAD~2
Git запустит ваш редактор. Измените это:
pick 6389f4e Moved "loaded" function out of "require".
pick 41fb646 comma
для этого:
pick 6389f4e Moved "loaded" function out of "require".
s 41fb646 comma
и сохранить. Git снова запустит ваш редактор. Измените это:
# This is a combination of two commits.
# The first commit's message is:
Moved "loaded" function out of "require".
# This is the 2nd commit message:
comma
для этого:
Moved "loaded" function out of "require".
и сохранить.
теперь давайте переупорядочим коммиты в "backup":
$ git checkout backup
$ git rebase -i remotes/origin/master
когда ваш редактор всплывает, изменить это:
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
pick 9b41f46 Removed extraneous whitespace <-----
для этого:
pick 9b41f46 Removed extraneous whitespace <-----
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
и сохранить.
теперь вишневый-выберите объединенную" перемещенную загруженную " фиксацию мастера и на текущую ветку ("резервную копию")
$git cherry-pick master
Make master указывает на ту же фиксацию, что и "backup"
$git checkout master
$git reset --hard backup
избавиться от твист ветви
$git branch -D twist
есть ряд вещей, которые вы пытаетесь достичь здесь, и это немного неясно из диаграмм при условии, что именно то, что необходимо, но следующие указатели могут помочь:
вместо того, чтобы пытаться переместить вашу ветку, я бы сначала объединил коммиты, которые вы сделали на этой ветке, а затем применил окончательный коммит к главной ветви, так как это в конечном итоге то, к чему вы стремитесь. Возможно, вам придется разрешить некоторые конфликты на этом этапе, но вам придется это сделать в любом случае. См. следующие два совета для получения информации о том, как этого достичь.
для объединения двух коммитов вы можете сделатьинтерактивные перебазирования.
чтобы выбрать одну фиксацию из одной ветви и применить ее к другой, в то время как в целевой ветви используйте
git cherry-pick
. Вы можете удалить старую ветку, используяgit branch -D twist
когда сделано.
надеюсь, что эти советы помогут вам на пути к вашей цели.