Как изменить порядок / объединить коммиты с помощью git rebase?

после нескольких часов игры с rebase РЕПО все еще выглядит иначе, чем мне нужно:

Я хотел бы решить следующие задачи:
[некоторые из которых были в порядке, прежде чем я начал возиться с rebase : (]

  • переместить верхний фиксатор ("удалено постороннее...") до того, как ветка выключена (прямо над "исправить для #226").
  • объедините два коммита, которые находятся в ветви "twist/main".   "запятая" и " переехал загружен..."должны быть одинаковыми фиксация, и мне вообще не нужно сообщение фиксации "запятая".
  • объедините недавно объединенную фиксацию" перемещение загружено "в ветку" резервное копирование "и избавьтесь от "твиста".
  • переместить "master" туда, где теперь говорится "backup".
  • что означает этот тег" remote/origins/master"?

enter image description here

Я понимаю, что это требует много, но, пожалуйста, включите фактические команды 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 когда сделано.

надеюсь, что эти советы помогут вам на пути к вашей цели.