Нужно работать в командной строке
А как в командной строке создать бранч в гите?
В очередной раз я слышу, как начинающие программисты совещаются о том, как сделать что-то с гитом в командной строке. Это было бы нормально, если бы это был их второй день работы. Но это продолжается из месяца в месяц, а для чуть более сложных действий — из года в год.
Когда я говорю, ребят, просто используйте самый лучший GUI git клиент (кстати он бесплатный для некоммерческого использования)
, все как один отвечают, что хотят делать это именно через консоль.
— Почему?
— Потому что через консоль это круто.
— Что это даёт?
— Знания.
— Которые позволят делать что?
— Работать из консоли с гитом.
— … Ну так и что это даст? Зачем это?
— Ну, мне это интересно.
— … Окей, так всё-таки зачем это делать на работе, польза-то от этого какая-то есть?
— Ну вот придёшь ты на собеседование, спросят тебя как в командной строке с гитом что-то сделать, я думаю будет полезно мочь ответить.
— …
Необходимо понимать, что когда человека берут на работу, ему собираются платить не чтобы он умел что-то делать из консоли. Зарплату платят за то, что поставленные перед работником задачи оказываются выполнены. Каким именно способом они выполнены, особенно если это качественный профессиональный способ, любого мало-мальски нормального начальника не волнует. На то он и начальник, чтобы думать о задачах, а не о способах их решения.
Таким образом, на собеседовании будут вопросы не "назови команду в консоли"
, а вопросы на общее понимание работы с гитом, какие воркфловы существуют, что делать можно, что нельзя. Как именно гит работает. Если это понимание есть, совершенно неважно, каким образом работа будет сделана хорошо.
Причём я скажу больше: СмартГит (хороший гуи клиент) позволит вам делать те же самые вещи намного быстрее. А в некоторых моментах, количество переходит в качество, и смартгит даст вам такие возможности, которых вы объективно не имели в командной строке. (сделать это можно и в командной строке, но настолько сложно и медленно, что человек не станет этого делать)
Это как копать землю сапёрной лопаткой, и экскаватором. Обоими инструментами можно выкопать яму. Но мало того, что лопаткой это делать намного сложнее и дольше. Так ещё некоторые задачи оказываются просто невыполнимы. Глубокий колодец лопаткой выкопать не получится в принципе, его слишком быстро заполнит вода. Более мощный инструмент позволяет достигать принципиально новых высот глубин.
Учитывая и понимая это, становится очевидно, что не используя GUI клиент, вы не только ограничиваете свои возможности и эффективность, но и «обкрадываете» работодателя. Ведь в консоли вы делаете лишнюю работу, дольше, менее эффективно, плюс значительно увеличиваете вероятность совершения ошибки.
Но ведь какие-то минусы у GUI клиента есть? Чем-то ведь командная строка лучше?
Я могу привести только два примера, где командная строка лучше.
1. Клонирование репозитория. Пока локальной папки вообще нет, через GUI клиент нужно много куда тыкать. Через командную строку же можно просто написать git clone <вставить-сюда-ссылку-из-битбакета>
, Enter
, готово. Это просто намного быстрее и удобнее, ведь я уже в нужной папке в Тотал Коммандере. А вот когда папка уже создана, находясь в ней мне достаточно написать g
, Enter
. И GUI клиент окажется открыт в этом репозитории. %PATH%, g.bat: start "" "C:\Program Files (x86)\SmartGit\bin\smartgit64.exe" --open "%cd%"
2. Работа с ОГРОМНЫМИ репозиториями, если при этом одновременно изменять очень много файлов. У меня есть репозиторий, в котором 100 000 файлов. Когда я массово заменил какую-то строку в них, и SmartGit пытается все эти изменения просчитать и отобразить, всё это дело работает очень медленно. Ну то есть реально медленно. Здесь мне на помощь неожиданно пришла командная строка. git add
, git commit
. Всё настолько быстро, что я прямо поверил Линусу, типа он сделал git для работы с огромным количеством файлов исходного кода. Действительно, очень круто. Однако в случаях, когда ваша разработка не выглядит как изменение 100 000 файлов одновременно перед коммитом, такой способ не потребуется.
Вернёмся к работе в командной строке и приведённому диалогу. Это очень важный и принципиальный момент. Всегда важно знать, что ты хочешь. Важно понимать, что именно хочешь получить, как это должно выглядеть. Когда это понимание есть, осталось всего лишь выбрать дорогу к этому, и идти по ней. Периодически по пути подправляя направление, зигзагами, как парусные корабли.
Ничего сложного. Когда знаешь, в чём и где твоя цель. Что это за точка b.
А вот когда не знаешь, получается всякая фигня. Вроде что-то делаешь, а результата нет. Так откуда ж ему взяться, если вы сами не знаете, какой он должен быть. Разве что дикое везение, «о, я приплыл в точку b. Видимо именно её я и искал! Нифига себе!»
Только в этом случае вам стоит вспомнить математику парадокса монти холла. (реально, почитайте и попытайтесь его решить и ПОНЯТЬ; у меня на это понимание ушёл не один день, и можно сказать это понимание перевернуло мои взгляды на мир)
Слишком вкратце, если среди множества вариантов только один правильный (неправильных - большинство)
, то вероятность что вам повезло и вы выбрали именно его — очень низкая. Нельзя рассчитывать на везение.
Когда вы что-то делаете, отдавайте себе отчёт, ЗАЧЕМ вы это делаете.
Нужно работать в командной строке? Нет. Нужно просто работать. Делать.
Обсуждение
Работа с git без GUI, позволяет выполнять операции, не отвлекаясь на поиски нужных кнопок в интерфейсе, не боясь мискликов и т.п.
Ты точно знаешь, что именно произойдёт после той или иной команды. В интерфейсе всё не так однозначно. Какая-нибудь кнопка update может означать всё что угодно(fetch/merge, fetch/rebase, например). При том, что эти gui-клиенты каждые полгода меняются, исчезают, появляются новые…
Вот в mercurial tortoise-hg достаточно хорош в UX, чтобы использовать его 80% процентов времени. Но даже это не значит, что не нужно знать как всё сделать без окошек.
К тому же, не всегда в окружении вообще присутствует оконный менеджер. Поэтому навык работы без GUI быть обязан.
Здравствуйте, Александр.
Я бы ни в коем случае не сказал, что у tortoise-(svn/hg/git) хороший интерфейс. Он как правило лучше, чем командная строка, но сколько себя помню — всегда мучился с ним считайте столько же, сколько и с командной строкой.
А вот SmartSVN -> SmartGit/HG -> SmartGit (это они так эволюционировали) всегда не оставлял ни одному оппоненту шансов. А я реально много чего пробовал. И сторонние программы для diff тоже пробовал, и платные, и бесплатные — всё равно самая лучшая у смартгита. Была ещё одна неплохая, названия не вспомню, но ничем не лучше.
Большой плюс SmartGit’а в том, что всё, что он делает, он в маленьком окошечке прописывает какую реальную консольную команду в данный момент исполняет, поэтому понять, что конкретно он делает на какое нажатие кнопки — не составляет труда. Но даже это не нужно — ведь есть всего 4 кнопки, pull, sync, push, commit. Коммит коммитит. Пулл при первом использовании спрашивает, что я хочу. Я хочу fast-forward rebase. Можно в любой момент нажать pull more… и поставить галочку fetch only, но это на словах звучит сложнее, чем выглядит на самом деле, не буду об этом. Push пушит, точно так же можно выбрать, что я хочу. Можно даже force push, для перезаписи удалённой истории. Sync опять же как захочу — или push,pull или pull,push.
Та стена текста, которую я написал выше — она важна для того, кто что-то понимает в гите и ему важно, что конкретно сейчас происходит. На самом деле это можно даже не понимать, настройки по умолчанию установлены так, что испортить что-либо крайне сложно. Например force push надо в настройках разрешить, иначе будет объяснять, что я пытаюсь сделать что-то страшное, что скорее всего мне это не надо.
Если ещё короче, то есть 2 кнопки. Commit и sync. Хочу взять удалённые изменения? Синк. Закоммитил и хочу отправить его на удалённый сервер? Синк. Всё синк. Этого воркфлоу хватит 95% начинающих разработчиков.
Если работаешь в команде, то вот, в несколько кликов https://dima.stefantsov.com/git/ очень классный воркфлоу с фиче веткой и мерджами. Реально в пару кликов. Самое важное, что это всё не нужно знать или изучать. Там все названия вменяемые, тыкаешь, смотришь что пишет программа, понимаешь, надо ли оно тебе. Гит и командную строку знать не обязательно :)
Этим клиентом я пользуюсь уже около 8 лет, пока он не собирается исчезать.
«Но даже это не значит, что не нужно знать как всё сделать без окошек.»
А зачем? Зачем? Надо знать не команды. А правильный воркфлоу. Чтобы обновить ветку до хеда мастера, НЕ МЕРДЖИТЬ В ВЕТКУ ИЗМЕНЕНИЯ МАСТЕРА!!!
(я своим сказал так не делать, они на меня махнули рукой, у них несколько месяцев опыта, им виднее; правда так у них конфликты каждый раз на много часов резолва+ошибки резолвов, ведь в ветке числятся изменения файлов, которые на самом деле в рамках этой ветки не изменялись, шансы на конфликты увеличиваются в десятки раз)
, а ребейзить всю ветку в хед мастера. И так далее.Очень странное вы себе выбираете окружение для работы, где у вас нет оконного менеджера. Зачем вы там работаете? Чтобы потратить полчаса на то, что с интерфейсом и хоткеями, с грамотной подсветкой и тулзами делается за несколько минут? И это ещё хорошо если полчаса, см. пример выше про лопатку и экскаватор.
На самом деле, смотря кем вы работаете. Если вы хакер, и вам надо вторгнувшись в систему срочно во всём сориентироваться, все репозитории поклонировать, потом хитрым образом их поломать, чтобы напакостить жертве, тогда возможно я смогу понять ваш пример. А если вы работаете, потратьте несколько дней раз в 5 лет на настройку среды, и ваша производительность будет выше в разы.
На этом месте фанат командной строки со мной не согласится. Просто. Не согласится. И всё тут.
На что я привычно предложу провести эксперимент. Мы или сторонний наблюдатель придумает задания, рутинные и не очень. И мы будем на скорость выполнять их. Я со своей мышкой и виндоусом. Вы — как хотите, хоть азбукой морзе. И просто сравним, кто быстрее.
Пока я ни разу не проигрывал. Всегда был полный разгром. Прекрасно, когда есть возможность не спорить, а проверить.
С нетерпением жду, когда же я наконец проиграю, чтобы после этого иметь возможность научиться чему-то, чего я пока что не знал. А пока я видел только неопытных людей, которые насмотрелись фильмов про хакеров. Командная строка — это инструмент. Когда она нужна — я её использую. Например, я говорил выше, git clone ssh@qwe я делаю там, fping ya.ru -t0 -c я делаю там, ipconfig или ipconfig /all я делаю там, nslookup sitename.com 8.8.8.8 там, tracert -d hostname я делаю там, и так далее. Командная строка — это хорошо. Но не для того, что лучше делать в интерфейсе.
Кстати. Вот трасерт я делаю в командной строке, хотя когда плотнее занимался сетью, для этого у меня была GUI тулза, которая все хопы показывает в реальном времени, со статистикой. Намного мощнее консольной. Просто сейчас я не работаю как сетевой профессионал, мне не нужен такой мощный инструмент. Может быть дело в этом. Я профессиональный разработчик, работаю с кодом, поэтому мне нужен мощный инструмент. А тому, что раз в полгода надо изменить файлик wp-config.php и закоммитить его обратно в гит, действительно командной строки будет достаточно, дольше инструмент устанавливать.