Your Question is :
My default git folder is C:Usersusername.git
But I want to go into c:/project
What command do I need to get into that?
Since you have asked primarily about gitbash which is Linux based (Terminal), there are differences in commands when compared with Command Prompt of Windows.
We’ll discuss gitbash (Terminal) commands only.
1.First of all we must understand that command line(In Windows) and Terminal(In Mac) always points to some folder on storage Drives .
To check towards what directory it is pointing to at any given time. You need to type the command: pwd «an acronym for ‘Print Working Directory’ «.
- There is a command ls which gives us information about the folders and files in a particular directory. This is quite a handy command and often used to know about the file structure. In my answer I will make use of this also.
- To traverse along the folder tree we make use of yet another very important command know as cd which stands for change directory. And your question has the answer within this cd command only.
Here are some of the ways to traverse along the folder tree:
3a) cd command let’s us traverse to child directory. Kindly check the snapshot.
3b) Now to traverse back into the parent directory, we make use of cd .. command: Please check the Image below:
By Using the above two steps we can easily solve your Query:
A) Currently you are in : C:Usersusername.git
So, doing cd .. will point the Terminal towards Users folder.
B) Again Typing cd .. will make Terminal to point towards C Drive.
C) Now doing ls at this point will let you know about all the folders and files in C drive.
Check if there is a project folder, Then simply for the last time type the command:
cd project
And Walla you are have traveled so far to reach to your destination. Congratulations.
Note: If the project folder is not created with C drive, simply write the command mkdir project and it will be created. Then follow the above steps to play around.
4) There is one more straight forward quick solution to your problem in particular:
Wherever the terminal is pointing.
Simply write the command:
4a) cd / It will point to default root folder.
Then type the command : cd /c/ to point towards c directory.
Then simply go to child directory, which in your case is project directory
by typing:
cd project
And you are good to go: ENJOY
guides
- Git. Краткое руководство по терминалу
- Введение
- Открытие терминала
- Linux
- Mac
- Windows (Git Bash)
- Первоначальная настройка Git
- Пути
- Переменные окружения
- Автодополнение
- Ключевые команды
- Текущий рабочий каталог
- Смена рабочего каталога
- Листинг каталога
- Создание файлов
- nano
- Vim
- VS Code
- Создание каталогов
- Перемещение файлов и каталогов
- Удаление файлов и каталогов
- На заметку
- Важность консольных сообщений
- Выход из программы вывода текста
- Копирование/вставка
- “Короткий путь”
Введение
Данное краткое руководство демонстрирует основные команды в терминале 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
следующим образом:
Команда printenv
позволяет отобразить все переменные окружения:
Видно, что в переменных окружения содержится достаточно много информации о системе.
Автодополнение
В командных оболочках работает автодополнение по клавише Tab
:
- дополняются имена команд;
- дополняются пути.
Используйте автодополнение, так как оно позволяет сократить время на набор команды.
Ключевые команды
В этом разделе будут описаны ключевые команды, необходимые нам для работы. Естественно, список этот далеко не полный.
Текущий рабочий каталог
pwd
— сокращение от “Print Working Directory”.
Отображение текущего рабочего каталога:
Смена рабочего каталога
cd
— сокращение от “Change Directory”.
Переход в определённый каталог:
path
может быть как абсолютным, так и относительным путём.
Например, перейти на каталог выше:
Перейти в подкаталог src
:
Если перед путём нет слеша — он трактуется как относительный (относительно текущего каталога).
Листинг каталога
ls
— сокращение от “List”.
Отображает листинг (содержимое каталога):
По умолчанию, ls
не отображает файлы, начинающиеся с .
, например, .gitignore
. Для отображения таких файлов нужно использовать флаг -a
:
Создание файлов
Для создания файлов используются специальные программы (например, для создания текстовых файлов — текстовые редакторы).
В рамках рассмотрения Bash мы рассмотрим два текстовых редактора, которые позволят вам создавать и редактировать файлы в псевдографическом режиме.
nano
nano — простой текстовый редактор.
Для того, чтобы создать файл достаточно ввести команду nano
и имя файла:
Откроется редактор следующего вида:
Пункты меню в нижней части вызываются с помощью горячих клавиш, где символ ^
обозначает клавишу 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
:
Мы лишь скажем, что для выхода из этого редактора (если вы всё-таки осмелились его открыть) нужно нажать клавишу Esc
, затем ввести команду :q!
— это позволит вам закрыть открытый файл без сохранения изменений.
VS Code
В видео-лекциях используется VS Code. В Windows вы можете правой кнопкой открыть каталог сразу в VS Code.
В Mac OS и Linux вы можете открыть терминал по адресу папки и в терминале выполнить команду code . &
, которая откроет выбранный вами каталог в этом редакторе.
Если ни то, ни другое у вас не получилось, то просто откройте VS Code и через File
— Open
откройте нужный каталог.
Создание каталогов
mkdir
— сокращения от “Make Directory”.
Позволяет создавать каталоги (создаст каталог tmp
в текущем каталоге):
Стоит обратить внимание на поведение при создании нового каталога в текущей директории. После команды mkdir name
ваше текущее расположение в терминале не изменится. Для того, чтобы работать внутри созданного каталога, в него требуется перейти командой cd name
. Это справедливо и при клонировании удалённого репозитория с помощью команды git clone <repo_url>
. Полностью склонированный репозиторий создаст каталог в текущей директории с именем проекта, в который нужно перейти командой cd repo_name
.
Перемещение файлов и каталогов
mv
— сокращение от “Move”.
Перемещение (переименование) файлов и каталогов:
Удаление файлов и каталогов
rm
— сокращение от “Remove”.
Удаление файла:
Удаление непустого каталога:
Для удаления непустого каталога необходимо указать флаги:
-r
— удалять рекурсивно;-f
— не спрашивать подтверждения.
На заметку
Важность консольных сообщений
Git является консольной программой — это значит, что у неё нет графического интерфейса, привычного нам по многим оконным приложениям. Программа будет выводить всю важную информацию о своей работе в окно терминала. Обычно программа “молчит”, когда команда выполнена успешно.
При возникновении ошибок Git обязательно сообщит вам об этом, иногда даже подскажет, как поступить дальше.
Внимательно изучая вывод программы, вы сохраняете своё время и понимаете работу программы чуть лучше. Это справедливо для всех консольных приложений.
Выход из программы вывода текста
Бывает, Git пытается нам сказать намного больше, чем умещается в окне терминала. Для этого он пользуется постраничным выводом и когда ему уже нечего выводить появляется метка конца данных (END)
или :END
. Например, конец вывода команды git log
:
Для того чтобы покинуть программу вывода, нужно нажать клавишу q
(сокращение от слова “quit” — покинуть) на английской раскладке клавиатуры.
Копирование/вставка
Копирование и вставка из буфера обмена в терминал отличается от тех же действий в обычных текстовых редакторах. Хорошо известная последовательность Ctrl + C
и Ctrl + V
нужного эффекта не даст. Некоторые последовательности символов зарезервированы в терминале как управляющие, в частности, Ctrl + C
служит для прерывания процесса.
Для того чтобы скопировать выделенную область из терминала в буфер обмена, нужно использовать контекстное меню (правая кнопка мышки) или нажать Ctrl + Ins
:
Для вставки в поле ввода терминала можно также воспользоваться контекстным меню мышки или зажать Shift + Ins
:
Иногда может работать вставка по нажатию на колёсико мышки (средняя кнопка).
“Короткий путь”
Зачастую навигация в терминале сводится к попеременному вводу команд листинга
и, после просмотра содержимого текущей директории, выбору следующей директории.
Но есть способ короче. Если полностью набрать имя следующей директории и нажать два раза клавишу Tab
, мы сможем заглянуть внутрь этой директории не прерывая команду.
При этом уже набранный текст команды будет на новой строке, а выше мы увидим содержимое следующей директории.
Хранилище в вычислительной технике известно как центральное место, в котором хранятся и управляются данные. Таким образом, репозиторий Git представляет собой центральное хранилище, в котором будут храниться и управляться все файлы проекта. Git repository-это папка внутри вашей системы, в которой находятся все файлы вашего проекта. Он позволяет сохранять версии вашего кода, так что вы можете получить к ним доступ в любое время. В вашей системе git repository — это простая папка, как и многие другие папки.
Поскольку теперь мы очень близки к тому, чтобы начать выполнять действия Git, но мы должны знать несколько общих команд каталогов на Git Bash, чтобы сделать процесс простым. К ним относятся:
- Изменение каталога с помощью Git Bash
- Создание каталога с помощью Git Bash
- Посмотреть все каталоги в Git Bash
Изменение каталога очень важно, так как при работе с Git Bash вы постоянно перемещаетесь между разными каталогами. Каталог (директория) — это технический термин для обозначения папки. Вы можете изменить каталог двумя способами:
- Непосредственно через Git Bash с помощью команд
- Открыв Git Bash в нужной папке
Читайте также: Разница между git и github‘
Перейдите в нужный каталог с помощью команд в Git Bash
Вы можете изменить каталог внутри Git Bash с помощью команды cd. Команда cd обычно используется в оболочке вашей системы (cmd) для той же цели. Перейдите в каталог ToolsQA с помощью команды cd
- Откройте свой Git Bash.
- Введите следующую команду cd <путь к каталогу> и нажмите клавишу enter.
Примечание: ToolsQA — это папка внутри диска E в данном примере.
Откройте Git Bash прямо в папке
Изменение каталога через открытие его в той же папке — это довольно прямолинейно. Для этого перейдите в каталог, который вы хотите изменить.
После этого щелкните правой кнопкой мыши в любом месте каталога = > откройте Git Bash Here.
После того, как мы научились изменять рабочий каталог, мы можем создать репозиторий в любой папке проекта, где нам нужно работать. Для создания репозитория мы сначала создадим папку, в которой будем работать.
Как создать новый каталог с помощью Git Bash?
Создание каталога с помощью Git Bash — это всего лишь простая команда, которая также используется в системах Linux. Хотя вы можете создать каталог, используя обычный метод создания новой папки, но используйте Git Bash для максимально возможной работы. Давайте посмотрим, как создать каталог с помощью Git Bash.
- Откройте Git Bash.
- Перейдите в каталог, в котором вы хотите создать папку.
- Введите следующую команду mkdir <имя папки> и нажмите клавишу enter, чтобы создать каталог.
Примечание: запомните, что, если вы упоминаете более одного слова имени каталога не в кавычках, он создаст два каталога. Это мы увидим в следующем разделе, а затем удалим эти папки и создадим один каталог под названием «First Project».
Как просмотреть все каталоги в Git Bash?
Теперь, когда мы создали папку, мы также должны знать, как посмотреть на все каталоги/папки внутри нашего рабочего каталога.
1.Перейдите в директорию, в которой вы хотите видеть каталоги (ToolsQA)
- Введите следующую команду ls и нажмите клавишу Enter. Все каталоги будут видны вам.
Примечание: стоит отметить, что ls не будет показывать скрытые папки. Вам нужно использовать ls-a для этого.
Как удалить папку
Вы можете удалить каталог, используя команду rmdir с именем каталога.
Примечание: mk означает make, а rm Remove.
Теперь мы все настроены на инициализацию Git внутри нашего каталога проектов. Как уже упоминалось выше, нам нужно знать о команде git init для создания репозитория. Мы кратко рассмотрим команду git init в следующей статье.
Читайте также: Этапы жизненного цикла GIT.
-
GIT_MERGE_VERBOSITY
-
A number controlling the amount of output shown by
the recursive merge strategy. Overrides merge.verbosity.
See git-merge[1] -
This environment variable overrides
$PAGER
. If it is set
to an empty string or to the value «cat», Git will not launch
a pager. See also thecore.pager
option in
git-config[1]. -
GIT_PROGRESS_DELAY
-
A number controlling how many seconds to delay before showing
optional progress indicators. Defaults to 2. -
GIT_EDITOR
-
This environment variable overrides
$EDITOR
and$VISUAL
.
It is used by several Git commands when, on interactive mode,
an editor is to be launched. See also git-var[1]
and thecore.editor
option in git-config[1]. -
GIT_SEQUENCE_EDITOR
-
This environment variable overrides the configured Git editor
when editing the todo list of an interactive rebase. See also
git-rebase[1] and thesequence.editor
option in
git-config[1]. -
GIT_SSH
-
GIT_SSH_COMMAND
-
If either of these environment variables is set then git fetch
and git push will use the specified command instead of ssh
when they need to connect to a remote system.
The command-line parameters passed to the configured command are
determined by the ssh variant. Seessh.variant
option in
git-config[1] for details.$GIT_SSH_COMMAND
takes precedence over$GIT_SSH
, and is interpreted
by the shell, which allows additional arguments to be included.
$GIT_SSH
on the other hand must be just the path to a program
(which can be a wrapper shell script, if additional arguments are
needed).Usually it is easier to configure any desired options through your
personal.ssh/config
file. Please consult your ssh documentation
for further details. -
GIT_SSH_VARIANT
-
If this environment variable is set, it overrides Git’s autodetection
whetherGIT_SSH
/GIT_SSH_COMMAND
/core.sshCommand
refer to OpenSSH,
plink or tortoiseplink. This variable overrides the config setting
ssh.variant
that serves the same purpose. -
GIT_SSL_NO_VERIFY
-
Setting and exporting this environment variable to any value
tells Git not to verify the SSL certificate when fetching or
pushing over HTTPS. -
GIT_ASKPASS
-
If this environment variable is set, then Git commands which need to
acquire passwords or passphrases (e.g. for HTTP or IMAP authentication)
will call this program with a suitable prompt as command-line argument
and read the password from its STDOUT. See also thecore.askPass
option in git-config[1]. -
GIT_TERMINAL_PROMPT
-
If this Boolean environment variable is set to false, git will not prompt
on the terminal (e.g., when asking for HTTP authentication). -
GIT_CONFIG_GLOBAL
-
GIT_CONFIG_SYSTEM
-
Take the configuration from the given files instead from global or
system-level configuration files. IfGIT_CONFIG_SYSTEM
is set, the
system config file defined at build time (usually/etc/gitconfig
)
will not be read. Likewise, ifGIT_CONFIG_GLOBAL
is set, neither
$HOME/.gitconfig
nor$XDG_CONFIG_HOME/git/config
will be read. Can
be set to/dev/null
to skip reading configuration files of the
respective level. -
GIT_CONFIG_NOSYSTEM
-
Whether to skip reading settings from the system-wide
$(prefix)/etc/gitconfig
file. This Boolean environment variable can
be used along with$HOME
and$XDG_CONFIG_HOME
to create a
predictable environment for a picky script, or you can set it
to true to temporarily avoid using a buggy/etc/gitconfig
file while
waiting for someone with sufficient permissions to fix it. -
GIT_FLUSH
-
If this environment variable is set to «1», then commands such
as git blame (in incremental mode), git rev-list, git log,
git check-attr and git check-ignore will
force a flush of the output stream after each record have been
flushed. If this
variable is set to «0», the output of these commands will be done
using completely buffered I/O. If this environment variable is
not set, Git will choose buffered or record-oriented flushing
based on whether stdout appears to be redirected to a file or not. -
GIT_TRACE
-
Enables general trace messages, e.g. alias expansion, built-in
command execution and external command execution.If this variable is set to «1», «2» or «true» (comparison
is case insensitive), trace messages will be printed to
stderr.If the variable is set to an integer value greater than 2
and lower than 10 (strictly) then Git will interpret this
value as an open file descriptor and will try to write the
trace messages into this file descriptor.Alternatively, if the variable is set to an absolute path
(starting with a / character), Git will interpret this
as a file path and will try to append the trace messages
to it.Unsetting the variable, or setting it to empty, «0» or
«false» (case insensitive) disables trace messages. -
GIT_TRACE_FSMONITOR
-
Enables trace messages for the filesystem monitor extension.
SeeGIT_TRACE
for available trace output options. -
GIT_TRACE_PACK_ACCESS
-
Enables trace messages for all accesses to any packs. For each
access, the pack file name and an offset in the pack is
recorded. This may be helpful for troubleshooting some
pack-related performance problems.
SeeGIT_TRACE
for available trace output options. -
GIT_TRACE_PACKET
-
Enables trace messages for all packets coming in or out of a
given program. This can help with debugging object negotiation
or other protocol issues. Tracing is turned off at a packet
starting with «PACK» (but seeGIT_TRACE_PACKFILE
below).
SeeGIT_TRACE
for available trace output options. -
GIT_TRACE_PACKFILE
-
Enables tracing of packfiles sent or received by a
given program. Unlike other trace output, this trace is
verbatim: no headers, and no quoting of binary data. You almost
certainly want to direct into a file (e.g.,
GIT_TRACE_PACKFILE=/tmp/my.pack
) rather than displaying it on
the terminal or mixing it with other trace output.Note that this is currently only implemented for the client side
of clones and fetches. -
GIT_TRACE_PERFORMANCE
-
Enables performance related trace messages, e.g. total execution
time of each Git command.
SeeGIT_TRACE
for available trace output options. -
GIT_TRACE_REFS
-
Enables trace messages for operations on the ref database.
SeeGIT_TRACE
for available trace output options. -
GIT_TRACE_SETUP
-
Enables trace messages printing the .git, working tree and current
working directory after Git has completed its setup phase.
SeeGIT_TRACE
for available trace output options. -
GIT_TRACE_SHALLOW
-
Enables trace messages that can help debugging fetching /
cloning of shallow repositories.
SeeGIT_TRACE
for available trace output options. -
GIT_TRACE_CURL
-
Enables a curl full trace dump of all incoming and outgoing data,
including descriptive information, of the git transport protocol.
This is similar to doing curl--trace-ascii
on the command line.
SeeGIT_TRACE
for available trace output options. -
GIT_TRACE_CURL_NO_DATA
-
When a curl trace is enabled (see
GIT_TRACE_CURL
above), do not dump
data (that is, only dump info lines and headers). -
GIT_TRACE2
-
Enables more detailed trace messages from the «trace2» library.
Output fromGIT_TRACE2
is a simple text-based format for human
readability.If this variable is set to «1», «2» or «true» (comparison
is case insensitive), trace messages will be printed to
stderr.If the variable is set to an integer value greater than 2
and lower than 10 (strictly) then Git will interpret this
value as an open file descriptor and will try to write the
trace messages into this file descriptor.Alternatively, if the variable is set to an absolute path
(starting with a / character), Git will interpret this
as a file path and will try to append the trace messages
to it. If the path already exists and is a directory, the
trace messages will be written to files (one per process)
in that directory, named according to the last component
of the SID and an optional counter (to avoid filename
collisions).In addition, if the variable is set to
af_unix:[<socket_type>:]<absolute-pathname>
, Git will try
to open the path as a Unix Domain Socket. The socket type
can be eitherstream
ordgram
.Unsetting the variable, or setting it to empty, «0» or
«false» (case insensitive) disables trace messages. -
GIT_TRACE2_EVENT
-
This setting writes a JSON-based format that is suited for machine
interpretation.
SeeGIT_TRACE2
for available trace output options and
Trace2 documentation for full details. -
GIT_TRACE2_PERF
-
In addition to the text-based messages available in
GIT_TRACE2
, this
setting writes a column-based format for understanding nesting
regions.
SeeGIT_TRACE2
for available trace output options and
Trace2 documentation for full details. -
GIT_TRACE_REDACT
-
By default, when tracing is activated, Git redacts the values of
cookies, the «Authorization:» header, the «Proxy-Authorization:»
header and packfile URIs. Set this Boolean environment variable to false to prevent this
redaction. -
GIT_LITERAL_PATHSPECS
-
Setting this Boolean environment variable to true will cause Git to treat all
pathspecs literally, rather than as glob patterns. For example,
runningGIT_LITERAL_PATHSPECS=1 git log -- '*.c'
will search
for commits that touch the path*.c
, not any paths that the
glob*.c
matches. You might want this if you are feeding
literal paths to Git (e.g., paths previously given to you by
git ls-tree
,--raw
diff output, etc). -
GIT_GLOB_PATHSPECS
-
Setting this Boolean environment variable to true will cause Git to treat all
pathspecs as glob patterns (aka «glob» magic). -
GIT_NOGLOB_PATHSPECS
-
Setting this Boolean environment variable to true will cause Git to treat all
pathspecs as literal (aka «literal» magic). -
GIT_ICASE_PATHSPECS
-
Setting this Boolean environment variable to true will cause Git to treat all
pathspecs as case-insensitive. -
GIT_REFLOG_ACTION
-
When a ref is updated, reflog entries are created to keep
track of the reason why the ref was updated (which is
typically the name of the high-level command that updated
the ref), in addition to the old and new values of the ref.
A scripted Porcelain command can use set_reflog_action
helper function ingit-sh-setup
to set its name to this
variable when it is invoked as the top level command by the
end user, to be recorded in the body of the reflog. -
GIT_REF_PARANOIA
-
If this Boolean environment variable is set to false, ignore broken or badly named refs when iterating
over lists of refs. Normally Git will try to include any such
refs, which may cause some operations to fail. This is usually
preferable, as potentially destructive operations (e.g.,
git-prune[1]) are better off aborting rather than
ignoring broken refs (and thus considering the history they
point to as not worth saving). The default value is1
(i.e.,
be paranoid about detecting and aborting all operations). You
should not normally need to set this to0
, but it may be
useful when trying to salvage data from a corrupted repository. -
GIT_ALLOW_PROTOCOL
-
If set to a colon-separated list of protocols, behave as if
protocol.allow
is set tonever
, and each of the listed
protocols hasprotocol.<name>.allow
set toalways
(overriding any existing configuration). See the description of
protocol.allow
in git-config[1] for more details. -
GIT_PROTOCOL_FROM_USER
-
Set this Boolean environment variable to false to prevent protocols used by fetch/push/clone which are
configured to theuser
state. This is useful to restrict recursive
submodule initialization from an untrusted repository or for programs
which feed potentially-untrusted URLS to git commands. See
git-config[1] for more details. -
GIT_PROTOCOL
-
For internal use only. Used in handshaking the wire protocol.
Contains a colon : separated list of keys with optional values
key[=value]. Presence of unknown keys and values must be
ignored.Note that servers may need to be configured to allow this variable to
pass over some transports. It will be propagated automatically when
accessing local repositories (i.e.,file://
or a filesystem path), as
well as over thegit://
protocol. For git-over-http, it should work
automatically in most configurations, but see the discussion in
git-http-backend[1]. For git-over-ssh, the ssh server may need
to be configured to allow clients to pass this variable (e.g., by using
AcceptEnv GIT_PROTOCOL
with OpenSSH).This configuration is optional. If the variable is not propagated, then
clients will fall back to the original «v0» protocol (but may miss out
on some performance improvements or features). This variable currently
only affects clones and fetches; it is not yet used for pushes (but may
be in the future). -
GIT_OPTIONAL_LOCKS
-
If this Boolean environment variable is set to false, Git will complete any requested operation without
performing any optional sub-operations that require taking a lock.
For example, this will preventgit status
from refreshing the
index as a side effect. This is useful for processes running in
the background which do not want to cause lock contention with
other operations on the repository. Defaults to1
. -
GIT_REDIRECT_STDIN
-
GIT_REDIRECT_STDOUT
-
GIT_REDIRECT_STDERR
-
Windows-only: allow redirecting the standard input/output/error
handles to paths specified by the environment variables. This is
particularly useful in multi-threaded applications where the
canonical way to pass standard handles viaCreateProcess()
is
not an option because it would require the handles to be marked
inheritable (and consequently every spawned process would
inherit them, possibly blocking regular Git operations). The
primary intended use case is to use named pipes for communication
(e.g.\.pipemy-git-stdin-123
).Two special values are supported:
off
will simply close the
corresponding standard handle, and ifGIT_REDIRECT_STDERR
is
2>&1
, standard error will be redirected to the same handle as
standard output. -
GIT_PRINT_SHA1_ELLIPSIS
(deprecated) -
If set to
yes
, print an ellipsis following an
(abbreviated) SHA-1 value. This affects indications of
detached HEADs (git-checkout[1]) and the raw
diff output (git-diff[1]). Printing an
ellipsis in the cases mentioned is no longer considered
adequate and support for it is likely to be removed in the
foreseeable future (along with the variable).
Шпаргалка по консольным командам Git
Добавляйте свои команды и остальные полезности через Pull request
.
Общее
Git — система контроля версий (файлов). Что-то вроде возможности сохраняться в компьютерных играх (в Git эквивалент игрового сохранения — коммит). Важно: добавление файлов к «сохранению» двухступенчатое: сначала добавляем файл в индекс (git add
), потом «сохраняем» (git commit
).
Любой файл в директории существующего репозитория может находиться или не находиться под версионным контролем (отслеживаемые и неотслеживаемые).
Отслеживаемые файлы могут быть в 3-х состояниях: неизменённые, изменённые, проиндексированные (готовые к коммиту).
Ключ к пониманию
Ключ к пониманию концепции git — знание о «трех деревьях»:
- Рабочая директория — файловая система проекта (те файлы, с которыми вы работаете).
- Индекс — список отслеживаемых git-ом файлов и директорий, промежуточное хранилище изменений (редактирование, удаление отслеживаемых файлов).
- Директория
.git/
— все данные контроля версий этого проекта (вся история разработки: коммиты, ветки, теги и пр.).
Коммит — «сохранение» (хранит набор изменений, сделанный в рабочей директории с момента предыдущего коммита). Коммит неизменен, его нельзя отредактировать.
У всех коммитов (кроме самого первого) есть один или более родительских коммитов, поскольку коммиты хранят изменения от предыдущих состояний.
Простейший цикл работ
- Редактирование, добавление, удаление файлов (собственно, работа).
- Индексация/добавление файлов в индекс (указание для git какие изменения нужно будет закоммитить).
- Коммит (фиксация изменений).
- Возврат к шагу 1 или отход ко сну.
Указатели
HEAD
— указатель на текущий коммит или на текущую ветку (то есть, в любом случае, на коммит). Указывает на родителя коммита, который будет создан следующим.ORIG_HEAD
— указатель на коммит, с которого вы только что переместилиHEAD
(командойgit reset ...
, например).- Ветка (
master
,develop
etc.) — указатель на коммит. При добавлении коммита, указатель ветки перемещается с родительского коммита на новый. - Теги — простые указатели на коммиты. Не перемещаются.
Настройки
Перед началом работы нужно выполнить некоторые настройки:
git config --global user.name "Your Name" # указать имя, которым будут подписаны коммиты
git config --global user.email "e@w.com" # указать электропочту, которая будет в описании коммитера
Если вы в Windows:
git config --global core.autocrlf true # включить преобразование окончаний строк из CRLF в LF
Указание неотслеживаемых файлов
Файлы и директории, которые не нужно включать в репозиторий, указываются в файле .gitignore
. Обычно это устанавливаемые зависимости (node_modules/
, bower_components/
), готовая сборка build/
или dist/
и подобные, создаваемые при установке или запуске. Каждый файл или директория указываются с новой строки, возможно использование шаблонов.
Консоль
Как использовать консоль Bash в Windows, основные команды.
Длинный вывод в консоли: Vim
Вызов некоторых консольных команд приводит к необходимости очень длинного вывода в консоль (пример: вывод истории всех изменений в файле командой git log -p fileName.txt
). При этом прямо в консоли запускается редактор Vim. Он работает в нескольких режимах, из которых Вас заинтересуют режим вставки (редактирование текста) и нормальный (командный) режим. Чтобы попасть из Vim обратно в консоль, нужно в командном режиме ввести :q. Переход в командный режим из любого другого: Esc.
Если нужно что-то написать, нажмите i — это переход в режим вставки текста. Если нужно сохранить изменения, перейдите в командный режим и наберите :w.
Vim (некоторые команды)
# Нажатия кнопок ESC — переход в командный режим i — переход в режим редактирования текста ZQ (зажат Shift, поочередное нажатие) — выход без сохранения ZZ (зажат Shift, поочередное нажатие) — сохранить и выйти ```bash # Нажатия кнопок ESC — переход в командный режим i — переход в режим редактирования текста ZQ (зажат Shift, поочередное нажатие) — выход без сохранения ZZ (зажат Shift, поочередное нажатие) — сохранить и выйти # Ввод в командном режиме :q! — выйти без сохранения :wq — сохранить файл и выйти :w filename.txt — сохранить файл как filename.txt
Консольные команды
Создать новый репозиторий
git init # создать новый проект в текущей директории git init folder-name # создать новый проект в указанной директории
Клонирование репозитория
# клонировать удаленный репозиторий в одноименную директорию git clone https://github.com/cyberspacedk/Git-commands.git # клонировать удаленный репозиторий в директорию «FolderName» git clone https://github.com/cyberspacedk/Git-commands.git FolderName # клонировать репозиторий в текущую директорию git clone https://github.com:nicothin/web-design.git .
Просмотр изменений
git status # показать состояние репозитория (отслеживаемые, изменённые, новые файлы и пр.) git diff # сравнить рабочую директорию и индекс (неотслеживаемые файлы ИГНОРИРУЮТСЯ) git diff --color-words # сравнить рабочую директорию и индекс, показать отличия в словах (неотслеживаемые файлы ИГНОРИРУЮТСЯ) git diff index.html # сравнить файл из рабочей директории и индекс git diff HEAD # сравнить рабочую директорию и коммит, на который указывает HEAD (неотслеживаемые файлы ИГНОРИРУЮТСЯ) git diff --staged # сравнить индекс и коммит с HEAD git diff master feature # посмотреть что сделано в ветке feature по сравнению с веткой master git diff --name-only master feature # посмотреть что сделано в ветке feature по сравнению с веткой master, показать только имена файлов git diff master...feature # посмотреть что сделано в ветке feature с момента (коммита) расхождения с master
Добавление изменений в индекс
git add . # добавить в индекс все новые, изменённые, удалённые файлы из текущей директории и её поддиректорий git add text.txt # добавить в индекс указанный файл (был изменён, был удалён или это новый файл) git add -i # запустить интерактивную оболочку для добавления в индекс только выбранных файлов git add -p # показать новые/изменённые файлы по очереди с указанием их изменений и вопросом об отслеживании/индексировании
Удаление изменений из индекса
git reset # убрать из индекса все добавленные в него изменения (в рабочей директории все изменения сохранятся), антипод git add git reset readme.txt # убрать из индекса изменения указанного файла (в рабочей директории изменения сохранятся)
Отмена изменений
git checkout text.txt # ОПАСНО: отменить изменения в файле, вернуть состояние файла, имеющееся в индексе git reset --hard # ОПАСНО: отменить изменения; вернуть то, что в коммите, на который указывает HEAD (незакомиченные изменения удалены из индекса и из рабочей директории, неотслеживаемые файлы останутся на месте) git clean -df # удалить неотслеживаемые файлы и директории
Коммиты
git commit -m "Name of commit" # зафиксировать в коммите проиндексированные изменения (закоммитить), добавить сообщение git commit -a -m "Name of commit" # проиндексировать отслеживаемые файлы (ТОЛЬКО отслеживаемые, но НЕ новые файлы) и закоммитить, добавить сообщение
Отмена коммитов и перемещение по истории
Все коммиты, которые уже были отправлены в удалённый репозиторий, должны отменяться новыми коммитами (git revert
), дабы избежать проблем с историей разработки у других участников проекта.
git revert HEAD --no-edit # создать новый коммит, отменяющий изменения последнего коммита без запуска редактора сообщения git revert b9533bb --no-edit # то же, но отменяются изменения, внесённые коммитом с указанным хешем (b9533bb)
Все команды, приведённые ниже можно выполнять ТОЛЬКО если коммиты еще не были отправлены в удалённый репозиторий.
# ВНИМАНИЕ! Опасные команды, можно потерять незакоммиченные изменения git commit --amend -m "Название" # «перекоммитить» изменения последнего коммита, заменить его новым коммитом с другим сообщением (сдвинуть текущую ветку на один коммит назад, сохранив рабочую директорию и индекс «как есть», создать новый коммит с данными из «отменяемого» коммита, но новым сообщением) git reset --hard @~ # передвинуть HEAD (и ветку) на предыдущий коммит, рабочую директорию и индекс сделать такими, какими они были в момент предыдущего коммита git reset --hard 75e2d51 # передвинуть HEAD (и ветку) на коммит с указанным хешем, рабочую директорию и индекс сделать такими, какими они были в момент указанного коммита git reset --soft @~ # передвинуть HEAD (и ветку) на предыдущий коммит, но в рабочей директории и индексе оставить все изменения git reset --soft @~2 # то же, но передвинуть HEAD (и ветку) на 2 коммита назад git reset @~ # передвинуть HEAD (и ветку) на предыдущий коммит, рабочую директорию оставить как есть, индекс сделать таким, каким он был в момент предыдущего коммита (удобнее, чем git reset --soft @~, если индекс нужно задать заново) # Почти как git reset --hard, но безопаснее: не получится потерять изменения в рабочей директории git reset --keep @~ # передвинуть HEAD (и ветку) на предыдущий коммит, сбросить индекс, но в рабочей директории оставить изменения, если возможно (если файл с изменениями между коммитами менялся, будет выдана ошибка и переключение не произойдёт)
Временно переключиться на другой коммит
git checkout b9533bb # переключиться на коммит с указанным хешем (переместить HEAD на указанный коммит, рабочую директорию вернуть к состоянию, на момент этого коммита) git checkout master # переключиться на коммит, на который указывает master (переместить HEAD на коммит, на который указывает master, рабочую директорию вернуть к состоянию на момент этого коммита)
Переключиться на другой коммит и продолжить работу с него
Потребуется создание новой ветки, начинающейся с указанного коммита.
git checkout -b new-branch 5589877 # создать ветку new-branch, начинающуюся с коммита c хешем 5589877 (переместить HEAD на указанный коммит, рабочую директорию вернуть к состоянию, на момент этого коммита, создать указатель на этот коммит (ветку) с указанным именем)
Восстановление изменений
git checkout 5589877 index.html # восстановить в рабочей директории указанный файл на момент указанного коммита (и добавить это изменение в индекс) (git reset index.html для удаления из индекса, но сохранения изменений в файле)
Копирование коммита (перенос коммитов)
git cherry-pick 5589877 # скопировать на активную ветку изменения из указанного коммита, закоммитить эти изменения git cherry-pick master~2..master # скопировать на активную ветку изменения из master (2 последних коммита) git cherry-pick -n 5589877 # скопировать на активную ветку изменения из указанного коммита, но НЕ КОММИТИТЬ (подразумевается, что мы сами потом закоммитим) git cherry-pick master..feature # скопировать на активную ветку изменения из всех коммитов ветки feature с момента её расхождения с master (похоже на слияние веток, но это копирование изменений, а не слияние), закоммитить эти изменения; это может вызвать конфликт git cherry-pick --abort # прервать конфликтный перенос коммитов git cherry-pick --continue # продолжить конфликтный перенос коммитов (сработает только после решения конфликта)
Удаление файла
git rm text.txt # удалить отслеживаемый неизменённый файл и проиндексировать это изменение git rm -f text.txt # удалить отслеживаемый изменённый файл и проиндексировать это изменение git rm -r log/ # удалить всё содержимое отслеживаемой директории log/ и проиндексировать это изменение git rm ind* # удалить все отслеживаемые файлы с именем, начинающимся на «ind» в текущей директории и проиндексировать это изменение git rm --cached readme.txt # удалить из отслеживаемых индексированный файл (ФАЙЛ ОСТАНЕТСЯ НА МЕСТЕ) (часто используется для нечаянно добавленных в отслеживаемые файлов)
Перемещение/переименование файлов
Для git не существует переименования. Переименование воспринимается как удаление старого файла и создание нового. Факт переименования может быть определен только после индексации изменения.
git mv text.txt test_new.txt # переименовать файл «text.txt» в «test_new.txt» и проиндексировать это изменение git mv readme_new.md folder/ # переместить файл readme_new.md в директорию folder/ (должна существовать) и проиндексировать это изменение
История коммитов
Выход из длинного лога вывода: q
.
git log master # показать коммиты в указанной ветке git log -2 # показать последние 2 коммита в активной ветке git log -2 --stat # показать последние 2 коммита и статистику внесенных ими изменений git log -p -22 # показать последние 22 коммита и внесенную ими разницу на уровне строк git log --graph -10 # показать последние 10 коммитов с ASCII-представлением ветвления git log --since=2.weeks # показать коммиты за последние 2 недели git log --after '2018-06-30' # показать коммиты, сделанные после указанной даты git log index.html # показать историю изменений файла index.html (только коммиты) git log -5 index.html # показать историю изменений файла index.html, последние 5 коммитов (только коммиты) git log -p index.html # показать историю изменений файла index.html (коммиты и изменения) git log -G'myFunction' -p # показать все коммиты, в которых менялись строки с myFunction (в кавычках регулярное выражение) git log -L '/<head>/','/</head>/':index.html # показать изменения от указанного до указанного регулярных выражений в указанном файле git log --grep fix # показать коммиты, в описании которых есть буквосочетание fix (регистрозависимо, только коммиты текущей ветки) git log --grep fix -i # показать коммиты, в описании которых есть буквосочетание fix (регистроНЕзависимо, только коммиты текущей ветки) git log --grep 'fix(ing|me)' -P # показать коммиты, в описании которых есть совпадения для регулярного выражения (только коммиты текущей ветки) git log --pretty=format:"%h - %an, %ar : %s" -4 # показать последние 4 коммита с форматированием выводимых данных git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short # мой формат вывода, висящий на алиасе оболочки git log master..branch_99 # показать коммиты из ветки branch_99, которые не влиты в master git log branch_99..master # показать коммиты из ветки master, которые не влиты в branch_99 git log master...branch_99 --boundary -- graph # показать коммиты из указанных веток, начиная с их расхождения (коммит расхождения будет показан)
git show 60d6582 # показать изменения из коммита с указанным хешем git show HEAD~ # показать данные о предыдущем коммите в активной ветке git show @~ # аналогично предыдущему git show HEAD~3 # показать данные о коммите, который был 3 коммита назад git show my_branch~2 # показать данные о коммите, который был 2 коммита назад в указанной ветке git show @~:index.html # показать контент указанного файла на момент предыдущего (от HEAD) коммита git show :/"подвал" # показать самый новый коммит, в описании которого есть указанное слово (из любой ветки)
Кто написал строку
git blame README.md --date=short -L 5,8 # показать строки 5-8 указанного файла и коммиты, в которых строки были добавлены
История изменений указателей (веток, HEAD)
git reflog -20 # показать последние 20 изменений положения указателя HEAD
git reflog --format='%C(auto)%h %<|(20)%gd %C(blue)%cr%C(reset) %gs (%s)' -20 # то же, но с указанием давности действий
Ветки
git branch # показать список веток git branch -v # показать список веток и последний коммит в каждой git branch new_branch # создать новую ветку с указанным именем на текущем коммите git branch new_branch 5589877 # создать новую ветку с указанным именем на указанном коммите git branch -f master 5589877 # переместить ветку master на указанный коммит git branch -f master master~2 # переместить ветку master на 2 коммита назад git checkout new_branch # перейти в указанную ветку git checkout -b new_branch # создать новую ветку с указанным именем и перейти в неё git checkout -B master 5589877 # переместить ветку с указанным именем на указанный коммит и перейти в неё git merge hotfix # влить в ветку, в которой находимся, данные из ветки hotfix git merge hotfix -m "Горячая правка" # влить в ветку, в которой находимся, данные из ветки hotfix (указано сообщение коммита слияния) git merge hotfix --log # влить в ветку, в которой находимся, данные из ветки hotfix, показать редактор описания коммита, добавить в него сообщения вливаемых коммитов git merge hotfix --no-ff # влить в ветку, в которой находимся, данные из ветки hotfix, запретить простой сдвиг указателя, изменения из hotfix «останутся» в ней, а в активной ветке появится только коммит слияния git branch -d hotfix # удалить ветку hotfix (используется, если её изменения уже влиты в главную ветку) git branch --merged # показать ветки, уже слитые с активной git branch --no-merged # показать ветки, не слитые с активной git branch -a # показать все имеющиеся ветки (в т.ч. на удаленных репозиториях) git branch -m old_branch_name new_branch_name # переименовать локально ветку old_branch_name в new_branch_name git branch -m new_branch_name # переименовать локально ТЕКУЩУЮ ветку в new_branch_name git push origin :old_branch_name new_branch_name # применить переименование в удаленном репозитории git branch --unset-upstream # завершить процесс переименования
Теги
git tag v1.0.0 # создать тег с указанным именем на коммите, на который указывает HEAD git tag -a -m 'В продакшен!' v1.0.1 master # создать тег с описанием на том коммите, на который смотрит ветка master git tag -d v1.0.0 # удалить тег с указанным именем(ами) git tag -n # показать все теги, и по 1 строке сообщения коммитов, на которые они указывают git tag -n -l 'v1.*' # показать все теги, которые начинаются с 'v1.*'
Временное сохранение изменений без коммита
git stash # временно сохранить незакоммиченные изменения и убрать их из рабочей директории git stash pop # вернуть сохраненные командой git stash изменения в рабочую директорию
Удалённые репозитории
Есть два распространённых способа привязать удалённый репозиторий к локальному: по HTTPS и по SSH. Если SSH у вас не настроен (или вы не знаете что это), привязывайте удалённый репозиторий по HTTPS (адрес привязываемого репозитория должен начинаться с https://).
git remote -v # показать список удалённых репозиториев, связанных с локальным git branch -r # показать удаленные ветки git branch -a # показать все ветки(локальные и удаленные) git remote remove origin # убрать привязку удалённого репозитория с сокр. именем origin git remote add origin https://github.com:nicothin/test.git # добавить удалённый репозиторий (с сокр. именем origin) с указанным URL git remote rm origin # удалить привязку удалённого репозитория git remote show origin # получить данные об удалённом репозитории с сокращенным именем origin git fetch origin # скачать все ветки с удаленного репозитория (с сокр. именем origin), но не сливать со своими ветками git fetch origin master # то же, но скачивается только указанная ветка git checkout --track origin/github_branch # создать локальную ветку github_branch (данные взять из удалённого репозитория с сокр. именем origin, ветка github_branch) и переключиться на неё git push origin master # отправить в удалённый репозиторий (с сокр. именем origin) данные своей ветки master git pull origin # влить изменения с удалённого репозитория (все ветки) git pull origin master # влить изменения с удалённого репозитория (только указанная ветка)
Конфликт слияния
Предполагается ситуация: есть ветка master
и есть ветка feature
. В обеих ветках есть коммиты, сделанные после расхождения веток. В ветку master
пытаемся влить ветку feature
(git merge feature
), получаем конфликт, т.к. в обеих ветках есть изменения одной и той же строки в файле index.html
.
При возникновении конфликта, репозиторий находится в состоянии прерванного слияния. Нужно оставить в конфликтующих местах файлов только нужный код, проиндексировать изменения и закоммитить.
git merge feature # влить в активную ветку изменения из ветки feature git merge-base master feature # показать хеш последнего общего коммита для двух указанных веток git checkout --ours index.html # оставить в конфликтном файле (index.html) состояние ветки, В КОТОРУЮ мы вливаем (в примере — из ветки master) git checkout --theirs index.html # оставить в конфликтном файле (index.html) состояние ветки, ИЗ КОТОРОЙ мы вливаем (в примере — из ветки feature) git checkout --merge index.html # показать в конфликтном файле (index.html) сравнение содержимого сливаемых веток (для ручного редактирования) git checkout --conflict=diff3 --merge index.html # показать в конфликтном файле (index.html) сравнение содержимого сливаемых веток плюс то, что было в месте конфликта в коммите, на котором разошлись сливаемые ветки
git reset --hard # прекратить это прерванное слияние, вернуть рабочую директорию и индекс как было в момент коммита, на который указывает HEAD, а я пойду немного поплачу git reset --merge # прекратить это прерванное слияние, но оставить изменения, не закоммиченные до слияния (для случая, когда слияние делается не на чистом статусе) git reset --abort # то же, что и строкой выше
«Перенос» ветки
Можно «переместить» ответвление какой-либо ветки от основной на произвольный коммит. Это нужно для того, чтобы в «переносимой» ветке появились какие-либо изменения, внесённые в основной ветке (уже после ответвления переносимой).
Нельзя «переносить» ветку, если она уже отправлена на удалённый репозиторий.
git rebase master # перенести все коммиты (создать их копии) активной ветки так, будто активная ветка ответвилась от master на нынешней вершине master (часто вызывает конфликты) git rebase --onto master feature # перенести коммиты активной ветки на master, начиная с того места, в котором активная ветка отделилась от ветки feature git rebase --abort # прервать конфликтный rebase, вернуть рабочую директорию и индекс к состоянию до начала rebase git rebase --continue # продолжить конфликтный rebase (сработает только после разрешения конфликта и индексации такого разрешения)
Как отменить rebase
git reflog feature -2 # смотрим лог перемещений ветки, которой делали rebase (в этом примере — feature), видим последний коммит ПЕРЕД rebase, на него и нужно перенести указатель ветки git reset --hard feature@{1} # переместить указатель ветки feature на один коммит назад, обновить рабочую директорию и индекс
Разное
git archive -o ./project.zip HEAD # создать архив с файловой структурой проекта по указанному пути (состояние репозитория, соответствующее указателю HEAD)
Примеры
Собираем коллекцию простых и сложных примеров работы.
Начало работы
Создание нового репозитория, первый коммит, привязка удалённого репозитория с gthub.com, отправка изменений в удалённый репозиторий.
# указана последовательность действий: # создана директория проекта, мы в ней git init # создаём репозиторий в этой директории touch readme.md # создаем файл readme.md git add readme.md # добавляем файл в индекс git commit -m "Старт" # создаем коммит git remote add origin https://github.com:nicothin/test.git # добавляем предварительно созданный пустой удаленный репозиторий git push -u origin master # отправляем данные из локального репозитория в удаленный (в ветку master)
«Внесение изменений» в коммит
Только если коммит ещё не был отправлен в удалённые репозиторий.
# указана последовательность действий: subl inc/header.html # редактируем и сохраняем разметку «шапки» git add inc/header.html # индексируем измененный файл git commit -m "Убрал телефон из шапки" # делаем коммит # ВНИМАНИЕ: коммит пока не был отправлен в удалённый репозиторий # сознаём, что нужно было еще что-то сделать в этом коммите. subl inc/header.html # вносим изменения git add inc/header.html # индексируем измененный файл (можно git add .) git commit --amend -m "«Шапка»: выполнена задача №34" # заново делаем коммит
Работа с ветками
Есть master (публичная версия сайта), выполняем масштабную задачу (переверстать «шапку»), но по ходу работ возникает необходимость подправить критичный баг (неправильно указан контакт в «подвале»).
# указана последовательность действий: git checkout -b new-page-header # создадим новую ветку для задачи изменения «шапки» и перейдём в неё subl inc/header.html # редактируем разметку «шапки» git commit -a -m "Новая шапка: смена логотипа" # делаем коммит (работа еще не завершена) # тут выясняется, что есть баг с контактом в «подвале» git checkout master # возвращаемся к ветке master subl inc/footer.html # устраняем баг и сохраняем разметку «подвала» git commit -a -m "Исправление контакта в подвале" # делаем коммит git push # отправляем коммит с быстрым критическим изменением в master в удалённом репозитории git checkout new-page-header # переключаемся обратно в ветку new-page-header для продолжения работ над «шапкой» subl inc/header.html # редактируем и сохраняем разметку «шапки» git commit -a -m "Новая шапка: смена навигации" # делаем коммит (работа над «шапкой» завершена) git checkout master # переключаемся в ветку master git merge new-page-header # вливаем в master изменения из ветки new-page-header git branch -d new-page-header # удаляем ветку new_page_header
Работа с ветками, слияние и откат к состоянию до слияния
Была ветка fix
, в которой исправляли баг. Исправили, влили fix
в master
. но тут выяснилось, что это исправление ломает какую-то функциональность, Нужно откатить master
к состоянию без слияния (наличие бага менее критично, чем порча функциональности).
# находимся в ветке fix, баг уже «исправлен» git checkout master # переключаемся на master git merge fix # вливаем изменения из fix в master # видим проблему: часть функциональности сломалась git checkout fix # переключаемся на fix (пока мы в master, git не даст ее двигать) git branch -f master ORIG_HEAD # передвигаем ветку master на коммит, указанный в ORIG_HEAD (тот, на который указывала master до вливания fix)
Работа с ветками, конфликт слияния
Есть ветка master
(публичная версия сайта), в двух параллельных ветках (branch-1
и branch-2
) было отредактировано одно и то же место одного и того же файла, первую ветку (branch-1
) влили в master, попытка влить вторую вызывает конфликт.
# указана последовательность действий: git checkout master # переключаемся на ветку master git checkout -b branch-1 # создаём ветку branch-1, основанную на ветке master subl . # редактируем и сохраняем файлы git commit -a -m "Правка 1" # коммитим git checkout master # возвращаемся к ветке master git checkout -b branch-2 # создаём ветку branch-2, основанную на ветке master subl . # редактируем и сохраняем файлы git commit -a -m "Правка 2" # коммитим git checkout master # возвращаемся к ветке master git merge branch-1 # вливаем изменения из ветки branch-1 в текущую ветку (master), удача (автослияние) git merge branch-2 # вливаем изменения из ветки branch-2 в текущую ветку (master), КОНФЛИКТ автослияния # Automatic merge failed; fix conflicts and then commit the result. subl . # выбираем в конфликтных файлах те участки, которые нужно оставить, сохраняем git commit -a -m "Устранение конфликта" # коммитим результат устранения конфликта
Синхронизация репозитория-форка с мастер-репозиторием
Есть некий репозиторий на github.com, он него нами был сделан форк, добавлены какие-то изменения. Оригинальный (мастер-)репозиторий был как-то обновлён. Задача: стянуть с мастер-репозитория изменения (которые там внесены уже после того, как мы его форкнули).
# указана последовательность действий: git remote add upstream https://github.com:address.git # добавляем удаленный репозиторий: сокр. имя — upstream, URL мастер-репозитория git fetch upstream # стягиваем все ветки мастер-репозитория, но пока не сливаем со своими git checkout master # переключаемся на ветку master своего репозитория git merge upstream/master # вливаем стянутую ветку master удалённого репозитория upstream в свою ветку master
Ошибка в работе: закоммитили в мастер, но поняли, что нужно было коммитить в новую ветку
ВАЖНО: это сработает только если коммит еще не отправлен в удалённый репозиторий.
# указана последовательность действий: # сделали изменения, проиндексировали их, закоммитили в master, но ЕЩЁ НЕ ОТПРАВИЛИ (не делали git push) git checkout -b new-branch # создаём новую ветку из master git checkout master # переключаемся на master git reset HEAD~ --hard # сдвигаем указатель (ветку) master на 1 коммит назад git checkout new-branch # переключаемся обратно на новую ветку для продолжения работы
Нужно вернуть содержимое файла к состоянию, бывшему в каком-либо коммите (известен хеш коммита)
# указана последовательность действий: git checkout f26ed88 -- index.html # восстановить в рабочей директории состояние указанного файла на момент указанного коммита, добавить это изменение в индекс git commit -am "Navigation fixs" # сделать коммит
При любом действии с github (или другим удалённым сервисом) запрашивается логин и пароль
Речь именно о запросе пары логин + пароль, а не ключевой фразы. Происходит это потому, что git по умолчанию не сохранит пароль для доступа к репозиторию по HTTPS.
Простое решение: указать git кешировать ваш пароль.
.gitattributes
* text=auto
*.html diff=html
*.css diff=css
*.scss diff=css