ПредишенСледващото

Reset разкриване на тайни

три дървета

Сделка с нулиране команди и касата ще бъде по-лесно, ако приемем, че съдържанието Git управлява три различни дървета. Тук, в рамките на "дървото", ние имаме предвид "набор от файлове", а не на специална структура на данните. (В някои случаи, индексът не се държи точно като дърво, но за настоящите ни цели е по-лесно да го представи по този начин.)

В нейното нормално функциониране, Git оперира три дървета:

HEAD - указател към текущия бранша, което, от своя страна, е указател към последния комит направени в тази тема. Това означава, че родителят ще бъде HEAD трябва да създаде ангажират. Като правило, най-простият и отрицателни ефекти HEAD моментна снимка на вашия последен ангажират.

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

котка-файл команда и LS-дърво са "официални" (ВиК) командите, които се използват вътрешно и не са необходими за ежедневната работа, но те ни помагат да разберем какво всъщност се случва.

Index - това е следващата ви насрочено комит. Ние сме също така спомена, това понятие като "стратегическа промяна площ" Git - това, което изглежда Git Git, когато стартирате ангажират.

Git попълва списъка с индекс на оригиналното съдържание на всички файлове, които се разтоварват за последен път във вашата работна директория. След това можете да замени някои от тези файлове с новите си версии и "Git ангажират" команда преобразува промяна в дървото за новия ангажимент.

Отново, тук ние използваме услугите командни LS-файлове. който ви показва как изглежда точно сега си код.

Технически погледнато, индексът не е дървовидна структура, в действителност, това се осъществява, като заместител на списък (повален манифест) - но за нашите цели е достатъчно това представителство.

работна директория

И накрая, имате работеща директория. Две други дървета запазват тяхното съдържание ефективна, но неудобен начин вътре .git директория. Работната Каталог разархивира в самите файлове, което го прави по-лесно да ги редактирате. Помислете за работна директория пясък. , където можете да тествате промените си, преди да ги ангажира с индекса (постановка промени площ), а след това в историята.

процес

Основната цел на Git - е запазване на изображения последователно подобрява състоянието на вашия проект, чрез контролиране на тези три дървета.

Git - изчисти разкриване на тайни

Git - изчисти разкриване на тайни

На този етап, само на работната директория дървото съдържа данните.

Сега искаме да извършат файла, така че ние използваме Git добавите към копирате съдържанието на работната директория в индекса.

Git - изчисти разкриване на тайни

След това, ние се изпълни команда стомашно-чревния тракт се ангажират. който съхранява съдържанието на индекса като неизменна снимка създава обект ангажират, който сочи към моментна снимка, и актуализира капитанът, така че той също посочи, че се ангажират.

Git - изчисти разкриване на тайни

Ако сега стартирате статус Git. ние няма да видите никакви промени, тъй като и трите на едно и също дърво.

Сега ние искаме да направим промени във файла и да го zakomitit. Ние ще мине през всички по същата процедура; Първо редактирате файла в тази работна директория. Нека да наречем този v2 версия на файла и ще бъдат обозначени в червено.

Git - изчисти разкриване на тайни

Сега, ако се натъкнем статус Git. ние виждаме, че файлът е осветена в червено в раздел "Промените не са готови да се ангажират", тъй като тя представлява в индекса и работната директория е различен. След това работи Git добавите към този файл, за да го сложи в индекса.

Git - изчисти разкриване на тайни

Сега, ако се натъкнем статус Git. можем да видим, че файлът се подчертава в зелено в "промени да бъдат zakommicheny", както и индекса на HEAD са различни - това е нашата следваща планирана ангажират сега е различен от последния ни ангажира. И накрая, ние тече Git ангажират. най-после да направи ангажират.

Git - изчисти разкриване на тайни

Сега команда Git статус не показва нищо, защото отново, и трите на едно и също дърво.

Превключване на клонове и клониране минават през подобен процес. Когато превключвате (касата) до клона HEAD също започва да сочи към нов клон, индексират се заменя с изображение извърши тази тема, а след това съдържанието на индекса се копират на работна директория.

нулиране назначаване

Reset команда става по-разбираема, ако смятаме, че в светлината на изложеното по-горе.

Следващите примери предполагат, че ние отново промениха file.txt файл и да извършат това за трети път. Така че нашата история сега изглежда така:

Git - изчисти разкриване на тайни

Нека сега да се проследи внимателно какво се случва, когато се обадите нулиране. Тази команда е прост и предвидим начин за управление на трите дървета, които съществуват в Git. Тя изпълнява три основни операции.

Стъпка 1: движи главата

Първото нещо, което ще направи възстановяване - се движи, че както е посочено от главата. Имайте предвид, че не се променят HEAD (това, което се случва, когато командата касата); изчисти ходове бранша посочиха HEAD. По този начин, ако главата сочи към клон майстор (тоест, с който работите майстор клон), изпълнението на Git нулиране отбор 9e5e6a4 ще се уверете, че капитанът ще покаже 9e5e6a4.

Git - изчисти разкриване на тайни

Без значение кои опции сте се обадили за нулиране команда с извършване (нулиране може да се извика с пътя), той винаги ще се опитва първо да сте в движение. Когато се обадите на --soft нулиране на тази команда и спира.

Сега да погледнем графиката и се опитват да разберат какво се е случило: последната команда ГИТ ангажират действително е отменена. Когато стартирате Git ангажират. Git създава ново лице и се движи тя клон, посочен от главата. Ако извършите нулиране на HEAD

(HEAD майка), можете да се премести на клона до мястото, където е бил преди, без да се променя всеки индекс или работна директория. Можете да актуализирате индекса и тичам Git ангажират отново. този начин се постига същото, което прави команда ГИТ ангажират --amend (вижте Промяна на последния комит).

Стъпка 2: Актуализиране Index (--mixed)

Имайте предвид, че ако ви се налага да тичам състоянието на Git. ще видите зелената маркирани промяната между индекса и новият шеф.

Следващото нещо, което ще направи нулиране. Индексът ще се актуализира съдържанието на моментна снимка, посочи от HEAD.

Git - изчисти разкриване на тайни

Ако сте задали опция --mixed. нулиране изпълнение ще спре в тази стъпка. Това поведение се използва и по подразбиране, така че, ако не укажете опции на всички (в този случай, Git нулиране HEAD

), Командата ще спре на тази стъпка.

Отново, погледнете в таблицата и да се опита да разбере какво се е случило: не само от закрития си миналата ангажират. но също така и добавяне на индекса на всички файлове. Можете отвали до стомашно-чревния тракт на изпълнение на команди добавите и Git ангажират.

Стъпка 3: Актуализиране на работна директория (--hard)

Третото нещо, което ще направи възстановяване - е да си работна директория на същия вид, както на индекса. Ако използвате --hard. след това командата ще продължи към тази стъпка.

Git - изчисти разкриване на тайни

Нека да видим какво ще се случи днес. Вие отменихте миналата ангажират, резултатите от командния ГИТ да добавят и да се ангажират Git. както и всички промени, които сте направили във вашата работна директория.

Важно е, че само посочването на този флаг (--hard) се рестартира опасен отбор, е един от малкото случаи, когато Git всъщност изтрива данните. Всички останали обаждания нулират лесно отменени, но когато укажете опции --hard команда насилствено променя файлове в работната директория. В този конкретен случай, v3 версия на нашия файл все още остава в ангажират в Git базата данни и можем да я върне, гледайки през нашата reflog. но ако не сте комит тази версия, Git ще презапише файла и ще бъде невъзможно да се възстанови.

команда за нулиране в предварително определен ред, три пренаписване на Git дървото, спиране, когато го кажа:

Премества клон, както е посочено от ръководителя (спре, ако разполагате с --soft по желание)

Прави същия индекс като ръководител (спира дотук, освен ако не е уточнено --hard опция)

Това прави работната директория същите като на индекса.

Reset с пътя

Основната форма на нулиране команда (без опции и --soft --hard) можете също да мине по пътя, с който ще работи. В този случай, нулирането ще пропусне първата стъпка, а останалата част ще работи само с даден файл или набор от файлове. Първата стъпка се пропуска, тъй като указател на главата и не може да разчита на част от една ангажират и отчасти, от друга. Но Index и работната директория може да се променя частично така нулират изпълнява стъпки 2 и 3.

Така че нека да предположим, че имате Git нулиране file.txt. Тази форма на писане (тъй като не уточни нито се ангажират SHA-1, или клон или --soft опции или --hard) е съкращение за Git изчисти --mixed HEAD file.txt. че:

Той се движи клон, както е посочено от глава (ще бъде пропуснат)

Прави индекса и HEAD (спрем тук)

Това означава, че в действителност, това копия на файла file.txt от главата до Индекса.

Git - изчисти разкриване на тайни

Това създава ефекта на премахване на файла за индексиране. Ако се вгледате в класацията на командите и командва Git добавите. ще видите, че действията им са диаметрално противоположни.

Git - изчисти разкриване на тайни

Ето защо в изхода на Git автори статус предлагам да използвате тази команда, за да отмените индексиране файла. (Вижте подробности в отмяната на обучение файл.)

Ние лесно може да направи Git "не е взела данните от главата", което означава ангажимент, от който да поеме версия на файла. За да направите това, трябва да направите следното: Git нулиране eb43bf file.txt.

Git - изчисти разкриване на тайни

Можем да предположим, че в действителност, ние сме в работна директория назад към съдържанието на v1 версията на файла. изпълнено за него Git добавите. и след това се връща обратно към съдържанието на версия v3 (в действителност, всички тези стъпки се извършват). Сега, ако се натъкнем Git ангажират. промените ще бъдат спасени, които се връщат на файла, за да v1 на версията. но файла в работната директория никога няма да се върне към тази версия.

Имайте предвид, че тъй като команда Git добавите. нулиране може да бъде определен --patch опция, за да отмените индексирането на съдържанието. По този начин, можете да отмените избирателно индексиране или отмените промените.

Обединяване ангажира

Нека да видим как да се използва по-горе, да направи нещо интересно - сливане задължава.

Да кажем, че имате ангажират последователност с послания като "опа.", "В" и "забравих файла." Можете да използвате нулиране за бързо и лесно да ги обедините в една. (Асоциацията на записите е друг начин да направи същото нещо, но в този случай, е по-лесно да се използва за нулиране.)

Да предположим, че имате проект, в който първи се ангажират съдържа един файл, а вторият се ангажират добавя нов файл и променя първия и третия ангажират отново се променя повече от един файл. Вторият комит бе направено по време на работа и искате да го слее с друга.

Git - изчисти разкриване на тайни

Можете да извършите Git изчисти --soft HEAD

2. HEAD клон да се върне в някои от предишните ангажират (на първия ангажимент, който искате да оставите):

Git - изчисти разкриване на тайни

След това просто изпълнете отново ГИТ ангажират:

Git - изчисти разкриване на тайни

Сега можете да видите, че вашият "достъпни" история (една история, която след това да ви изпрати към сървъра), сега изглежда - трябва първо да се ангажират с v1 файла файлове a.txt версия. и второ, което се променя файла-a.txt файла на версия v3 и добавя файлове b.txt. Поемане на ангажимент, който съдържа v2 версия на файла не е останало в историята.

Сравнение на касата

На последно място, може да се чудите каква е разликата между касата и нулиране. Както нулиране. касата команда работи три дървета в Git, а също и поведението му зависи от това дали сте посочили пътя до файла или не.

Без път

касата Командата Git [клон] е много подобен на Git нулиране --hard [клон]. в процеса на извършване на трите дървета са се променили, за да изглежда като [клон]. Но има две важни разлики между тези два отбора.

На първо място, за разлика от нулиране --hard. касата екип се грижи за работната директория и да се уверите, че тя не докосвайте файловете, които са се променили. В действителност, този отбор отива малко по-умен - той се опитва да изпълнява работна директория просто сливане, така че всички файлове, които не са се променили, са актуализирани. От друга страна, нулиране --hard отбор просто замени цялата работа без да се извършват проверки.

Втората важна разлика е, как тези команди актуализират главата. Докато нулират браншови движи, както е посочено от HEAD, HEAD касата МаркиКатегорииПромоцииНово командни себе си ходове, така че да сочи към друг клон.

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

По този начин, и в двата случая, ние се движат главата ангажират с А, но важна разлика е, как го правим. движи нулиране командни и клон, посочиха от главата, и се движи само на касата HEAD.

Git - изчисти разкриване на тайни

Показване на пътя

Друг начин да се извърши на касата е да укажете пътя до файла. В този случай, както и за командата за нулиране. HEAD няма да бъдат преместени. Тази команда като Git нулиране [клон] файл актуализира версията на файла в индекса от ангажират, но в допълнение го актуализира и файл в работната директория. Същото нещо щеше да направи стомашно-чревния тракт на отбора изчисти --hard [клон] подава (ако нулиране може да бъде изпълнена така) - това не е безопасно за работна директория и се движи главата.

Точно като Git Git нулира и се добави. касата поема командването --patch опция, за да ви позволи да селективно се връщам, за да променя съдържанието на файла.

заключение

Надявам се да се разбере командата за нулиране, и можете спокойно да го използвате. Но може би все още са малко объркани за това какво точно се различава от касата. или запомнени всички правила, използвани в различни изпълнения наричат.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!