Git
Chapters ▾ 2nd Edition

2.4 Основите на Git - Поништување на нештата

Поништување на нештата

Во секоја фаза, можеби ќе сакате нешто да го вратите. Еве, ќе разгледаме неколку основни алатки за поништување на промените што сте ги направиле. Бидете внимателни, бидејќи не можете секогаш да ги вратите некои од овие уреди. Ова е една од ретките области во Git каде што може да изгубите некоја работа ако го направите тоа погрешно.

Еден од заедничките undos се случува кога ќе се посветите премногу рано и можеби заборавете да додадете некои датотеки, или ќе ја расипате вашата порака за извршување. Ако сакате да го повторите тоа извршување, направете дополнителни промени што ги заборавивте, да ги изведите и повторно да ги извршите со помош на опцијата --amend:

$ git commit --amend

Оваа команда ја зема вашата област на поставување и ја користи за извршување. Ако не сте направиле никакви промени од последното извршување (на пример, ја извршите оваа команда веднаш по претходното извршување), тогаш вашето слика ќе изгледа сосема иста, а сите што ќе ги смените е вашата порака за извршување.

Истиот уредувач на порака-порака се активира, но веќе ја содржи пораката од претходното извршено. Можете да ја уредите пораката исто како и секогаш, но таа го пребрише вашето претходно извршено.

Како пример, ако извршите и потоа сфатите дека сте заборавиле да ги измените промените во датотеката што сакавте да ја додадете во оваа залог, можете да направите нешто слично:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

Вие завршувате со една посветеност - второто извршување ги заменува резултатите од првото.

Важно е да се разбере дека кога ќе ја промените вашата последна посветеност, вие не го решавате тоа како replacing целосно со нова, подобрена обврска која го турка старото извршување од патот и го става новото извршување на свое место. Ефективно, тоа е како ако претходната заложба никогаш не се случила и нема да се појави во историјата на вашето складиште.

Очигледна вредност на амандман се обврзува да направи помали подобрувања на вашата последна заложба, без да ја препречувате историјата на складиштето со пораките за извршување на формуларот, "Упс, заборавив да додадам датотека" или "Дарн", фиксирање на грешка во последното извршување ''.

Расклопување на изведена датотека

Следните два дела демонстрираат како да работите со вашата област на поставување и промените на работниот директориум. Убавиот дел е тоа што командата што ја користите за да ја одредите состојбата на овие две области, исто така, потсетува како да ги вратите промените во нив. На пример, да речеме дека сте смениле две датотеки и сакате да ги извршите како две одделни промени, но случајно ќе напишете git add * и ќе ги прикажете и двете. Како можеш да однесеш некоја од двете? Командата git status ве потсетува:

$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
    modified:   CONTRIBUTING.md

Веднаш под текстот "Changes to be committed", се вели дека употребува git reset HEAD <датотека> ... за да не се прикаже. Значи, ајде да го искористиме тој совет за да ја исклучиме датотеката CONTRIBUTING.md:

$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M	CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Командата е малку чудна, но работи. Датотеката CONTRIBUTING.md е модифицирана, но уште еднаш не е инсталирана.

Точно е дека git reset може да биде опасна команда, особено ако го дадете знакот` --hard`. Меѓутоа, во сценариото опишано погоре, датотеката во вашиот работен директориум не е допрена, па затоа е релативно безбедна.

Засега оваа магична повик е се што треба да знаете за командата git reset. Ние ќе одиме во многу повеќе детали за тоа што "reset" прави и како да го совладате за да направите навистина интересни работи во << _git_reset >>.

Немодифицирање на модифицирана датотека

Што ако сфатите дека не сакате да ги задржите вашите промени во датотеката CONTRIBUTING.md? Како можете лесно да го немодифицирате - вратете го назад кон она што изгледаше како последен пат (или првично клониран, или пак да го внесете во вашиот работен директориум)? За среќа, git status ви кажува како да го направите тоа, исто така. Во последниот пример излез, неизградената област изгледа вака:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Тоа ви кажува прилично експлицитно како да ги отфрлите промените што сте ги направиле. Ајде да направиме што вели:

$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Можете да видите дека промените се вратени.

Важно е да се разбере дека git checkout - <file> е опасна команда. Сите промени што ги направивте во таа датотека ги нема - Git едноставно копираше друга датотека над неа. Никогаш не користете ја оваа команда, освен ако апсолутно знаете дека не сакате датотеката.

Ако сакате да ги задржите промените што сте ги направиле во таа датотека, но сепак треба да го извадиме од патот за сега, ќе преминеме преку растурање и разгранување во Гранење во Git; овие се генерално подобри начини да се оди.

Запомнете, нешто што е committed во Git речиси секогаш може да се обнови. Дури и се обврзува дека се наоѓаат на филијали кои беа избришани или се обврзуваа дека се презапишани со --endend, може да се обнови (види Data Recovery за наплата на податоци). Сепак, сè што ќе го изгубиш што никогаш не беше посветено, веројатно никогаш нема да се види повторно.