Я знаю, що це переписування історії, яка погана Яда Яда.
Але як назавжди видалити декілька комітетів із віддаленої гілки?
Я знаю, що це переписування історії, яка погана Яда Яда.
Але як назавжди видалити декілька комітетів із віддаленої гілки?
Відповіді:
Ви git reset --hard
ваша локальна філія, щоб видалити зміни з робочого дерева та індексу, а ви git push --force
переглянули локальну гілку на віддалену. ( інше рішення тут , включаючи видалення віддаленої гілки та повторне натискання на неї)
Ця відповідь ТА свідчить про небезпеку такої команди, особливо якщо люди залежать від віддаленої історії для власних місцевих репостів.
Потрібно бути готовим вказати людей на розділ ВІДНОСНЕННЯ З ВИПУСКУВАННЯ ВІДГОТОВКИgit rebase
сторінки чоловічої сторінки
З Git 2.23 (серпень 2019, дев'ять років пізніше) ви б використали нову команду git switch
.
Тобто:
(замінити на кількість комісій для видалення)git switch -C mybranch origin/mybranch~n
n
Це відновить індекс і робоче дерево, як git reset --hard
би.
push --force
гості
git gc
не завжди запускається досить часто на віддаленій стороні. Наприклад, на GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
Просто зауважте, щоб використовувати last_working_commit_id
, під час скасування непрацюючого комітету
git reset --hard <last_working_commit_id>
Тож ми не повинні повертатися до того commit_id
, чого не хочемо.
Тоді впевнено, ми повинні перейти до віддаленої гілки
git push --force
git reset --hard
потрібно робити.
У цьому підручнику показано три варіанти . У випадку, якщо посилання перерветься, я залишаю тут основні кроки.
1 Поверніть повну комісію
git revert dd61ab23
2 Видаліть останню фіксацію
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
або, якщо філія доступна локально
git reset HEAD^ --hard
git push <<remote>> -f
де + dd61 ... - ваш хеш і git фіксації інтерпретує x ^ як батьківський x, а + як вимушений нешвидкісний натискання.
3 Видаліть фіксацію зі списку
git rebase -i dd61ab23^
Це відкриє і редактор покаже список усіх комітетів. Видаліть той, який ви хочете позбутися. Закінчіть базу даних і натисніть на репост.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Якщо ви хочете видалити, наприклад, останні 3
зобов’язання, виконайте наступну команду, щоб видалити зміни з файлової системи (робочого дерева) та введіть історію (індекс) у вашу локальну гілку:
git reset --hard HEAD~3
Потім запустіть таку команду (на локальній машині), щоб змусити віддалену гілку переписати свою історію:
git push --force
Вітаємо! Все зроблено!
Деякі примітки:
Ви можете отримати потрібний ідентифікатор фіксації, запустивши
git log
Після цього ви можете замінити HEAD~N
з <desired-commit-id>
наступним чином:
git reset --hard <desired-commit-id>
Якщо ви хочете зберегти зміни у файловій системі та просто змінити індекс (історію фіксації), використовуйте --soft
прапор типу git reset --soft HEAD~3
. Тоді ви маєте шанс перевірити свої останні зміни та зберегти або відкинути всі або частини їх. В останньому випадку runnig git status
показує, що файли змінені з тих пір <desired-commit-id>
. Якщо ви скористаєтеся --hard
опцією, git status
вам скажуть, що ваша локальна філія точно така ж, як і віддалена. Якщо ви не використовуєте --hard
ні --soft
, використовується режим за замовчуванням, який є --mixed
. У цьому режимі git help reset
говорить:
Скидає індекс, але не робоче дерево (тобто змінені файли зберігаються, але не позначаються для фіксації) та повідомляє про те, що не було оновлено.
Це може бути занадто мало занадто пізно, але те, що мені допомогло, це класний "ядерний" варіант. В основному за допомогою команди filter-branch
ви можете видалити файли або змінити щось із великої кількості файлів протягом усієї вашої історії git.
Це найкраще пояснити тут .
Спрощення з відповіді pctroll, аналогічно на цій публікації в блозі .
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
Іноді найпростіший спосіб виправити це питання - зробити нову гілку з того місця, де ви знаєте, що код хороший. Тоді ви можете залишити спокійну історію гілки в спокої, якщо вам доведеться пізніше вибрати інші зобов’язання. Це також гарантує, що ви не втратили жодної історії комісій.
З вашого місцевого відділення обману:
git log
скопіюйте хеш фіксації, для якого ви хотіли, щоб гілка була та виходила з журналу git
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Тепер у вас є нова філія саме так, як вам хочеться.
Якщо вам також потрібно було зберегти певний комітет від заблудної гілки, яка не є у вашій новій гілці, ви можете просто вибрати вишневе певне зобов’язання:
git checkout the_errant_branch
git log
Скопіюйте хеш комітів одного комітету, який потрібно витягнути у добру гілку та вийти з журналу git.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Погладьте себе по спині.