Как да отключите местния git commit

Моят проблем е, че промених файла, например: README, добавих нов ред "това е за тестовата ми линия" и запазих файла, след което пуснах следните команди

  git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README # no changes added to commit (use "git add" and/or "git commit -a") git add README git commit -a -m 'To add new line to readme' 

Не натиснах кода на github, сега искам да отмените този ангажимент.

За това използвах

  git reset --hard HEAD~1 

Но аз загубих новата добавена линия "това е за моя тестов ред" от файла README. Това не трябва да бъде. Имам нужда от съдържанието, за да бъда там. Има ли начин да се запази съдържанието и да се анулира местният ангажимент?

560
31 янв. определени от Amal Kumar S на 31 януари 2011-01-31 15:14 '11 в 15:14 2011-01-31 15:14
@ 7 отговора

Просто използвайте git reset без флага --hard :

 git reset HEAD~1 

PS: В Unix-базирани системи можете да използвате HEAD^ , което е HEAD~1 . В Windows HEAD^ няма да работи, защото сигнализира за продължаване на линията. Така че, командния ред ви пита ли More? ,

1085
31 янв. Отговорът е даден Koraktor 31 януари 2011-01-31 15:17 '11 в 15:17 2011-01-31 15:17

Използвайте --soft вместо --hard flag:

border=0
 git reset --soft HEAD^ 
143
10 авг. Отговорът е даден TpED 10 август. 2012-08-10 11:02 '12 в 11:02 ч. 2012-08-10 11:02

Ако се намирате в средата на корекция (т.е. вече в редактора), можете да я анулирате, като изтриете всички редове над първия # . Това ще прекъсне ангажимента.

По този начин можете да изтриете всички линии, така че съобщението за фиксация да е празно, и след това да запишете файла:

2019

Можете да кажете на Git какво да прави с вашия индекс (наборът от файлове, които ще станат следващия коммит) и работната директория, когато изпълнявате git нулиране, като използвате един от параметрите:

--soft : само --soft ще бъдат нулирани и индексът и работната директория няма да се променят.

--mixed : това ще нулира индекса според заглавието и работната директория няма да бъде засегната. Всички промени ще останат в работната директория и ще изглеждат като променени.

--hard : нулира всичко ( --hard , index, working directory) според заглавието.

В твоя случай бих използвал git reset --soft да запазя променените ви промени в индекса и работната директория. Не забравяйте да проверите това за по-подробно обяснение.

5
29 мая '18 в 13:22 2018-05-29 13:22 отговорът е даден от Неша Зорич на 29 май 18 часа в 13:22 ч. 2018-05-29 13:22

Първото нещо, което трябва да направите, е да разберете дали искате да запишете местни промени, преди да изтриете съобщението за фиксиране.

Използвайте git log да покажете текущите съобщения за обвързване, след което намерете commit_id, преди да искате да изтриете, а не само този, който искате да изтриете.

Ако искате да запазите локално модифицирани файлове, просто изтрийте съобщението за четене:

git reset --soft commit_id

Ако искате да изтриете всички локално модифицирани файлове и съобщението за фиксиране:

git reset --hard commit_id

Каква е разликата е мека и твърда

2
02 сент. отговорът е даден mistdon 02 sep . 2018-09-02 06:43 '18 в 6:43 2018-09-02 06:43

Използвайте командата по-долу: $ git reset HEAD ~ 1 След това можете да видите и върнатите файлове, както е показано по-долу.

Неопределени промени след нулиране: M application / config / config.php M application / config / database.php

1
14 мая '18 в 16:25 2018-05-14 16:25 отговорът е даден на Omkar 14 май, 18 в 16:25 ч. 2018-05-14 16:25

Разлика между git reset - смесен, --soft и - hard

Необходимо условие: когато е направена промяна в съществуващ файл в хранилището, тази промяна първоначално се счита за неуточнена. За да извършите промените, трябва да го подготвите, което означава да го добавите към индекса, използвайки git add . По време на операцията по предаване, файловете, които се поставят, се добавят към индекса.

Да вземем един пример:

 - A - B - C (master) 

HEAD показва C и индексът съответства на C

--soft

  • Когато изпълняваме git reset --soft B за да изтрием ангажимент C и git reset --soft B главната / HEAD към B.
  • Сега Master / HEAD ще сочи към B, но индексът все още се променя от C.
  • Когато стартирате git status можете да видите файловете, индексирани в comm C като фазиран .
  • Изпълнението на git commit в този момент ще създаде нов ангажимент със същите промени като в C

--mixed

  • Стартирайте git reset --mixed B
  • Когато се изпълнява, master / HEAD ще сочи към B и индексът също се променя, за да съответства на B поради използвания смесен флаг.
  • Ако в този момент изпълним git commit, нищо няма да се случи, тъй като индексът съответства на HEAD .
  • Все още имаме промени в работната директория, но тъй като те не се намират в индекса, състоянието на git ги показва като неподготвени .
  • За да ги поправите, трябва да git add и след това да поправите както обикновено.

--hard

  • Стартирайте git reset --hard B
  • Когато изпълнител master / HEAD ще посочи B и ще смените вашата работна директория
  • Промените са добавени в C и всички неприети промени ще бъдат изтрити .
  • Файловете в работното копие ще съответстват на запис B, това ще доведе до загуба на всички промени, които са били направени за извършване на C, както и до непроменени промени.

Надявам се, че сравняването на флаговете, достъпни за използване с командата git reset ще помогне на някой да ги използва разумно. Свържете се с тях за повече информация link1 link2

0
18 янв. Отговор е даден от Keshan Nageswaran Jan 18 2019-01-18 19:48 '19 в 19:48 ч. 2019-01-18 19:48

Други въпроси относно тагове или Ask a Question