Як назавжди видалити декілька комітетів із віддаленої гілки


489

Я знаю, що це переписування історії, яка погана Яда Яда.

Але як назавжди видалити декілька комітетів із віддаленої гілки?


96
Так, це дійсно погано, але чомусь мені це потрібно вподобати.
Джеймс Морріс

44
Я знаю, що це дурно, але іноді трапляється лайно - як тестування логінів та використання простих текстових паролів у вашому коді, які є справжніми обліковими записами для входу. І ось ...
frhd

6
реальні дані для входу .. Так, це нагадує мені якусь голову
Hello Universe,

1
Можливий дублікат видалення
комітетів

2
Мені так набридла ця академічна спіра про те, наскільки це небезпечно і як цього ніколи не слід робити. Бувають випадки, коли набагато краще вилучити речі з історії git та розібратися з конфліктами / зривами інших дияволів. Це дійсно так просто. Люди, які ігнорують це, напевно, ніколи не працювали поза межами аудиторії.
розчавити

Відповіді:


368

Ви 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би.


Дивно. Схоже, я вже пробував це. Разом з деяким релізом - працює як шарм. Дякую.
Арніс Лапса

7
@Arnis: ідеально тоді;) push --forceгості
VonC

Я використовував BFG Repo-Cleaner, щоб позбутися деяких конфіденційних даних, які залишили мені "безіменну" гілку з оригінальним файлом на ній, після перезавантаження останньої розшукуваної комісії та жорсткого підштовхування до походження, все пішло нормально (:
Rodrirokr

Зауважте, що URL-адреса комітету залишається активною (принаймні на деякий час), тому якщо хтось має URL-адресу комітету (ви дали богу, знаєте чому), він зможе отримати доступ до коду.
Мош Феу

1
@MoshFeu Правда: git gcне завжди запускається досить часто на віддаленій стороні. Наприклад, на GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
VonC

248

Просто зауважте, щоб використовувати last_working_commit_id, під час скасування непрацюючого комітету

git reset --hard <last_working_commit_id>

Тож ми не повинні повертатися до того commit_id, чого не хочемо.

Тоді впевнено, ми повинні перейти до віддаленої гілки

git push --force

10
Ідеальна, елегантна, найпростіша відповідь. Я щойно повернувся до останнього зобов’язання щодо удару, що мені було потрібно як на віддаленому, так і на локальному рівні
lauWM

2
Це призвело і до втрати місцевих змін. Я цього не очікував. Але мені, краще, ніж робити свій особистий пароль для роботи репо.
Airwavezx

3
ви можете зберегти свої локальні зміни за допомогою git stash .... зробити деякі речі .... і git stash pop (ваші локальні зміни повернулися)
MonTea

Це дає мені помилку як "віддалену: помилка: заперечення не швидкого перемоги вперед / голови / майстер (ви повинні витягнути перше)"
Saurabhcdt

@Airwavezx це те, що git reset --hardпотрібно робити.
Лука

146

Важливо: Переконайтеся, що ви вказали, які гілки на "git push -f", або ви можете ненавмисно змінити інші гілки! [*]

У цьому підручнику показано три варіанти . У випадку, якщо посилання перерветься, я залишаю тут основні кроки.

  1. Поверніть повну комісію
  2. Видаліть останню фіксацію
  3. Видалити фіксацію зі списку

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

5
Переконайтеся, що ви вказали, які гілки на "git push <remote_repo> <remote_branch> -f", або ви можете ненавмисно змінити інші гілки!
Найджел Шерідан-Сміт

Лише кроки 1 і 2 виконали завдання та відповіли на оригінальне запитання. (Не виконайте крок 3)
Саад Бенбузід

Це варіанти для різних сценаріїв, а не кроки, які потрібно вжити. У моєму випадку інтерактивна база даних (Варіант 3) зробила те, що я шукав.
Стів Блеквелл

Мені довелося зробити крок 3. Чому б вам не запустити цей @Saad? На щастя, моє <<remote>> було просто "походженням", а <remote_branch> "майстром" за замовчуванням
Барт

30

Якщо ви хочете видалити, наприклад, останні 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говорить:

Скидає індекс, але не робоче дерево (тобто змінені файли зберігаються, але не позначаються для фіксації) та повідомляє про те, що не було оновлено.


10

Це може бути занадто мало занадто пізно, але те, що мені допомогло, це класний "ядерний" варіант. В основному за допомогою команди filter-branchви можете видалити файли або змінити щось із великої кількості файлів протягом усієї вашої історії git.

Це найкраще пояснити тут .


9
Не пізно Можливо, стане корисним для мандрівників із подібними проблемами :)
Арніс Лапса

9

Спрощення з відповіді 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

2
Мені працює, дякую. І я хочу назавжди видалити одну комітку (наприклад, містить pwd) з історії віддаленої філії, як це зробити?
Усміхається

1
Працює і для мене, але у мене те саме запитання, що і "Усмішки", я не хочу, щоб хтось бачив мою поступку / реверс в історії .. як я це видалю?
Роберто Родрігес

4

Іноді найпростіший спосіб виправити це питання - зробити нову гілку з того місця, де ви знаєте, що код хороший. Тоді ви можете залишити спокійну історію гілки в спокої, якщо вам доведеться пізніше вибрати інші зобов’язання. Це також гарантує, що ви не втратили жодної історії комісій.

З вашого місцевого відділення обману:

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

Погладьте себе по спині.


дуже легко, і кого це хвилює, якщо у вас гілка з мертвих ніг? скласти нову гілку і зробити з нею!
Ендрю Фокс

Це справді відмінна відповідь. Я радий, що я зробив це замість того, щоб збирати вишні або маніпулювати віддаленою гілкою.
Magnilex

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.