Как получить локально зафиксированные изменения, которые будут повторно применены в качестве фиксации слияния из ветви?

#git #git-branch #git-commit

Вопрос:

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

На данный момент зафиксировано 22 коммита, и, за исключением первых двух, я бы хотел, чтобы все коммиты >=3-е и далее были «перемещены» в новую ветвь, а затем объединены обратно в master, чтобы в журнале вместо этого отображалась «фиксация слияния».

Я попробовал это, но, похоже, не сработало:

На мастере:

 $ git branch new_branch    
$ git reset HEAD~20 
$ git add . amp;amp; git stash
$ git merge --squash new_branch
$ git commit
   
 

Это приводит к тому, что я получаю раздавленный коммит слияния, и теперь я вижу только 3 коммита на своем мастере. Однако, если я это сделаю git log --merges , это ничего не даст.

Как я могу создать «реальную фиксацию слияния» для кода, new_branch который обнаруживается git log --merges и перечислял бы все фиксации, если бы я запустил: git rev-list <merge-commit-id>^..<merge-commit-id> ?

Ответ №1:

Предполагая, что вы вернулись к тому, с чего началась ваша проблема, вы могли бы сделать это следующим образом:

 git checkout id-of-second-revision
git merge --no-ff master -m "use a proper comment"
git branch -f master # place master on this revision
git checkout master
 

И вы закончили.

Комментарии:

1. С того места, где был мастер, когда ты начинал, а не после неудачной магии, которую ты пробовал. 🙂 Если у вас следующий вопрос how? , проверьте git reflog . Получите идентификатор исходной версии подсказки мастера оттуда и используйте эту версию вместо master git merge --no-ff шага…. не нужно никуда идти, вы можете запустить рецепт независимо от того, где вы находитесь.

Ответ №2:

git merge --no-ff new_branch вместо git merge --squash new_branch