Resetting, checking out & reverting
git reset, git checkout, і git revert commands є деякі з найбільш useful tools в вашому Git toolbox. Вони всі роки ви не можете бачити, як змінити свою репозиторію, і перші дві команди можуть бути використані для керування її комісіями або окремими файлами.
Оскільки команди дуже схожі, легко заплутатися, яку їх використовувати у конкретному сценарії розробки. У цій статті ми порівняємо найпоширеніші конфігурації команд git reset, git checkout та git revert. Сподіваємося, що ви навчитеся впевнено переміщатися репозиторієм за допомогою будь-якої з них.
Це допомагає думати про будь-який command в термінах їхнього ефекту на трьох державних менеджменту механізмів гітарної реpository: робочої літератури, проміжок snapshot, і комісія історії. Ці компоненти є деякимивідомими як "Три stromи" з Git. We explore the three trees in depth on the git reset page. Keep these mechanisms in mind as you read this article.
Перемикання версій (команда checkout) переміщує покажчик HEAD на вказаний коміт. Покажемо це на прикладі.
Пов'язані матеріали
Переміщення повного репозиторію Git
СМ. РІШЕННЯ
Вивчіть Git за допомогою Bitbucket Cloud
У цьому прикладі показано послідовність коммітів у гілці main. Тепер і вказівник HEAD, і вказівник на головну гілку main вказують на коміт d. Тепер давайте виконаємо команду git checkout b
Це оновлення дерева "історії коммітів". Команду git checkout можна використовувати лише на рівні комміта чи файла. При перемиканні на рівні файлу його вміст відображатиме стан за конкретного коміту.
Операція скасування (команда revert) приймає як аргумент комміт і створює новий коміт, зміни у якому протилежні зазначеному. git revert діє лише на рівні комміту та не працює на рівні файлів.
Операція скидання (команда reset) приймає як аргумент коміт і скидає «три дерева» до стану репозиторію при зазначеному коміті. Її можна виконати у трьох різних режимах, що відповідають трьом деревам.
Команди checkout і reset зазвичай використовуються для локальних або приватних скасування. Ці команди змінюють історію репозиторію, що може викликати конфлікти під час відправлення у віддалені загальні репозиторії. Команда revert вважається безпечною операцією для публічних скасування, оскільки додає до історії нові дані, якими можна ділитися віддалено, а не перезаписує старі, від яких можуть залежати учасники команди.
Git reset vs revert vs checkout reference
У таблиці нижче наведено найпоширеніші сценарії використання всіх цих команд. Обов'язково тримайте її під рукою для довідки, оскільки вам, поза сумнівом, доведеться використовувати хоча б деякі з цих сценаріїв під час роботи з Git.
Як повернутися (відкотитися) до більш раннього коміту?
A, B, C, D — комміти у гілці master.
(HEAD) – розташування покажчика HEAD.
(i) - стан індексу Git. Якщо збігається c (HEAD) – порожній. Якщо ні – містить зміни, підготовлені до наступного коміту.
(wt) - стан робочої області проекту (working tree). Якщо збігається з (i) – немає неіндексованих змін, якщо не збігається – є зміни.
↑ позначає коміт, який вказує певна гілка чи покажчик.
Ось рішення, залежно від завдання:
1. Тимчасово перейти на інший коміт
Якщо вам потрібно просто перейти на інший коміт, щоб, наприклад, подивитися на його вміст, достатньо команди git checkout :
git checkout aaaaaa (wt) (i) A - B - C - D ↑ ↑ (HEAD) master
Наразі репозиторій перебуває у стані «detached HEAD». Щоб перейти назад, використовуйте ім'я гілки (наприклад, master ):
git checkout master
2. Перейти на коміт і продовжити роботу з нього
Якщо ви хочете продовжити роботу з іншого комміту, вам знадобиться нова гілка.Можна переключитися та створити її однією командою:
git checkout -b ім'я-нової-гілки aaaaaa (wt) (i) A - B - C - D ↑ ↑ New master (HEAD)
3. Видалити зміни в робочій області та повернути її до стану як за останнього коміту.
(i) (wt) A - B - C - D -? -? ↑ master (HEAD)
3.1 Безпечно – за допомогою кишені (stash)
3.1.1 Тільки неіндексовані
можна видалити привласнити тільки ті зміни, які ще не були індексовані (командою add):
git stash save --keep-index
(wt) (i) A - B - C - D -? ? ↑ ↑ master stash (HEAD)
3.1.2 Індексовані та ні
Ця команда скасовує всі індексовані та неіндексовані зміни у робочій області, зберігаючи їх у кишеню (stash).
(wt) (i) A - B - C - D? ↑ ↑ master stash (HEAD)
Відновлення незбережених змін: легко та просто.
Якщо stash зовсім не потрібний, його можна видалити.
видалити останній запис кишені git stash drop
Після цього відновити зміни все ще можна, але складніше: How to recover a dropped stash in Git?
3.2 Небезпечний спосіб
Обережно! Ця команда безповоротно видаляє незбережені поточні зміни з робочої області та індексу Якщо вони вам таки потрібні, скористайтеся git stash .
Відновлення незбережених змін: неіндексовані втрачені повністю, але ви можете відновити те, що було проіндексовано.
Тут ми будемо використовувати git reset --hard
git reset --hard HEAD
(wt) (i) A - B - C - D - x - x ↑ master (HEAD)
4. Перейти до більш раннього комміту в поточній гілці і видалити всі наступні (неопубліковані)
Обережно! Ця команда переписує історію Git-репозиторію. Якщо ви вже опублікували ( git push ) свої зміни, цей спосіб використовувати не можна (див. чому). Використовуйте варіант з пункту 5 (git revert).
4.1 При цьому зберегти зміни до індексу репозиторію:
git reset --soft bbbbbb
Після цього індекс репозиторію міститиме всі зміни від cccccc до dddddd. Тепер ви можете зробити новий коміт (або кілька) на основі цих змін.
(wt) (i) A - B - C - D master (HEAD)
4.2 Зберегти зміни у робочій області, але не індексі.
Ця команда просто переміщає вказівник гілки, але не відображає зміни в індексі (він буде порожнім).
(i) (wt) A - B - C - D master (HEAD)
4.3 Просто викинути зміни.
Обережно! Ця команда безповоротно видаляє незбережені поточні зміни. Якщо коміти, що видаляються, не належать жодній іншій гілці, то вони теж будуть втрачені.
Відновлення комітів: Використовуйте git reflog і це питання, щоб знайти і відновити комміти; інакше збирач сміття видалить їх безповоротно через деякий час.
Відновлення незбережених змін: неіндексовані втрачені повністю, але ви можете відновити те, що було проіндексовано.
(i) (wt) A - B - C - D -? -? ↑ master (HEAD)
git reset --hard bbbbbb
(wt) (i) A - B - C - D - x - x ↑ master (HEAD)
5. Скасувати вже опубліковані комміти за допомогою нових комітів
Скористайтеся командою git revert. Вона створює нові комміти, по одному на кожен скасовуваний коміт. Таким чином, якщо потрібно скасувати всі комміти після aaaaaa :
# можна перерахувати скасовані коміти git revert bbbbbb cccccc dddddd # можна задати діапазон від більш раннього до пізнішого (нового) git revert bbbbbb..dddddd # або у відносних посиланнях git revert HEAD~2..HEAD # можна скасувати коміт чином номер предка (у нашому прикладі таких ні): git revert -m 1 abcdef # після цього підтвердіть зміни: git commit -m'детальний опис, що і чому зроблено'
Відновлення: Якщо revert-коміт виявився помилковим, використовуйте цю відповідь
How to undo a merge on Bitbucket?
I've створено merge (у 'master' branch) що зараз на Bitbucket repo. Long story short: Я потребую undo that merge.Я знаю, що ви можете це зробити в Github сайту його, але Bitbucket не має, що feature. I'm not clear on how to do this with Git без повідомлень mess.
6 Answers 6
Ви повинні спочатку clone repository on your local system (можна отримати repo URL в SSH або HTTPS формат від "Overview" сторінка реpository в Bitbucket):
git clone [email protected]:my/repo.git -or- git clone https://[email protected]/my/repo.git git checkout master
.. then revert the most recent commit. Перший лист існуючих комітів з:
.. then select the commit before the merge:
git reset --hard 72ead1c4c1778c23c277c4f15bbb68f3bb205f54
.. where the hash is the hash of the commit before the merge (from the log). Власне, force-push зміни back to Bitbucket, overwriting history.
Звісно, якщо репо є shared, і його інші користувачі мають розраховані на вашому останньому коміті і побудувати, щоб бути, вони не будуть добре. Якщо ви думаєте, що це не так, то все, що ви робите.
revert , як mentioned in thether answers is another option; it keeps commit you made, but modifies the repository further (with new commit) в такій мірі, що це не можна змінити you made. Які ви намагаєтеся перевірити, що залежить від того, що ви бажаєте отримати інформацію в вашому commit to remain in the repo history or not.
Для того, щоб дізнатися більше про зміну змін у git, ти можу зробити tutorial page by Atlassian.