Різні способи видалити локальні зміни Git


625

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

Коротше кажучи, мені довелося виконати наступні дві команди, щоб видалити свої локальні зміни

git checkout .

git clean -f

Моє запитання:

(1) Це правильний підхід до позбавлення від місцевих змін, або, будь ласка, повідомте мене про правильний підхід.

(2) коли ми використовуємо, git reset --hardяк я в змозі скинути, навіть без цієї команди

Дякую

* Рішення: Основні зміни: 03/26: * Замінено багато неясних термінів специфічною термінологією git [відслідковується / відслідковується / інсценізується / не змінюється]

Коли ми робимо локальні зміни, файлів може бути лише три категорії:

Тип 1. Поетапні відстежені файли

Тип 2. Ненаписані відстежені файли

Тип 3. Ненаписані файли без відстеження, також файли UnTracked

  • Поетапні - ті, які переміщені до області постановки / додано до індексу
  • Відстежені - модифіковані файли
  • UnTracked - нові файли. Завжди без позначки. Якщо інсценізовано, це означає, що вони відстежуються.

Що робить кожна команда:

  1. git checkout . - ТІЛЬКИ видаляє нестандартні відстежені файли [Тип 2]

  2. git clean -f - ТІЛЬКИ видаляє нерозподілені файли, що не відслідковуються [Тип 3]

  3. git reset --hard - ТІЛЬКИ вилучає поетапні відстежувані та незаписані відстежені файли [Тип 1, Тип 2]

  4. git stash -u - Видаляє всі зміни [Тип 1, Тип 2, Тип 3]

Висновок:

Зрозуміло, що ми можемо використовувати будь-яке

(1) combination of `git clean -f` and `git reset --hard` 

АБО

(2) `git stash -u`

для досягнення бажаного результату.

Примітка: приховування, оскільки слово означає "Зберігати (щось) безпечно і таємно у визначеному місці". Це завжди можна отримати за допомогою git stash pop. Тому вибір між перерахованими вище двома варіантами - це виклик розробника.

Дякую Крістофу та Фредеріку Шонінгу.

Редагування: 03/27

Я подумав, що варто поставити записку " остерігайся "git clean -f

git clean -f

Повернення назад немає. Використовуйте -nабо --dry-runдля попереднього перегляду завданої шкоди.

Якщо ви також хочете видалити каталоги, запустіть git clean -f -d

Якщо ви просто хочете видалити ігноровані файли, запустіть git clean -f -X

Якщо ви хочете видалити ігноровані, а також неігноровані файли, запустіть git clean -f -x

довідка: докладніше про те git clean: Як видалити локальні (без трекінгу) файли з поточного робочого дерева Git?

Редагувати: 20.05.2015

Відмова від усіх локальних комісій у цій гілці [Видалення локальних комітетів]

Щоб відмовитись від усіх місцевих комісій у цій гілці, щоб зробити локальну гілку ідентичною "вище за течією" цієї гілки, просто запустіть git reset --hard @{u}

Довідка: http://sethrobertson.github.io/GitFixUm/fixup.html

або робити git reset --hard origin/master[якщо місцеве відділення master]

Примітка: 06.06.2015. Це не дублікат іншого запитання про те, що позначено як дублікат. Це питання стосується як видалити локальні зміни GIT [видалити доданий файл, видалити зміни, додані до існуючого файлу тощо, та різні підходи; Де в іншому потоці SO адресовано лише те, як видалити локальну комітку. Якщо ви додали файл, і його хочете видалити самостійно, то інший потік SO не обговорює його. Отже, це не дублікат іншого]

Редагування: 23.06.15

Як повернути комісію, вже переміщену у віддалений сховище?

$ git revert ab12cd15

Редагувати: 01.09.2015

Видаліть попередню комісію з локальної та віддаленої гілки

Випадок: Ви тільки що здійснили зміну у вашому місцевому відділенні і негайно відсунули до віддаленого відділення, раптом зрозумів: О ні! Мені не потрібні ці зміни. Тепер що робити?

git reset --hard HEAD~1 [для видалення комісії з місцевого відділення]

git push origin HEAD --force[обидві команди повинні бути виконані. Для видалення з віддаленої гілки]

Яка галузь? Його наразі перевірена філія.

Редагувати 08.09.2015 - Видалити локальне об’єднання git :

Я перебуваю на masterгілці та об'єднав masterгілку з нещодавно працюючою гілкоюphase2

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

Питання: Як позбутися цього злиття? Спробував, git reset --hard і git clean -d -f обидва не працювали.

Єдине, що працювало - це будь-який із наведених нижче:

$ git reset --hard origin/master

або

$ git reset --hard HEAD~8

або

$ git reset --hard 9a88396f51e2a068bb7 [Код фіксації - це той, який був присутнім до того, як відбулися всі ваші об'єднання]


1
Я думаю, що ця тема може відповісти на ваші запитання: stackoverflow.com/questions/1146973/…
Сосьє,

1
"git stash" видалить усі внесені вами зміни.
Джон Баллінгер

1
Приємний підсумок! Я додам ще одну категорію файлів: "Тип 4. Проігноровані файли." git stash -a[або - всі] також зберігає ігноровані та відслідковувані файли. git clean -xочистить ігноровані файли. git clean -Xочистить лише проігноровані файли.
Джеррі101

2
@JavaDev Ваше запитання більше нагадувало відповідь .. цінуйте, що ви продовжували редагувати та збирали всі відповіді.
Bhavuk Mathur

1
дякую, я запустив усі 4 ваші команди, щоб змінити локальні зміни
Вінсент Тан,

Відповіді:


505

Все залежить від того, що саме ви намагаєтесь скасувати / відновити. Почніть з читання публікації за посиланням Ube . Але спробувати відповісти:

Жорсткий скидання

git reset --hard [HEAD]

повністю видалити всі поетапні та нестандартні зміни до відстежуваних файлів.

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

Чисто

git clean [-f]

Видаліть файли, які не відстежуються.

Для видалення тимчасових файлів, але зберігайте поетапні та нестандартні зміни до вже відстежуваних файлів. У більшості випадків я б, мабуть, створив правило ігнорування замість багаторазового очищення - наприклад, для папок bin / obj у проекті C #, яке, як правило, ви хочете виключити зі свого репо, щоб заощадити місце чи щось подібне.

Параметр -f (force) також видалить файли, які не відслідковуються і також ігноруються git, хоча ignore-rule. У вищенаведеному випадку з ігнорувальним правилом ніколи не відстежувати папки bin / obj, навіть якщо ці папки ігноруються git, за допомогою параметра force прибере їх з вашої файлової системи. Я спорадично бачив це для цього, наприклад, при розробці сценаріїв розгортання, і ви хочете очистити свій код перед розгортанням, блискавкою чи іншим способом.

Git clean не торкнеться файлів, які вже відстежуються.

Оформити замовлення "крапка"

git checkout .

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

"скасувати всі зміни в моєму робочому дереві".

Тобто скасовуються нестандартні зміни в відстежуваних файлах. Це, мабуть, не торкається поетапних змін і не залишає файли без відстеження.

Шташинг

У деяких відповідях згадується приховування. Як випливає з цього формулювання, ви, ймовірно, будете використовувати тайник, коли ви знаходитесь посеред чогось (не готового до виконання зобов’язань), і вам доведеться тимчасово перемикати гілки або якось працювати над іншим станом вашого коду, щоб пізніше повернутися до свого "безладного" парта ». Я не бачу, що це стосується вашого питання, але це, безумовно, зручно.

Підсумовуючи

Як правило, якщо ви впевнені, що ви здійснили і, можливо, вас підштовхнули до важливих віддалених змін, якщо ви просто розігруєтесь або подібне, за допомогою git reset --hard HEADнаступного git clean -fбуде остаточно очистити ваш код до держави, це було б у тому випадку, якби його тільки клонували і виїхали з відділення. Справді важливо підкреслити, що скидання також видалить поетапні, але невмінні зміни. Він видалить усе, що не було зроблено (крім нетренованих файлів; у такому випадку використовуйте clean ).

Усі інші команди є для полегшення складніших сценаріїв, де потрібна деталізація "скасування речей" :)

Я вважаю, що ваше питання №1 висвітлюється, але, нарешті, для висновку №2: причина, по якій ви ніколи не знаходили необхідності, git reset --hardполягає в тому, що ви ніколи нічого не ставили. Якби ви влаштували зміни, git checkout .ні git clean -fце не відмовили б.

Сподіваюсь, це охоплює.


Дякуємо за причину використання git reset --hard. Я спробував це, і так .. ті файли, додані до індексу (постановки), були видалені лише після git reset --hard, і я припускаю, що за замовчуванням git reset --hardє git reset --hard head. Це посилання також було корисним gitready.com/beginner/2009/01/18/the-staging-area.html
людина-павук

Я вдосконалив свою відповідь, чому, на мою думку, тут git stash -uмає найбільше сенс.
Крістоф

2
Дякую вам обом. Я узагальнив відповідь і вклав у своє запитання. Крістоф дав мені знати, що git stash -uробить і як зробити це, але Фредерік дав мені знати, що важко скинути, використовуючи комбінацію git reset --hardта git clean -f, а чому б не stashбуло бажано в деяких сценаріях. Тепер, будь ласка, допоможіть мені у виборі, який з них слід позначити як Відповідь :), обидва - це моя відповідь.
павук

3
.- це шлях, що посилається на поточний робочий каталог, який може бути коренем репо. Від git-scm.com: git checkout [<tree-ish>] [--] <pathspec>…оновлення названих шляхів у робочому дереві з індексного файлу або з іменованого <tree-ish>.
Джеррі101

3
Ніколи недостатньо підкреслюється, що git reset --hardі те, git clean -dfxі подібне є руйнівним . У будь-якому випадку, будь ласка, виправте малі літери headу відповіді, вона повинна бути або великою, HEADабо взагалі відсутньою.
Павло Шімерда

25

Причина додавання відповіді в цей момент:

Поки я додавав висновок і "відповіді" на своє первинне запитання, роблячи питання дуже тривалим, отже переходив до окремої відповіді.

Я також додав більш часто використовувані команди git, які допомагають мені на git, щоб допомогти ще комусь.

В основному для очищення всіх місцевих комісій $ git reset --hardта $ git clean -d -f


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

# Встановлює ім’я, яке ви хочете приєднати до своїх трансакцій

$ git config --global user.name "[name]"

# Встановлює електронний лист, який ви хочете приєднати до ваших трансакцій

$ git config --global user.email "[email address]"

# Список глобальної конфігурації

$ git config --list

# Списку віддаленої URL-адреси

$ git remote show origin

#check status

git status

# Список усіх місцевих та віддалених відділень

git branch -a

#створіть нову локальну гілку і почніть працювати над цією гілкою

git checkout -b "branchname" 

або, це може бути виконано у двох етапах

створити відділення: git branch branchname робота над цією галуззю:git checkout branchname

#комітувати локальні зміни [процес з двома кроками: - Додайте файл до індексу, це означає додавання в область постановки. Потім введіть файли, які є в цій області постановки]

git add <path to file>

git commit -m "commit message"

#checkout деякі інші місцеві відділення

git checkout "local branch name"

#remove всі зміни в локальній гілці [Припустимо, ви внесли деякі зміни в локальну гілку, як-от додавання нового файлу чи зміну існуючого файлу, або внесення місцевого зобов’язання, але це більше не потрібно] git clean -d -fта git reset --hard [очистити всі локальні зміни, внесені до місцевої гілки, за винятком випадків, якщо місцевий комітет]

git stash -u також видаляє всі зміни

Примітка . Зрозуміло, що ми можемо використовувати будь-яку (1) комбінацію git clean –d –fі git reset --hard АБО (2) git stash -u для досягнення бажаного результату.

Примітка 1: Зберігання, оскільки слово означає "Зберігати (щось) безпечно і таємно у визначеному місці". Це завжди можна отримати за допомогою git stash pop. Тому вибір між перерахованими вище двома варіантами - це виклик розробника.

Примітка 2: git reset --hardвидалить зміни робочого каталогу. Не забудьте зберегти всі локальні зміни, які ви хочете зберегти, перш ніж виконувати цю команду.

# Перейдіть на головну гілку та переконайтеся, що ви в курсі.

git checkout master

git fetch [це може знадобитися (залежно від конфігурації вашого git), щоб отримувати оновлення щодо origin / master]

git pull

# Об'єднайте гілку функції у головну гілку.

git merge feature_branch

# Скиньте головну гілку до стану походження.

git reset origin/master

# Випадково видалили файл з локальної програми, як відновити його назад? Зробіть a, git statusщоб отримати повний шлях файлу до видаленого ресурсу

git checkout branchname <file path name>

Це воно!

# Велика гілка ведучого з деяким іншим відділенням

git checkout master
git merge someotherbranchname

# перейменувати місцеву філію

git branch -m old-branch-name new-branch-name

#delete місцеве відділення

git branch -D branch-name

#delete віддалене відділення

git push origin --delete branchname

або

git push origin :branch-name

# повернути комісію, вже переміщену у віддалений сховище

git revert hgytyz4567

# відгалуження з попереднього комітету за допомогою GIT

git branch branchname <sha1-of-commit>

# Змінити повідомлення про фіксацію останньої комісії, яке вже було натиснуто на віддалений

git commit --amend -m "new commit message"
git push --force origin <branch-name>

# Відхилення всіх локальних комісій у цій гілці [Видалення локальних комітетів]

Щоб відмовитись від усіх місцевих комісій у цій гілці, щоб зробити локальну гілку ідентичною "вище за течією" цієї гілки, просто запустіть

git reset --hard @{u}

Довідка: http://sethrobertson.github.io/GitFixUm/fixup.html або зробіть git reset --hard origin/master[якщо локальна гілка є головним]

# Повернути комісію, вже переміщену у віддалений сховище?

$ git revert ab12cd15

# Видаліть попередню комісію з місцевої філії та віддаленої гілки

Випадок використання: Ви тільки що здійснили зміну у вашому місцевому відділенні і негайно натиснули на віддалену гілку, раптом зрозумівши, О ні! Мені не потрібні ці зміни. Тепер що робити?

git reset --hard HEAD~1[для видалення цього комітету з місцевого відділення. 1 позначає ОДИН зобов’язання, яке ви взяли]

git push origin HEAD --force[обидві команди повинні бути виконані. Для видалення з віддаленої гілки]. Наразі перевірена гілка буде називатися гілкою, де ви робите цю операцію.

# Виділіть деякі останні комісії з місцевого та віддаленого репо-файлу та збережіть на потрібних вами зобов'язаннях. (вид повернення комітетів із локальних та віддалених)

Припустимо, у вас є 3 коміти, які ви перейшли до віддаленої гілки з назвою " develop"

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

Повернутися до старої комісії (змінити стан філії)

git log --oneline --decorate --graph // щоб побачити всі ваші комікси

git clean -d -f // очистити будь-які локальні зміни

git reset --hard commitid-1 // місцеве повернення до цієї коміди

git push -u origin +develop// натисніть цей стан на віддалений. + робити натиск

# Видалити локальний git merge: Case: Я перебуваю на головній гілці та об'єднав головну гілку з нещодавно працюючою гілкою фазою2

$ git status

Про майстра відділення

$ git merge phase2 $ git status

Про майстра відділення

Ваша філія випереджає "походження / головний" на 8 комітів.

З: Як позбутися цього локального злиття git? Спробував, git reset --hardі git clean -d -fобидва не працювали. Єдине, що працювало - це будь-який із наведених нижче:

$ git reset - жорстке походження / майстер

або

$ git скидання - тверда голова ~ 8

або

$ git reset --hard 9a88396f51e2a068bb7 [Код фіксації - це той, який був присутнім до того, як відбулися всі ваші об'єднання]

#create файл gitignore

touch .gitignore // створити файл у користувачах mac або unix

зразок .гитигнорувати вміст:

.project
*.py
.settings

Посилання на шпаргалку GIT: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf


1
Ваша команда для видалення віддаленої гілки може виявитися не найкращою . Ви використовуєте, git push origin :branch-nameпроте я рекомендую використовуватиgit push origin --delete branchname
vibs2006,

Погодьтеся, я оновив вашу пропозицію, дякую @ vibs2006
людина-павук

21

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

Зручна справа в git stash -uтому, що це

  1. це, мабуть, найпростіша (лише?) одна команда для досягнення вашої мети
  2. якщо згодом ви передумаєте, ви повернете всю свою роботу git stash pop(це як видалення електронного листа в Gmail, де ви можете просто скасувати, якщо згодом передумаєте)

Що стосується іншого питання, git reset --hardви не будете видаляти незавершені файли, тому вам все одно знадобиться git clean -f. Але, git stash -uможливо, найзручніше.


git reset --hardНЕ буде видаляти неотслежіваемих файли на насправді, але це буде видалити неотслежіваемих зміни, тобто зміни в файли, які вже знаходяться в індексі. Я впевнений, що це ви мали на увазі :)
Frederik Struck-Schøning

Коли я використовував git stash -u, я бачив цю відповідь від git bash. "Збережений робочий каталог та індекс стану WIP на {гілка)} Можливо, це збережене - це те, що ми могли б отримати за допомогою git stash pop.
Людина-павук

Дякую вам обом. Я узагальнив відповідь і вклав у своє запитання. Крістоф дав мені знати, що git stash -uробить і як зробити це, але Фредерік дав мені знати, що важко скинути, використовуючи комбінацію git reset --hardта git clean -f, а чому б не stashбуло бажано в деяких сценаріях. Тепер, будь ласка, допоможіть мені у виборі, який з них слід позначити як Відповідь :), обидва - це моя відповідь.
павук

але що робити, якщо до свого сховища є файл, який я не хочу відстежувати? тільки в моїй репо. Якщо я додаю його до списку ігнорування, то у мене є файл .ignore, який потрібно здійснити, що також вплине на всіх інших.
користувач20358

7

1. Коли ви взагалі не хочете зберігати свої локальні зміни.

git reset --hard

Ця команда повністю видалить усі локальні зміни з вашого локального сховища. Це найкращий спосіб уникнути конфліктів під час команди "pull", лише якщо ви взагалі не хочете зберігати свої локальні зміни.

2. Коли ви хочете зберегти свої місцеві зміни

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

git stash

Це приховає всі локальні зміни, тепер ви можете витягнути віддалені зміни,

git pull

Тепер ви можете відновити свої локальні зміни,

git stash pop

1
git reset --hardне видаляє всі локальні зміни. Він видаляє лише модифікації. Якщо ви хочете видалити додавання, то вам також потрібноgit clean -fd
Джон Генкель


4

Я думаю, що у git є одна річ, яка чітко не зафіксована. Я думаю, що це насправді було знехтувано.

git checkout .

Людина, ти врятував мені день. У мене завжди є речі, які я хочу спробувати використовувати модифікований код. Але речі іноді в кінцевому підсумку змішують модифікований код, додають нові незатребувані файли і т. Д. Тож, що я хочу зробити, це зробити те, що я хочу, робити безладні речі, а потім швидко очищати і виконувати, якщо я щасливий.

Там git clean -fdдобре працює для відслідковуваних файлів.

Потім git resetпросто знімає поетапне, але git checkoutце занадто громіздко. Вказання файлів один за одним або використання каталогів не завжди ідеально. Іноді змінені файли, від яких я хочу позбутися, знаходяться в каталогах, які я хочу зберегти. Я побажав цієї однієї команди, яка просто видаляє нестандартні зміни, і ось ви. Дякую.

Але я вважаю, що вони повинні мати git checkoutбез будь-яких варіантів, видалити всі нестандартні зміни і не торкатися поставлених. Це свого роду модульне та інтуїтивне. Більше схоже на те, що git resetробить. git cleanтакож слід робити те саме.


2

Найкращий спосіб - перевірити зміни.

Змінивши файл pom.xml у проекті з ім'ям проекту, ви можете це зробити:

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'

2

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

Це приховає всі зміни в {0}ключі і миттєво видалить його з{0}

git stash && git stash drop


1

Перш за все перевірте, чи важлива зміна збережена чи ні:

$ git статус

ніж спробувати

$ git скидання - твердий

це скине вашу філію до типового

але якщо вам потрібно просто скасувати:

$ edit (1) $ git add frotz.c filfre.c $ mailx (2) $ git скидання
(3) $ git pull git: //info.example.com/ nitfol


Детальніше >> https://git-scm.com/docs/git-reset


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