Git - только push up самый последний коммит на github - PullRequest
29 голосов
/ 17 февраля 2010

В моем локальном git-репо у меня есть много коммитов, которые включают в себя «секретные» строки подключения: -)

Мне не нужна эта история на github, когда я ее туда нажимаю.

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

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

Я попытался запустить rebase:

git rebase –i HEAD~3

Это вернуло 3 коммита, а затем я мог удалить коммит.

Однако столкнуться с автоматической вишнёвкой не удалось, и она стала довольно сложной.

Любые мысли с благодарностью ... не страшно, если история может начаться снова, если это станет слишком трудным: -)

Ответы [ 3 ]

57 голосов
/ 17 февраля 2010

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

git branch secret
git reset --hard HEAD~3
git cherry-pick secret

В картинках

    A--B--C--D--E (master)

после git branch secret:

    A--B--C--D--E (master, secret)

после git reset --hard HEAD~3:

    A--B (master)
        \
         C--D--E (secret)

после git cherry-pick secret:

    A--B--E' (master)
        \
         C--D--E (secret)

Наконец, если вы git checkout secret; git rebase master, вы можете получить:

    A--B--E' (master)
           \
            C--D (secret)
3 голосов
/ 08 декабря 2016

Сценарий

Вы клонировали проект и сделали смехотворное количество коммитов для новой функции, и пришло время открыть ее или поделиться ею для обзора. И ты не хочешь, чтобы кто-нибудь видел твой беспорядок в коммите!

Первоначальная ветвь была cloned_branch, ваши грязные коммиты были на dev ветке, и вы хотите опубликовать свою чистую работу в public_branch ветке.

Примите следующие коммиты:

На ветке cloned_branch:

SHA0: реализованы X и Y. (автор: authorA)
SHA1: реализовано Z. (автор: authorA)
SHA2: Внедренный W. (автор: authorA)

Вы создали dev ветку и выдавили несколько коммитов:

SHA3: попытка реализовать функцию Q для работы ..
SHA4: дерьмо, я не работаю
SHA5: перепутал еще больше! (
SHA6: ПОЛУЧИЛ ЭТО РАБОТАЕТ !!!!
SHA7: очистка!

Поместите все эти изменения в один коммит в public_branch:

git checkout SHA2 -b public_branch      # new branch at `authorA`'s last commit
git merge --squash SHA7        # squash commits up to your last one
git commit -m "Implemented Q (author:me)"

Результат:

Ветви cloned_branch и dev остаются прежними, в то время как public_branch ветвь содержит:

SHA0: реализованы X и Y. (автор: authorA)
SHA1: реализовано Z. (автор: authorA)
SHA2: реализовано W. (автор: authorA)
SHA8: реализовано Q. (автор: я)

0 голосов
/ 26 февраля 2018

У меня недостаточно репутации, чтобы комментировать, поэтому я выложу ответ.

Если у вас есть подмодули, подход, аналогичный ответу Пасхалиса, обеспечивает более устойчивую альтернативу (cherry-pick не учитывает подмодули) и сводит к минимуму конфликты (в моем случае ни одного).

Вот мой предпочтительный подход:

git checkout OLDSHA -b temp
git merge --squash master
git commit -m "All my work"

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

Это создает новую ветвь (temp), которая "скрывает" (путем сжатия) всю историю между OLDSHA и самым последним коммитом на master. Сообщение для нового коммита будет «Вся моя работа».

Затем вы можете удалить master и сделать temp новым master (перед этим убедитесь, что master был благополучно перенесен в другой репозиторий или скопирован)

git branch -d master
git branch -m temp master

И нажмите на новый пульт, сохраняя ваш старый пульт нетронутым

git remote rm origin
git remote add origin NEW_URL
git push --set-upstream origin master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...