Видаліть останню комісію в бітбукеті


103

Я допустив помилку, і не знаю, як видалити останнє повідомлення в сховищі. Я перетягую останні оновлення програми, але в ньому є конфлікти, і я пересилаю його до сховища.

Як видалити моє останнє зобов’язання? Або як це виправити?

Відповіді:


102

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

Сказав, що те, що ти можеш зробити, це повернути комісію. Ця процедура виконується по-різному (різні команди), залежно від CVS, який ви використовуєте:

На git :

git revert <commit>

Про похожі :

hg backout <REV>

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


Спасибі за інформацію. І я знаю наслідок, якщо я видалюю команду, я просто не знаю, як скасувати свою дію, оскільки вперше я помилився. Мені потрібно скасувати зобов’язання, оскільки система вже працює. Ми лише двоє, які працюють з цим сховищем.
Катерина

git backout <REV>? Або hg backout <REV>:?
Армандо Перес Маркеш

Але що робити, якщо комісії, додані після того, як повернутий, внесли зміни у видалений рядок?
rahs

@RahulSaha, оскільки те, що ви робите, в основному намагається об'єднати комісію у відділення, я впевнений, що це дасть вам конфлікт злиття, який вам доведеться вирішити.
asermax

98

Якщо ви не працюєте з іншими (або раді викликати у них значну роздратування) , можна видалити коміти з гілок бітбукета.

Якщо ви намагаєтеся змінити гілку, яка не є головним:

git reset HEAD^               # remove the last commit from the branch history
git push origin :branch_name  # delete the branch from bitbucket
git push origin branch_name   # push the branch back up again, without the last commit

якщо ви намагаєтеся змінити головну гілку

В git взагалі, головна галузь не особлива - це просто умовність. Однак бітбукет і github і подібні сайти зазвичай вимагають, щоб там була основна гілка (імовірно, тому, що це простіше, ніж писати більше коду для обробки події, коли у сховищі немає гілок - не впевнений). Отже, вам потрібно створити нову гілку та зробити її основною гілкою:

# on master:
git checkout -b master_temp  
git reset HEAD^              # undo the bad commit on master_temp
git push origin master_temp  # push the new master to Bitbucket

У Bitbucket перейдіть до налаштувань сховища та змініть "Головну гілку" на master_temp(у Github змініть "Гілка за замовчуванням").

git push origin :master     # delete the original master branch from Bitbucket
git checkout master
git reset master_temp       # reset master to master_temp (removing the bad commit)
git push origin master      # re-upload master to bitbucket

Тепер перейдіть до Bitbucket, і вам слід побачити потрібну історію. Тепер ви можете перейти на сторінку налаштувань і змінити головну гілку назад на master.

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

редагувати : мабуть, вам не потрібно йти на всі ці клопоти на github, оскільки ви можете змусити натиснути гілку скидання .

Справа з роздратованими співробітниками

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

git reset HEAD^
git pull

Якщо вони витягнули погану команду і поклали на неї верх , тоді доведеться скинути, а потім git cherry-pickдобрі зобов’язання, які вони хочуть створити, ефективно відтворивши всю гілку без поганих зобов’язань.

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


1
Для тих, хто зручніше використовувати SourceTree: 1) Щоб змінити головну гілку веб-інтерфейсу для BitBucket, подивіться Налаштування Repo. 2) Щоб видалити гілку у веб-інтерфейсі, подивіться на сторінку Відділення. 3) Скиньте локальне репо, як зазначено вище. 4) Натисніть на локальні зміни, щоб відтворити ці гілки.
Річард Ле Месюр'є

2
Як хтось, хто випадково підштовхнув секрет, я дуже високо оцінив ґрунтовність цієї відповіді. Дякую!
Крутний момент

48

ви можете скинути, щоб HEAD^потім примусити натиснути.

git reset HEAD^
git push -u origin master --force

Він видалить ваш останній фіксатор і відображатиметься на бітбукеті як видалену комісію, але все ще залишатиметься на їх сервері.


Github це дозволить, але станом на це написання, Bitbucket не дозволяє силових натискань.
JamesQMurphy

4
насправді бітбукет робить силою підтримки штовхає просто diff, замість того, щоб повністю видаляти непростежені коміти, він позначає їх як видалені.
Шубанкер

Рекомендований спосіб з bitbucket - це відновити. Але я думаю, що в моєму випадку це більш доречно. Оскільки я єдиний, хто його використовує, і він відчуває себе більш чистим, ніж використання revert. Дякую.
нафсака

1
Так, це все ще працює на Bitbucket. Ви просто врятували мені великий час! Я взяв на себе зобов’язання / поштовх від мого Eclipse і змішався з іншим проектом, який у мене був. Частково через погану практику з мого боку, використовуючи командний рядок і вбудований eclipse для роботи над git.
DarkCygnus

блискуче чи простіше: скиньте поточну гілку на цю фіксацію, а потім за допомогою цього натискання на сервер виправити мою проблему
Ентоні Кал

3

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

Моє просте рішення це.

Крок 1.

 git clone <your repos URL> .

ваш проект в іншій папці, потім:

Крок 2.

git reset --hard <the commit you wanna go to>

потім Крок 3.

у свій останній (і головний) проект проекту (той, який має проблематичну останню фіксацію), вставте файли кроку 2

Крок 4.

git commit -m "Fixing the previous messy commit" 

Крок 5.

Насолоджуйтесь


1
Різання та обклеювання дійсно безладно. Крім того, це не вирішить проблему з питання.
Даніель Лі

1
git revertє простим: він створює нову команду, яка робить зворотну зміну попереднього комітету (або декількох комітів). Він не видаляє комісії, тому це питання не стосується цього питання. Також крок клонування тут насправді не потрібен.
naught101

1
Повернення Git - це рівноправний механізм, як описано вище.
нафсака

3

Ось простий підхід у 4 етапи:

0 - Порадьте команду, яку ви збираєте виправити сховище

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

1 - Видаліть останню фіксацію

Припустимо, що ваша цільова галузь master:

$ git checkout master              # move to the target branch
$ git reset --hard HEAD^           # remove the last commit
$ git push -f                      # push to fix the remote

На цьому момент ви закінчите, якщо працюєте в самоті.

2 - Виправте локальні сховища вашого товариша по команді

Про ваших товаришів по команді:

$ git checkout master              # move to the target branch
$ git fetch                        # update the local references but do not merge  
$ git reset --hard origin/master   # match the newly fetched remote state

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

3 - Повернення втрачених комісій

Скажімо, у товариша по команді був новий і неопублікований фактор, який був втрачений у цьому процесі.

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>

Зробіть це за стільки, скільки потрібно.

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


2

Як говорили інші, зазвичай ви хочете використовувати hg backoutабо git revert. Однак іноді дуже хочеться позбутися від зобов’язань.

По-перше, ви захочете перейти до налаштувань вашого сховища. Натисніть на Strip commitsпосилання.

Strip здійснює посилання в налаштуваннях біт-кода

Введіть ідентифікатор набору змін для набору змін, який ви хочете знищити, і натисніть Preview strip. Це дозволить вам побачити, який збиток ви збираєтеся зробити, перш ніж це зробити. Тоді просто натисніть, Confirmі ваша фіксація - це вже не історія. Переконайтесь, що ви скажете всім своїм співавторам про те, що ви зробили, щоб вони випадково не відштовхували правопорушних зобов'язань назад.


Яка версія це, і які дозволи потрібно? Це виглядає інакше на v6.4.3, на який я дивлюсь, і цього елемента немає. Я являюсь адміністратором сховища.
Рафаель

1

Після внесення змін вони не зможуть видалити. оскільки основний характер фіксації - не видаляти.

Що ви можете зробити (простий і безпечний метод),

Інтерактивна база даних:

1) git rebase -i HEAD~2 покаже ваші останні 2 коміти

2) Ваша комісія відображатиметься як "Останні" з'явиться внизу сторінки LILO (остання в "Останній вихід")

введіть тут опис зображення

Видаліть останній ряд комісій повністю

3) зберегти його за допомогою ctrl+XабоESC:wq

тепер ваша філія буде оновлена ​​без останнього зобов’язання.


1

Ви можете написати команду також для Bitbucket, як згадував Дастін :

git push -f origin HEAD^:master

Примітка: замість майстра можна використовувати будь-яку гілку. І це видаляє просто натиснути на Bitbucket.

Для видалення останньої комісії локально в git використовуйте:

git reset --hard HEAD~1

0

На даний момент хмарний бітбукет (я не впевнений, яка версія) дозволяє повернути комісію з файлової системи наступним чином (я не бачу, як повернути з інтерфейсу Bitbucket в браузері Chrome).

-завантажте весь каталог, щоб захистити зміни, які ви ненавмисно здійснили

-виберіть перевірений каталог

-права кнопка миші: меню черепахового git

-repo-браузер (опція меню "повернути" скасовує лише невпорядковані зміни)

- натисніть кнопку HEAD

-виберіть верхній рядок (остання комірка)

-права кнопка миші: повернути зміни за допомогою цього коміту

-Після того, як ви скасуєте зміни у файловій системі, натисніть кнопку "Ввести"

-це оновлення GIT із повідомленням "Повернутись (попереднє повідомлення). Це повертає так чи інакше "

-виберіть "зробити і натиснути".

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