Крайното ръководство за Git Reset и Git Revert

Добре дошли в нашата крайна насочи към git resetи git revertкоманди. Този урок ще ви научи на всичко, което трябва да знаете за поправяне на често срещани грешки и отмяна на лоши ангажименти, докато използвате Git.

Разберете трите раздела на проект Git

Проектът Git има следните три основни раздела:

  1. Git директория
  2. Работна директория (или работещо дърво)
  3. Постановка

В указателя Git (намира се в YOUR-PROJECT-PATH/.git/) е мястото, където Git магазини всичко е необходимо да се проследи точно на проекта. Това включва метаданни и обектна база данни, която включва компресирани версии на файловете на проекта.

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

Забележка: Директорията е известна също като хранилище или репо за кратка форма. Репото на локалната машина на потребителя се нарича "Локално репо", докато репото на git сървъра се нарича "Отдалечено репо".

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

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

Git Reset

В git resetкоманда ви позволява да RESET текущата си главата до определена държава. Можете да нулирате състоянието на определени файлове, както и цял клон. Това е полезно, ако все още не сте изпратили ангажимента си към GitHub или друго отдалечено хранилище.

Нулирайте файл или набор от файлове

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

git reset (--patch | -p) [tree-ish] [--] [paths]

Дезактивирайте файл

Ако сте преместили файл в подреждащата зона с git add, но вече не искате той да е част от git resetфиксиране , можете да използвате, за да дезактивирате този файл:

git reset HEAD FILE-TO-UNSTAGE

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

Нулирайте клон до предварително фиксиране

Следващата команда нулира HEAD на текущия ви клон до дадената COMMITи актуализира индекса. По принцип той пренавива състоянието на вашия клон, след което всички ангажименти, които правите напред, пишат върху всичко, което е дошло след точката за нулиране. Ако пропуснете MODE, по подразбиране --mixed:

git reset MODE COMMIT

Опциите за MODEса:

  • --soft: не нулира индексния файл или работещото дърво, но нулира HEAD до commit. Променя всички файлове на „Промени, които трябва да бъдат ангажирани“
  • --mixed: нулира индекса, но не и работното дърво и отчита това, което не е актуализирано
  • --hard: нулира индекса и работещото дърво. Всички промени в проследяваните файлове в работното дърво, тъй като commitсе отхвърлят
  • --merge: нулира индекса и актуализира файловете в работното дърво, които са различни между commitи HEAD, но запазва тези, които са различни между индекса и работното дърво
  • --keep: нулира записите в индекса и актуализира файлове в работното дърво, които са различни между commitи HEAD. Ако файл, който е различен между commitи HEAD, има локални промени, нулирането се прекъсва

Важна забележка относно твърдите нулирания

Бъдете много внимателни, когато използвате --hardопцията с, git resetтъй като тя нулира вашия ангажимент, промените и работната директория. Ако тази опция не се използва правилно, в крайна сметка човек може да загуби написания код.

Git Revert

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

Вместо това е по-добре да се използва git revert, което отменя промените, направени от предишен коммит, като създава изцяло нов ангажимент, без да се променя историята на фиксирането.

Връщане на фиксиране или набор от ангажименти

Следващата команда ви позволява да върнете промените от предишен фиксиране или фиксиране и да създадете нов ангажимент.

git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] … git revert --continue git revert --quit git revert --abort

Общи опции:

 -e --edit
  • Това е опцията по подразбиране и не е необходимо да се задава изрично. Той отваря стандартния текстов редактор на вашата система и ви позволява да редактирате новото съобщение за фиксиране, преди да извършите връщането.
  • Тази опция прави обратното -eи git revertняма да отвори текстовия редактор.
  • Тази опция не позволява git revertда отмените предишен ангажимент и да създадете нов. Вместо да създава нов ангажимент, -nще отмени промените от предишния ангажимент и ще ги добави към индекса за индексиране и работната директория.
 --no-edit
-n -no-commit

Пример.

Нека си представим следната ситуация: 1.) Работите върху файл и добавяте и ангажирате вашите промени. 2.) След това работите върху няколко други неща и правите още няколко ангажименти. 3.) Сега осъзнавате, преди три или четири фиксации сте направили нещо, което бихте искали да отмените - как можете да направите това?

You might be thinking, just use git reset, but this will remove all of the commits after the one you would like to change - git revert to the rescue! Let's walk through this example:

mkdir learn_revert # Create a folder called `learn_revert` cd learn_revert # `cd` into the folder `learn_revert` git init # Initialize a git repository touch first.txt # Create a file called `first.txt` echo Start >> first.txt # Add the text "Start" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding first" # Commit with the message "Adding first.txt" echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt` git add . # Add the `wrong.txt` file git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt" echo More >> first.txt # Add the text "More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt" echo Even More >> first.txt # Add the text "Even More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt" # OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit) git revert HEAD~2 # this will put us in a text editor where we can modify the commit message. ls # wrong.txt is not there any more! git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`

And with that you're one step closer to getting your black belt in Git.