Git. Краткое руководство по терминалу
Данное краткое руководство демонстрирует основные команды в терминале Bash:
- Bash (Linux/Mac)
- Git Bash (Windows)
Открытие терминала
Первая задача: открыть терминал сразу в нужном каталоге.
Linux
В Linux достаточно щёлкнуть правой кнопкой мыши на каталоге и выбрать пункт меню Open in Terminal или Открыть в терминале :
Mac
В Mac всё немного сложнее, необходимо настроить отображение этого пункта меню в Finder.
Для этого необходимо перейти в Системные настройки , затем пункт меню Клавиатура , в разделе Службы выбрать раздел Файлы и папки и поставить флажок напротив Новый терминал по адресу папки :
После чего при клике правой кнопкой мыши на каталоге появится необходимый пункт меню:
Windows (Git Bash)
В Windows всё достаточно просто — клик правой кнопкой мыши на каталоге и выбор Git Bash Here :
Первоначальная настройка Git
После установки Git первое, что мы сделаем — укажем наши имя и адрес электронной почты. Это важно, потому как этой информацией подписывается каждый коммит (кто сделал изменения и его электронная почта). Для настройки потребуется ввести команды:
$ git config --global user.name "Thorin Oakenshield" $ git config --global user.email ereborsons@stone.com
Если указана опция —global , настройки применятся глобально, то есть для всех ваших действий в системе Git. Без этой опции настройки применяются локально, для текущего репозитория, и не влияют на глобальные настройки.
Пути
Одно окно терминала подразумевает, что вы можете в один момент времени находиться только в одном каталоге, который называется Current Working Directory (текущий каталог), так же как и в одном открытом окне Nautilus , Finder или проводника Windows.
Вы можете выполнять команды относительно текущего каталога или относительно абсолютного пути.
Абсолютный путь — это путь, начинающийся от корня файловой системы. Корень файловой системы обозначается символом / .
Например, в Git Bash (Windows) абсолютный путь для каталога Program Files , будет чаще всего выглядеть следующим образом: /c/Program Files/ .
Для домашнего каталога в Ubuntu (Linux), абсолютный путь будет выглядеть следующим образом: /home/user/ , где user — имя пользователя.
Bash (Git Bash в том числе) используют символ / для разделения каталогов.
Ещё два специальных обозначения помимо корня файловой системы:
- . — обозначает текущий каталог;
- .. — обозначает родительский каталог.
Важно: в терминале символ ` ` (пробел) является символом, разделяющим команды и опции. Поэтому если в пути есть пробел, то варианта два:
- заключать путь в кавычки, то есть «Program Files» ;
- использовать символ backslash для экранирования пробела: Program\ Files .
Переменные окружения
Командная оболочка устанавливает ряд переменных, которые выполняют специфические функции. Так, переменная с именем PATH содержит список путей, в которых будет производиться поиск программы, если вы наберёте её название в терминале.
Для вывода содержимого конкретной переменной используется команда echo следующим образом:
$ echo $PATH
Команда printenv позволяет отобразить все переменные окружения:
$ printenv
Видно, что в переменных окружения содержится достаточно много информации о системе.
Автодополнение
В командных оболочках работает автодополнение по клавише Tab :
- дополняются имена команд;
- дополняются пути.
Используйте автодополнение, так как оно позволяет сократить время на набор команды.
Ключевые команды
В этом разделе будут описаны ключевые команды, необходимые нам для работы. Естественно, список этот далеко не полный.
Текущий рабочий каталог
pwd — сокращение от “Print Working Directory”.
Отображение текущего рабочего каталога:
Смена рабочего каталога
cd — сокращение от “Change Directory”.
Переход в определённый каталог:
path может быть как абсолютным, так и относительным путём.
Например, перейти на каталог выше:
Перейти в подкаталог src :
$ cd src
Если перед путём нет слеша — он трактуется как относительный (относительно текущего каталога).
Листинг каталога
ls — сокращение от “List”.
Отображает листинг (содержимое каталога):
По умолчанию, ls не отображает файлы, начинающиеся с . , например, .gitignore . Для отображения таких файлов нужно использовать флаг -a :
$ ls -a
Создание файлов
Для создания файлов используются специальные программы (например, для создания текстовых файлов — текстовые редакторы).
В рамках рассмотрения Bash мы рассмотрим два текстовых редактора, которые позволят вам создавать и редактировать файлы в псевдографическом режиме.
nano
nano — простой текстовый редактор.
Для того, чтобы создать файл достаточно ввести команду nano и имя файла:
$ nano README.md
Откроется редактор следующего вида:
Пункты меню в нижней части вызываются с помощью горячих клавиш, где символ ^ обозначает клавишу Ctrl .
То есть чтобы записать файл и выйти следует последовательно нажать Ctrl + O (запись) и Ctrl + X (выход).
Редактор nano установлен в большинстве Unix-подобных операционных системах и Git Bash.
Vim
Редактор Vim (a programmer’s text editor) — профессиональный редактор, позволяющий достичь максимальной производительности при работе с любыми текстовыми файлами. Настолько популярен, что для любой графической среды (IDE, текстовых редакторов вроде VS Code, Atom, Sublime) всегда есть плагин, включающий возможность редактирования кода в режиме “Vim Mode”.
На освоение работы в Vim нужно потратить достаточно много времени, для этого вы можете воспользоваться интерактивным учебником vimtutor :
$ vimtutor
Мы лишь скажем, что для выхода из этого редактора (если вы всё-таки осмелились его открыть) нужно нажать клавишу Esc , затем ввести команду :q! — это позволит вам закрыть открытый файл без сохранения изменений.
VS Code
В видео-лекциях используется VS Code. В Windows вы можете правой кнопкой открыть каталог сразу в VS Code.
В Mac OS и Linux вы можете открыть терминал по адресу папки и в терминале выполнить команду code . & , которая откроет выбранный вами каталог в этом редакторе.
Если ни то, ни другое у вас не получилось, то просто откройте VS Code и через File — Open откройте нужный каталог.
Создание каталогов
mkdir — сокращения от “Make Directory”.
Позволяет создавать каталоги (создаст каталог tmp в текущем каталоге):
$ mkdir tmp
Стоит обратить внимание на поведение при создании нового каталога в текущей директории. После команды mkdir name ваше текущее расположение в терминале не изменится. Для того, чтобы работать внутри созданного каталога, в него требуется перейти командой cd name . Это справедливо и при клонировании удалённого репозитория с помощью команды git clone . Полностью склонированный репозиторий создаст каталог в текущей директории с именем проекта, в который нужно перейти командой cd repo_name .
Перемещение файлов и каталогов
mv — сокращение от “Move”.
Перемещение (переименование) файлов и каталогов:
$ mv tmp temp
Удаление файлов и каталогов
rm — сокращение от “Remove”.
Команда для открытия файла с помощью git
какая команда открыть say index.html или style.css внутри каталога проекта?
в основном, когда я работаю над проектом, я хотел бы иметь возможность открыть файл из git. Как это сделать. Каждый учебник, похоже, проходит мимо слияние, клонирование, фиксация да мы все это знаем, как сделать эту простую команду. Или это невозможно изнутри git?
- ОС Windows 7
- msysgit версии 1.8.0
Я понимаю, что git не является пусковой установкой и строго для контроля версий. Просто хочу знать, какие варианты у меня есть инструменты под рукой.
вопрос возник, когда я совершал проект и понял, что мне нужно сделать небольшое редактирование файла css я уже закрыл и задавался вопросом, Могу ли я открыть, чтобы отредактировать файл изнутри git, так как он у меня есть.
кажется, это невозможно (не конец света) мне просто нравится понимать все мои варианты с помощью инструментов, которые я использую, это все
автор: Flimzy
12 ответов
Git не имеет ничего общего с тем, как вы открываете/редактируете файлы в своем проекте. Настройка редактора в git только для того, чтобы внутренние вещи git, которые требуют редактора (например, сообщения фиксации), могли использовать предпочтительный редактор.
Если вы просто хотите открыть файлы из командной строки (cmd.exe) как будто они были дважды щелкнуты в проводнике windows, я думаю, вы можете использовать start .
автор: Brenton Alker
я смог сделать это, используя эту команду:
notepad .gitignore
и он откроет .файл gitignore в блокноте.
автор: Nick Young
Я нашел обходной путь для этого через этот ссылке. В двух словах, вы должны:
- создайте файл с именем subl (или любое имя, которое вы хотите, чтобы команда вызов Sublime Text) без расширения
- поместите в файл эту команду (при необходимости замените путь для исполняемого файла):
#!/bin/sh "C:\Program Files\Sublime Text 2\sublime_text.exe" &
C:\Program Files (x86)\Git\usr\bin
subl filename
автор: arbolitoloco
Брентон Алкер выше сказал, что «пуск» работает — я добавлю к этому предостережение: это работает для всех файлов, которые уже связаны с sublime-text (как он говорит, это работает, как если бы они были дважды щелкнуты в проводнике windows).
но если, например, вы хотели открыть .файл gitignore из вашей оболочки в sublime_text и .gitignore не связан с sublime_text, вот что я сделал:
я отредактировал переменную среды PATH, чтобы содержать папку Sublime Text в программе файлов, владеет sublime_text.исполняемый. Теперь, в моем терминале (я использую powershell, но он работает с любого терминала), когда я набираю ‘sublime_text .гитюдного’ на .gitignore из моего текущего каталога открывается в Sublime!
Я попытался сделать .файл bat называется sublime.bat, который будет работать, чтобы я мог просто напечатать sublime .gitignore, но это не сработало — по какой-то причине он открыл sublime text, но не файл. Я доволен sublime_text (завершение вкладки упрощает его для я, на самом деле-просто «su[tab]» делает трюк!
автор: TKoL
просто использовать vi + .
vi stylesheet.css
откроется редактор vi с содержимым файла.
начать редактирование, нажмите клавишу I
автор: Asopiah
пока вы работаете в каком-то проекте, и вы хотите внести незначительные изменения, вы можете использовать редактор по умолчанию git, однако вам, вероятно, понадобится небольшой скрипт, который анализирует файл, созданный командой ниже
git config -l
переменная code.editor имеет значение /Applications/Sublime_Text.app -n -w
который вы можете открыть с помощью os.system()
автор: Ciasto piekarz
Я только что загрузил Git 2.7.0 и добавил псевдоним .bashrc для редактирования файлов с кодом VS:
alias code='/c/Program\ Files\ \(x86\)/Microsoft\ VS\ Code/bin/code.cmd'
также должен работать с другими редакторами.
автор: stehuebn
Я использовал Atom, чтобы открыть файлы, это работает для меня
atom index.html
надеюсь, это поможет.
автор: dstineback
вы можете использовать командную строку git в качестве терминала мой чувак, вы просто знаете, что команды bash Чтобы создать файл
touch file.txt
code file.py atom file.py start file.py
открыть текущую папку и все внутри в текстовом редакторе
code .
mkdir folder1 folder2 folder3
вы можете сделать столько, сколько вы хотите сразу это работает с touch to
автор: Nick Lesseos
вы можете создать псевдоним для открытия файла в Редакторе по умолчанию, добавив следующую строку в ваш .файл gitconfig хранит настройки:
edit = "!f() < $(git config core.editor) -- $@; >; f"
затем, git edit foo.txt открыть файл foo.txt для редактирования.
его гораздо легче открыть .gitconfig хранит настройки с git config —global —edit и вставьте строку, а не выяснить, как избежать всех символов, чтобы ввести псевдоним непосредственно из командной строки с git config alias.edit «. «
как это работает
- ! запускает команду bash, а не внутреннюю команду git
- f() ; запускает функцию
- $(git config core.editor) получит имя вашего редактора, из локальной конфигурации или глобального, если локальный не установлен. К сожалению, он не будет смотреть в $VISUAL или $EDITOR для этого, если ни один не устанавливается.
- — разделяет команду редактора со списком файлов. Это работает для большинства редакторов командной строки, поэтому безопаснее вставлять. Если пропустили и то core.editor не установлен, то это возможно, что исполняемый файл выполняется вместо редактирования. С ним здесь, команда просто провалится.
- $@ добавить файлы, введенные в командной строке.
- f выполнит функцию после того, как она будет определена.
пример использования
другие ответы выражают сомнение в том, почему вы этого хотите. Мой вариант использования заключается в том, что я хочу редактировать файлы как часть других функций git, которые я создаю, и я хочу редактировать их в том же редакторе, который пользователь настроил. Например, одним из моих псевдонимов является следующее:
reedit = "!f() < $(git config core.editor) -- $(git diff --name-only ); >; f"
затем, git reedit откроет все файлы, которые я уже начал изменять, и git reedit —cached откроет все промежуточные файлы.
автор: eedrah
возможно, было бы полезно открыть редактор из сценария, совместно используемого в репозитории git, не предполагая, какой редактор может использовать этот скрипт, но только то, что у них есть git.
здесь вы можете проверить, установлен ли редактор в git config, а также открыть файлы, не связанные с этим редактором:
alias editor="$(git config core.editor)" if [ "$(alias editor | sed -r "s/.*='(.*)'//")" != "" ]; then editor else start fi
не работает .gitconfig на windows:
[core] editor = 'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin
автор: Hazzard17
чтобы открыть файл в Sublime Text,
вот пример открытия образца текстового файла в Sublime Text editor
subl .txt
subl ранее создавался как псевдоним, содержащий файл каталога, с помощью команды «echo»в оболочке Git Bash.
Открыть в редакторе по умолчанию (из Git Bash)
как в Git Bash, установленном в windows, открыть файл (.txt) в редакторе по умолчанию?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Git Bash — $PATH
Доброго времени суток Опишу всё максимально подробно.. Лежит в директории D:\App\php-7.2.3-nts.
Обновление PHP (Git Bash — $PATH)
Доброго времени суток Опишу всё максимально подробно.. Лежит в директории D:\App\php-7.2.3-nts.
Command not found при запуске git bash
Здравствуйте! Извините, если может быть не в том разделе создаю эту тему. У меня такая проблема.
Как открыть Gemfile в Notepad++ через Git?
Как открыть Gemfile в Notepad++ через Git?
8397 / 3153 / 106
Регистрация: 24.05.2011
Сообщений: 14,308
Записей в блоге: 8
Вообще, для bash необходимо указывать, какое приложение использовать для обработки объекта, передаваемого ему в качестве аргумента. Общая логика та же самая, как и в winbatch:
команда [-ключ(и)] аргумент1 аргумент2 [--опция(ии)]
Конкретно bash в PowerShell я не использовал, посему ручаться за правильное поведение команд bash в этой среде не могу.
Git Bash вообще, честно, даже не видел.
Но вы попробуйте — хуже ж не должно быть!
Что ж ты нашу команду покинул, Dragokas? Грустно без тебя.
18072 / 7675 / 891
Регистрация: 25.12.2011
Сообщений: 11,448
Записей в блоге: 17
Спасибо. Дык, в том и дело что редактор может быть любой, т.е. указывать полный путь — не вариант.
А вообще, я пока решил задачу иначе. У меня скрипт .sh запускается из-под батника, так что я дефолтовый редактор запускаю виндовой командой start.
Просто, думал что это можно легко сделать и на bash, но я так понимаю bash не приспособлен видеть окружение винды, всё-таки linux-овая команда ещё и под эмулятором Git-a, т.е. я так понимаю, если бы он и запустил редактор, то только родной.
Переместили в тему win10. Символично, с учётом, что я её недавно убил =).
8397 / 3153 / 106
Регистрация: 24.05.2011
Сообщений: 14,308
Записей в блоге: 8
Сообщение от Dragokas
если бы он и запустил редактор, то только родной
«Родного» у баша редактора, как такового, нет. Этот параметр задаётся переменными используемого DE.
С натяжкой «родным» можно назвать vi (или vim), т.к. он обычно устанавливается в любой системе. У вас может быть установлен ed или вообще emacs. В семействе дебианообразных так же обычно имеется nano, но этот у вас наверняка не запустится, ибо в системе у вас его нет. А вот попробуйте vim или ed — оно, глядишь, и сработает.
Только вот работать в vim не столь привычно, как в том же nano или notepad. А вот, а если бы у вас был emacs, вы бы наверняка не задавали сей вопрос.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Открыть содержимое Memo в редакторе кода Pascal
help me. как сделать чтобы текст находящийся в memo после нажатия на кнопку.
Открыть ссылку в браузере по умолчанию
Нужно открыть ссылку в браузере по умолчанию средствами c++/qt. Как?
Открыть файл программой по умолчанию
Здравствуйте, у меня странный вопрос — как можно организовать открытие файла по нажатию на кнопку.
Учимся работать с GIT проще некуда
В моей молодости 90-х годов для совместной разработки кода приходилось хранить файлы на каком-то сетевом диске и договариваться с коллегами, кто и что изменяет, чтобы не мешать друг другу.
Потом появились системы, которые контролировали доступ к файлам. Они просто делали все файлы по умолчанию только для чтения, и чтобы внести изменения программисты должны были помечать целый файл как занятый под себя и изменять его. Во время установки этой пометки файл реально копировался локально программисту и помечался в системе как занятый. Программист мог менять файл и потом забрасывать его обратно на сервер. Этот подход работал неплохо для пары человек, но для большого проекта с большим количеством программистов он превращался в кошмар. У меня на сайте в разделе статей до сих пор есть уроки по работе с VSS от 2009-го года, я храню их на память.
И вот Линус Торвальдс создает систему управления кодом git. Где-то я слышал, что Линус не очень хорошо умеет общаться с людьми и git был создан как раз для того, чтобы сократить коммуникации с людьми до минимума. Не знаю, правда это или нет, но результат все же впечатляющий.
Cамое главное отличие git состоит в том, что для внесения изменения в код не нужно блокировать файл. Вы делаете изменения, и система просто запоминает именно изменения. Потом, когда код сливается с другим кодом, изменения накладываются на основной код.
Установка
Итак, давайте знакомиться с git. Я все примеры буду выполнять в терминале на macOS, в Windows все работает абсолютно также. Заходим на сайт https://git-scm.com/downloads и здесь есть возможность скачать GIT для Windows, Linux или macOS.
Установка в Windows банальна – для этой ОС существует удобный и красивый мастер установки, в котором можно выбирать все по умолчанию, главное убедитесь, что установлена интеграция с PowerShell. После установки у вас появится выбор – работать в командной строке git bash или PowerShell. Если вы работаете в Windows, то я подозреваю, что второй будет для вас более привычным.
После завершения установки в проводнике можно будет кликнуть правой кнопкой мыши на любой папке и там должен быть пункт меню Git Bash Here, который запустит Bash терминал для работы с git:
В Windows я чаще работаю с PowerShell. Просто запустите его, создайте где-нибудь пустую папку для тестов и в ней выполняйте команды, которые мы будем рассматривать дальше. Обязательно практикуйтесь.
В Linux и macOS установка выполняется из командной строки. В Linux у меня ни разу проблем не было, а вот в macOS была, поэтому рассмотрим установку на маке.
Если у вас еще не установлен Brew, то рекомендую сделать это. Инструкции можно найти здесь https://brew.sh/. Если вы не уверены, установлен он или нет, то запустите терминал и выполните команду:
brew –version
Если нет ошибок и вы увидели версию, то brew установлен.
Теперь выполняем команды
brew update brew install git
Здесь может произойти ошибка, если нет прав на запись в папку /usr/local/sbin. Запускать их под админа смысла особо нет, вместо этого прямо в ошибке вам должны предложить выполнить следующую команду, чтобы дать своему пользователю права на папку /usr/local/sbin.
chown -R $(whoami) /usr/local/sbin
Если ошибки не было при установке git, то у вас права наверно уже были исправлены и не нужно выполнять chown.
И напоследок установим git-gui – графические утилиты для работы с git. Он не обязателен, если вы будете работать из командной строки, но я его все же ставлю, когда нужно посмотреть на историю изменений. В Windows gui утилиты ставятся автоматически, а в macOS нужно отдельно выполнить команду:
brew install git-gui
На мой взгляд стандартные графически утилиты git ужасные с точки зрения дизайна и интерфейса, но для меня это не проблема, потому что я ими реально пользуюсь очень редко. Я буду показывать, как работать с git из командной строки, потому что я считаю это очень важным навыком. Когда вы научитесь, то можно в дополнение установить утилиты с графическим интерфейсом, с более приятным внешним видом, чем стандартные. Такие утилиты можно найти здесь https://git-scm.com/downloads/guis.
Первое, что можно сделать после установки, это указать свое имя и e-mail. Это необходимо, чтобы git мог использовать эту информацию при создании коммита. Выполните две следующие команды:
git config --global user.name mflenov git config --global user.email mikhail@flenov
только замените mflenov на свое имя и mikhail@flenov свой email. Кстати, этот email не существует, так что не пишите мне на него, я не смогу ответить. Даже если вы добавите .info или .ru, такого email все равно не будет.
Последовательность выполнения команд не важна. После выполнения первой из них, git создаст файл.gitconfig в вашей домашней директории и сохранит в нем введенную вами информацию.
Если вы работаете в macOS или Linux, то попробуйте сейчас выполнить команду:
cat $HOME/.gitconfig
В результате вы должны увидеть:
[user] email = mikhail@flenov.ru name = mflenov
Как видите email и имя просто сохранены в этом файле и вы можете менять эту информацию вручную в файле или с помощью команд выше. Конечно же использование команд более предпочтительно.
Инициализация
Итак, у нас необходимые программы установлены. Создайте новую папку, на которой мы будем тестировать команды. В этой папке для начала нужно создать репозиторий:
git init
В результате вы должны увидеть что-то типа:
Initialized empty Git repository in /Users/mikhailflenov/Projects/youtube-demo/.git/
Здесь говориться, что создан новый репозиторий GIT и нам показана папка .git. Имена папок, которые начинаются с точки по умолчанию не видны в Linux и macOS и это хорошо. В этой папке git хранит свои внутренние вещи, в которые вас очень редко нужно будет заглядывать.
Командой git init вы создали репозиторий и ствол дерева вашего проекта, который будет называться master, а по последним рекомендациям его стали называть main. Я буду продолжать использовать старое название master.
Инициализация выполняется в принципе один раз на проект, когда вы создаете что-то новое. После этого забываем про git init.
Первая команда, которую вы скорей всего будете выполнять чаще всего git status. Выполните эту команду
git status
и в результате вы должны увидеть на экране:
On branch master No commits yet nothing to commit (create/copy files and use "git add" to track)
Первая строка говорит нам о том, что мы сейчас находимся на ветке по имени master. Как я уже сказал, в будущем главную ветку скорей всего переименуют в main, уже в эту сторону идет работа.
Это главная ветка. Вторая строка говорит, что у нас еще нет никаких коммитов. Последняя строка указывает на то, что нам даже нечего добавить. Нужно создать файлы в этой папке или скопировать их откуда-нибудь.
Теперь мы подготовили почву, и чтобы можно было растить дерево нужно посадить росток – сделать первый коммит в репозиторий. Создайте какой-нибудь файл папке, где вы проинициализировали репозиторий. В macOS в терминале для этого можно выполнить простую команду
echo hallo >> readme.txt
Теперь нужно добавить этот файл к git, чтобы он знал о нем, для этого выполняем команду
git add readme.txt
git отслеживает изменения файлов, которые вы добавляете в него и позволяет сохранить (закомитить) изменения и каждый коммит сохраняется в истории git.
Первый файл добавлен, теперь нужно сделать первое сохранение:
git commit -m 'initial commit'
Здесь мы с помощью команды git commit говорим, что нужно закоммитить, или зафиксировать добавленные файлы. Ключ -m позволяет добавить сообщение/комментарий (-m). Initial commit это и есть мой комментарий к первому коммиту.
Обратите внимание на результат команды:
[master (root-commit) 3167f60] initial commit 1 file changed, 1 insertion(+) create mode 100644 readme.txt
В первой строке нам говорят, что мы создали корневой коммит (root-commit) под номером 3167f60. Номера уникальны и генерируются с помощью алгоритма sha. Таким образом git создает точки сохранения. На диаграмме веток, которую я недавно показывал, это точки #1, #2 и #3.
Во второй строке дается статистика коммита и нам говорят, что изменен один файл и в нем изменена только одна строка.
Выполните сейчас команду gitk, чтобы посмотреть на визуальное представление
Слева наверху будет дерево, пока мы видим только корневой коммит. Сверху в центре – имя пользователя, который сделал изменения. Сверху справа – время изменения.
Обратите внимание на строку, которую я подчеркнул в середине красным цветом. Это Sha1 код, который был назначен коммиту. Мы уже видели его раньше, но только первые 7 символов 3167f60. Здесь же мы можем увидеть полный код. Очень редко бывает необходимость знать полный код, обычно достаточно короткого кода, который вы видели при создании коммита.
Работа с ветками кода
Никогда не разрабатывайте новый код прямо стволе, это очень и очень плохая практика. Только самый первый коммит может быть сделан прямо в мастере, чтобы создать дерево.
У меня master установлен на сервере staging от которого мы запускаем код на рабочие сервера. Клиент на этом сервере может делать изменения в параметрах, которые хранятся в конфигурационных файлах, и программисты могут пофиксить на этом сервере мега срочные баги, но только в очень редких случаях.
На компьютерах программистов никто и никогда не открывает master с целью разработки. Я думаю, что это даже запрещено политикой компании, хотя письменного подтверждения этому нет. Все просто понимают, что разрабатывать новый код или даже фиксить баги в стволе не очень хорошая идея.
Прежде чем что-то делать, нужно создать новую ветку, куда мы будем добавлять наш код. Что такое ветка кода? Реально представьте себе дерево. У вас есть ствол, и на верхушке ствола мы создаем ответвление, в котором работаем, пишем свой код, а когда работа закончена, то объединяем содержимое ветки со стволом.
Синяя ветка – это основное дерево. Когда мы создали красную ветку, то в ней фиксируется состояние кода на момент создания ветки, то есть то, что было в левой точке пересечения синей и красной линии. Теперь мы в своей ветке можем работать над кодом и сохранять его. На рисунке я # с цифрой я показал возможные точки сохранения и их оказалось три. Когда работа закончена, мы сливаем ветку с основным деревом в точке пересечения со стрелкой справа. В этот момент изменения кода #1, #2 и #3 попадают в основную ветку и становятся доступными в master.
Даже если в голове до сих пор не сформировалась окончательная картина, надеюсь в процессе этого вы все же увидите, как работает ветвление.
Итак, первое, с чего мы должны начать – создание ветки. Для этого выполняем команду:
git checkout -b имяветки база
git checkout говорит, что мы должны переключиться на репозиторий. Ключик -b говорит, что нужно не просто переключиться, а создать новую ветку с именем имяветки. Именование веток у каждого свое. Когда я работал в консалтинге над разными проектами, то именование состояло из двух частей:
имясайта/номертикета
или если я работал над чем-то большим, то имя имело формат:
имясайте/имяпроекта
Например, когда мне нужно было исправить баг под номером 415412 для сайта wheeloffortune, то я создавал ветку с именем:
wof/415412
По левой части сразу видно, что этот фикс нужно искать в репозитории для сайта wheeloffortune и описание фикса можно найти в тикете 415412.
Если нужно было работать над новым функционалом и это целый проект по редизайну на пару месяцев для сайта sonyrewards, то я мог назвать ветку:
sr/redesign2015
Сейчас у нас в компании ветки называют по имени команды + номер тикета:
teamname/415412
Можете взять на вооружение один из этих подходов, а можете использовать простые имена без деления, главное, чтобы это было вам удобно.
После имени бренча через пробел идет база — по документации необязательный параметр — от какой ветки вы хотите создать свою. Я рекомендую всегда указывать этот параметр. Если вы не укажите базу, то в качестве нее будет выступать текущая ветка. Чаще всего ветки нужно создавать от основной master, а не от текущей. Если только вы явно не хотите создать свою ветку от какой-то другой, команда создания будет
git checkout -b имяветки origin/master
Стоп, еще немного о именовании. В данном случае я указываю origin/master и это удаленный ствол. На это указывает слово origin. Если мы создаем новую ветку fixdone/345321, то это локальная копия на нашем диске. Удаленная копия на сервере git в репозитории будет иметь имя origin/fixdone/345321. Когда мы создаем новые ветки, то желательно создавать от удаленной версии master, но у нас ее пока нет, поэтому если попытаться выполнить такую команду, то она завершиться ошибкой.
Да, я рекомендую всегда использовать в качестве базы удаленную версию origin/master, которая указывает на версию на сервере, но если ее нет, то придется использовать локальную – просто master. Мы пока создали только локальный репозиторий. Пока нет удаленного, придется использовать локальный. Как только появиться удаленный, всегда используйте его. О удаленных ветках мы поговорим в следующий раз.
Итак, пока нет удаленного мастера, давайте создадим новую ветку от локального:
git checkout -b initialwork master
Я назвал ветку initialwork. В результате выполнения команды вы должны увидеть что-то типа:
Switched to a new branch 'initialwork'
Теперь мы находимся в ветке, где мы можем исправлять баг или работать над новым функционалом. Давайте создадим файл index.html. Вы можете воспользоваться для этого любым текстовым редактором.
Я создал index.html с таким содержимым:
Welcome Home page
Welcome to my website
Если вы повторяете за мной, что я настоятельно рекомендую, то будет очень даже неплохо, если вы создадите файл с таким же именем и с таким же содержимым.
Выполняем команду git status, чтобы посмотреть текущее состояние:
On branch initialwork Untracked files: (use "git add . " to include in what will be committed) index.html nothing added to commit but untracked files present (use "git add" to track)
В первой строке нам напоминают, что мы находимся на ветке initialwork. Потом сообщают, что у нас в папке есть файл index.html, который не добавлен в git и изменения в файле не отслеживаются. Тут же есть подсказка, что для добавления файла в git нужно выполнить комануд git add . Мы уже это делали разок, давайте добавим index.html:
git add index.html
Снова выполняем git status, чтобы посмотреть, что изменилось:
On branch initialwork Changes to be committed: (use "git restore --staged . " to unstage) new file: index.html
Мы все еще находимся на той же ветке и мы добавили файл, который будет сохранен в git, но он еще не закомичен. Чтобы окончательно закомитить изменения, нужно выполнить команду git commit. Если вы передумали, и не хотите коммитить изменения в файле index.html, то отменить можно командой:
git restore --staged index.html
На то, как можно отменить добавление указывает подсказка при выполнении git status:
(use "git restore --staged . " to unstage)
Эта команда уже менялась, да если честно я ее я никогда не пытался запомнить ее, потому что подсказку можно всегда увидеть в git status.
Когда вы выполняете команду git add, вы подготавливаете свой коммит, по другому эту операцию на английском называют stage. Когда вы убираете файл, эта операция называется unstage. В некоторых программах вместо add и restore вы можете увидеть именно эти слова stage и unstage.
Но давайте не будем отменять, а закомитим файл. Если вы уже выполнили restore, то снова добавьте файл и давайте закомитим командой:
git commit -m 'add index.html file'
На этот раз я коммичу файл с сообщением ‘add index.html file’. В консоли вы должны увидеть что-то типа:
[initialwork 2255b8f] add index.html file 1 file changed, 9 insertions(+) create mode 100644 index.html
Выполните команду gitk, чтобы посмотреть, какие произошли изменения. Слева вверху теперь уже две коммита. Пока они не выглядят как дерево, потому что мы просто создали последовательно две точки. Но напротив каждой из точек виден комментарий, который мы добавили при коммите, поэтому по этому комментарию можн легко найти нужно изменение в дереве:
Попробуйте сейчас изменить файл index.html и выполните команду git status. Результат должен быть примерно следующим:
Changes not staged for commit: (use "git add . " to update what will be committed) (use "git restore . " to discard changes in working directory) modified: index.html
Обратите внимание, что в последней строки перед именем файла index.html появилась надпись modified. Чтобы сохранить изменения нужно снова добавить файл в коммит и закоммитить. Для добавления в коммит можно использовать команду git add. Если изменено много файлов, то их можно добавлять по маске
git add i*
Так мы добавим все файлы, имена которых начинаются с i.
Если вы хотите добавить в коммит все измененные файлы, то можно использовать ключ -u, что означает updated:
git add -u
Эта команда добавит только те файлы, котоыре изменены и за которыми уже наблюдает git. Новые файлы не будут добавлены, их можно потом добавить отдельно выполнив add.
Сливаем ветки
В файловом менеджере или в терминале с помощью команды ls посмотрите на файлы, которые у нас есть. Их должно быть два readme.txt и index.html.
Попробуем переключиться на другую ветку. Создайте новую ветку от мастера с именем secondone:
git checkout -b secondone master
Мы создали новую ветку от мастера. Давайте посмотрим на файловую систему. Обратите внимание, что файл index.html исчез. Когда мы создали новую ветку и переключились на нее, то мы видим только то, что в данный момент находиться в мастере. Index.html файла там нет, он живет в отдельной ветке initialwork.
Если нам нужны изменения, которые были сделаны в файле initialwork, то мы можем слить их. Для этого можно выполнить команду git merge и указать имя ветки, которую нужно слить:
git merge initialwork
В результате вы должны увидеть примерно следующее:
Updating 3167f60..2255b8f Fast-forward index.html | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 index.html
Теперь в файловой системе можно увидеть файл index.html.
Наши изменения начали ветвиться, как показано на следующем рисунке. Теперь понятно, почему
Но изменения все еще не в мастере. Мы можем переключиться на мастер:
git checkout master
и посмотреть на файловую систему. У нас тут все еще только readme.txt.
Обратите внимание, что при переключении на мастер я выполнял команду git checkout без ключа -b, потому что ветка master уже существует и нам не нужно ничего создавать, поэтому просто git checkout – переключиться без создания.
Теперь мы можем слить с мастером любую ветку initialwork или secondone. В обоих ветках уже есть файл index.html и в любом случае он появиться в мастере. Так что можно выполнить команду:
git merge initialwork
git merge secondone
А можете выполнить обе команды и посмотреть на результат. В первом случае произойдет слияние. Во втором случае нам сообщат, что все уже обновлено и слияния не будет:
git merge initialwork Updating 3167f60..2255b8f Fast-forward index.html | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 index.html git merge secondone Already up to date.
Огромный плюс в том, что для изменения файлов мы никогда и ничего не блокировали, никому не сообщали, что сейчас мы начнем работать над файлом и пожалуйста не трогайте их. Мы просто меняем файлы, сохраняем изменение и потом сливаем нужные ветки вместе. В git сохраняются только изменения, а не весь измененный файл. Это значит, что при слиянии двух веток, в которых изменен один и тот же файл, но в разных местах файла проблем не будет. Только если два программиста изменили одну и ту же строку в файле возникнут проблемы, но об этом стоит поговорить в следующий раз.
11 Ноября 2020 | Программирование
Поделитесь с друзьями
Внимание. Если ты копируешь эту статью себе на сайт, то оставляй ссылку непосредственно на эту страницу. Спасибо за понимание