Как да намерите неща в Git

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

Винаги ви казват, че страхотното нещо за Git е, че вие ​​[почти] никога не губите история. И така, как да получите достъп и да използвате тази история?

Хей, Гит. Кой беше последният човек, който промени този файл?

git log foo.c

Какво промениха?

git log --patch foo.c

Като алтернатива, използвайте git show заедно с хеш на фиксиране.

git show 

Хей, Гит. Можете ли да ми покажете кой промени този файл, ред по ред?

git обвинява foo.c

Хей, Гит. Кога беше въведена тази грешка?

..когато знаете реда на кода, който е лош

Използвайте „Pickaxe“ на Git като археолог с кодове, за да търсите в комитите, докато не откриете кога е въведен даден низ.

git log -S „Лош ред на код“

..когато не сте сигурни какво причинява грешката

Когато не знаете кой компромис е въвел грешката, използвайте git bisect, за да намерите бързо лоша фиксация чрез двоичен алгоритъм за търсене.

git bisect start
git bisect лоша Глава
git bisect good 

Сега bisect ще избере ангажимент в средата на този диапазон и ще го провери вместо вас. Упражнете кода и проверете дали грешката все още съществува или не. Ако грешката не присъства в този ангажимент, въведете:

git bisect добро

Ако кодът все още е разбит, въведете:

git bisect лошо

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

След като сте намерили грешката, почистете и се върнете към оригиналната Глава.

git bisect нулиране

Напълно автоматизиран Git бисект

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

git bisect start HEAD  run ./build_script.sh

Отиди да пием кафе. Когато се върнете, ще знаете кой ангажимент е въвел тази грешка.

Хей, Гит. Как да проверя версията на този файл от преди две седмици?

Значи всички промени в foo.c през последните две седмици бяха чисти боклуци, а? Или просто искате да играете с по-стара версия на кода.

Първо намерете коя версия на файла, който искате да проверите

Това ще ви покаже всички ангажименти, променили foo.c през последните две седмици, започвайки с най-стария ангажимент.

git log --since = two.weeks.ago - реверс - foo.c

Забележете двойното тире. Това казва на Git, че не трябва да очаква повече превключвания. Следващият аргумент ще бъде име на файл.

Проверете версия на файла от друг ангажимент

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

git checkout  foo.c

Можете да използвате същия модел, за да заредите всеки файл от всеки ангажимент. Например, вие сте направили промяна в foo.c в друг клон и бихте искали същите промени във вашия текущ клон.

git checkout SomeOtherBranch foo.c

Ако не искате да проверите файла, а просто искате да видите файл в друг клон.

git show SomeOtherBranch: foo.c

Хей, Гит. Кой е извършил най-много пъти в цялото репо?

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

git shortlog -s -n

Хей, Гит. Има ли foo.c в това хранилище?

git ls-files foo.c

git ls-files също разбира глобиране на файлове:

git ls-files * .c

Хей, Гит. Има ли файл, съдържащ „foo bar“?

git grep „foo bar“

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

git grep -i - headhead - line-number „foo bar“

Хей, Гит. Покажете ми всички ангажименти на Cueball

git log --author = cueball

Хей, Гит. Покажете ми ангажиментите от определен период от време

git log --after = "1 април 2016" --before = "30 април 2016"

Хей, Гит. Покажете ми комитите, където са променени определени редове във файл

git log -L 1,1: foo.c

Покажете ми, когато определен метод в клас беше променен.

git log -L: bar: foo.c

Хей, Гит. По какво се различава моят клон от главния?

git diff master ..

Или..

git череша -v

Показвайте само имената на файловете, които са се променили

git diff - майстор само за име ..

Хей Гит. Как мога да визуализирам своите ангажименти и клонове?

git log --oneline --graph --all - abbrev-commit

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

(Първоначално се появява на tygertec.com)