Как перезаписать старый коммит коммитом другой ветки? - PullRequest
0 голосов
/ 05 мая 2019

У меня есть три коммита на master branch:

master- 3st commit

master- 2st commit

master- 1st commit

Теперь мне нужно внести некоторые изменения в master- 2st commit. Поэтому я извлекаю новую ветку с именем dev из master- 2st commit.

После внесения некоторых изменений в ветку dev я выполняю коммит dev- 1st commit.

Я хочу перезаписать master- 2st commit с помощью dev- 1st commit. Любой совет по этому поводу? Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 05 мая 2019

ВНИМАНИЕ: переписывание истории git всемогуще, пока не было сделано git push.После этого вы все равно можете делать все, что хотите, но это требует силового толчка, которого следует избегать.

Лучший способ - использовать cherry-pick в следующем процессе:

git checkout master~2
git cherry-pick master~1
[make your edits]
git add --all
git commit --amend
git cherry-pick master
git checkout master
git reset --hard HEAD@{1}

Пояснения:

  1. Поместите HEAD в коммит, расположенный за 2 коммита до master.
  2. Сделайте копию коммита, расположенного за 1 коммит до master, и добавьте егопосле HEAD.
  3. Изменения, которые вы собираетесь сделать, будут сделаны с точки зрения "2nd commit".
  4. Добавьте ваши изменения для фиксации.
  5. Commitих, но вместо создания нового коммита вы редактируете предыдущий.
  6. Скопируйте коммит master после местоположения HEAD.
  7. Извлеките старое местоположение master.
  8. Измените местоположение ветви на предыдущее местоположение HEAD (то есть, где вы были до последней проверки: ваш новый коммит "3-го коммита").

Интерактивная демонстрация (которая не знает о git reset --hard HEAD@{1}, поэтому использует временные переходыTEAD).

0 голосов
/ 06 мая 2019

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

Записать идентификатор фиксации master- 3rd commit с помощью git log -1 --oneline на мастере.

Шаги:

git Checkout master
git reset --hard HEAD~2
git cherry-pick <dev- 1st commit>
git cherry-pick <master- 3rd commit>

Пояснение:

Предполагая, что на мастере 3 коммита, git reset --hard HEAD~2 отсоединит два верхних коммита [3-го и 2-го] от 1-го коммита, мастер ветки теперь указывает на 1-й коммит.

git cherry-pick <dev- 1st commit> добавит новый коммит, такой же, как dev-1st commit для master, ветвь master теперь указывает на новый dev dev.

git cherry-pick <master- 3rd commit> снова добавит новый коммит поверх dev dev, и теперь история будет выглядеть как -

master- new 3rd commit
dev - new 1st commit
master- old 1st commit
0 голосов
/ 05 мая 2019

Если вы не хотите добавлять новые коммиты в master, вам нужно переписать master- 2nd commit и master-3rd commit.

git checkout master

# rewrite <master- 2nd commit>
git reset <dev- 1st commit> --hard
git reset <master- 2nd commit> --soft
git commit --amend

# rewrite <master- 3rd commit>
git cherry-pick <master- 3rd commit>

История будет выглядеть так:

master- new 3rd commit
master- new 2nd commit
master- 1st commit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...