Git-скрипт для перебазирования и сквоша временных коммитов

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

Есть ли способ сделать это автоматически? Моя цель - раздавить все предыдущие коммиты, которые еще не были отправлены в конкретную удаленную ветку.

Чтобы уточнить, скажем, у меня есть 1 локальная ветвь под названием «dev» и 2 удаленных, общедоступных и частных. Я фиксирую и отправляю все, что хочу, на частный пульт, в ветку с именем «dev», назовем ее private/dev. Но на общедоступном пульте я хочу, чтобы все было чисто и аккуратно, и чтобы была одна стандартная ветка с именем «мастер», назовем ее public/master. Итак, как я уже сказал, для всех коммитов, которые еще не попали в публичную удаленную ветку master, я хочу сжать их в один большой коммит, а push to public/master

Как я могу этого добиться? Кажется сложным.


person Alexander Mills    schedule 22.10.2016    source источник
comment
Ознакомьтесь с robots.thoughtbot.com/autosquashing-git-commits.   -  person Yawar    schedule 22.10.2016


Ответы (1)


Вы просто создаете временную ветку через public/master (где public — это имя вашего общедоступного пульта, а master — например — ветка назначения)

И вы используете merge --squash (см. " В git, в чем разница между merge --squash и rebase?")

 git checkout -b temp public/master
 git merge  --squash dev
 # since merge --squash does not produce a commit:
 git commit -m "squash dev"
 git push public temp:master
 git checkout dev
 git branch -d temp

О синтаксисе двоеточия см. "ветвь git push в новое репо с другим именем" и примеры раздела git push.
Он позволяет передавать локальную ветку в удаленную с помощью другое имя.

person VonC    schedule 22.10.2016
comment
Я надеюсь, что это работает. не могли бы вы уточнить, что именно происходит на каждом шаге/команде? не уверен, что я действительно следую - person Alexander Mills; 23.10.2016
comment
например, можете ли вы дать результату слияния сообщение фиксации, которое будет использоваться при просмотре последней версии public/master? - person Alexander Mills; 23.10.2016
comment
также что такое git push public tmp: master - что означает синтаксис двоеточия? - person Alexander Mills; 23.10.2016
comment
Я обновил свой вопрос полезными деталями, я отредактирую ваш ответ, чтобы отразить детали, поправьте меня, если я ошибаюсь, спасибо. - person Alexander Mills; 23.10.2016
comment
Я получил это: $ git merge --squash -m сжат с помощью dev dev => Squash commit -- без обновления HEAD Автоматическое слияние прошло успешно; остановлен перед фиксацией в соответствии с запросом, не уверен, что это значит - person Alexander Mills; 23.10.2016
comment
Я не просил не фиксировать, но я думаю, что это дает вам возможность впоследствии совершить фиксацию и предоставить сообщение - person Alexander Mills; 23.10.2016
comment
@AlexanderMills Верно! git merge --squash не производит фиксацию. Вам нужен дополнительный git commit -m. Отредактировано. - person VonC; 23.10.2016
comment
но знаете ли вы, что это означает: сквош-коммит -- не обновляя HEAD -- кажется, он не обновляет индекс (по какой-то причине не захватывает файлы из ветки dev). Несмотря на то, что он говорит, что автоматическое слияние прошло успешно. - person Alexander Mills; 23.10.2016
comment
@AlexanderMills Это означает, что он записывает слияние в индексе, но не фиксирует. файлы от dev должны быть там. - person VonC; 23.10.2016
comment
да, я не уверен, у меня это работает, но немного по-другому, большое спасибо за вашу помощь! - person Alexander Mills; 23.10.2016
comment
@AlexanderMills Отлично: что вы использовали? - person VonC; 23.10.2016
comment
Мне пришлось использовать 3-ю ветку, чтобы избежать конфликтов слияния, потому что public/master удалил файлы, которые я удаляю из public, public/master нельзя объединить напрямую с dev, я должен использовать 3-ю ветку, называемую devtemp, где я удаляю те же файлы, которые я удалил в мастере. - person Alexander Mills; 23.10.2016