Как я могу переупорядочить / объединить коммиты, используя Git ReBase? - PullRequest
6 голосов
/ 17 января 2010

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

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

  • Переместить Верхний коммит ("Удален посторонний ...") до того, как ветвь отключится (Справа выше "исправление для # 226").
  • Объедините два коммита, которые находятся в ветке 'twist / main'. "запятая" и "перемещен загружен ..." должны быть одним и тем же коммитом, и мне вообще не нужно сообщение о коммите "запятая".
  • Объедините вновь объединенный коммит "Переместить загруженный" в ветку "backup" и избавьтесь от "twist".
  • Переместите «master» туда, где сейчас написано «backup».
  • Что означает этот тег "remote / origin / master"?

enter image description here

Я понимаю, что это требует много, но, пожалуйста, включите фактические команды GIT.

Я не против читать и пробовать самостоятельно, но меня немного смущают результаты, не соответствующие моим ожиданиям, и я действительно не хочу случайно уничтожать любые коммиты.

Ответы [ 3 ]

8 голосов
/ 17 января 2010

Сначала переупорядочим коммиты backup.

# 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

Объедините два коммита по повороту, игнорируя верхнее сообщение коммита.

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, удалите ветвь скручивания.

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, или, скорее, был, когда вы последний раз выбирали, помещали или извлекали.

6 голосов
/ 17 января 2010

Как не бояться

Я хотел бы показать вам, что, как бы плохо вы ни испортили, коммиты никогда не разрушались *, и вы всегда можете вернуться туда, откуда начали.

Я создал искусственное дерево, которое имеет ту же форму, что и вы:

Теперь я собираюсь стереть последние три коммита из ветки '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, это заставляли HEAD указывать на этот старый коммит. Но никакие коммиты на самом деле не были потеряны - они просто стали сиротами, а не частью какой-либо ветви. Давайте снова сделаем их частью «резервной» ветки:

$ 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

Сделать мастер-точку для того же коммита, что и для «резервного копирования»

$git checkout master
$git reset --hard backup

Избавиться от твист ветки

$git branch -D twist
0 голосов
/ 17 января 2010

Есть ряд вещей, которые вы пытаетесь достичь здесь, и из диаграмм немного неясно, при условии, что именно нужно, но могут помочь следующие указатели:

  • Вместо того, чтобы пытаться переместить вашу ветку, я бы сначала объединил коммиты, которые вы сделали в этой ветке, а затем применил окончательный коммит к основной ветке, так как в конечном итоге это то, к чему вы стремитесь. Возможно, вам придется разрешить некоторые конфликты на этом этапе, но вам все равно придется это сделать. Смотрите следующие два совета для получения информации о том, как этого добиться.

  • Чтобы объединить два коммита, вы можете сделать интерактивную перебазировку .

  • Чтобы выбрать один коммит из одной ветви и применить его к другой, в то время как в целевой ветви используйте git cherry-pick. Вы можете удалить старую ветку, используя git branch -D twist, когда закончите.

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

...