Я пишу информационный бюллетень для учащихся под названием Mighty Knowledge. Каждый новый выпуск содержит ссылки и основные уроки из самого лучшего контента, включая цитаты, книги, статьи, подкасты и видео. Каждый выбран специально для того, чтобы научиться жить более мудрой, счастливой и полной жизнью. Зарегистрируйтесь здесь.

Вы недавно начали использовать Git? Или, может быть, вы использовали его какое-то время, но его многие загадки все еще сбивают с толку.

Git - это прежде всего система контроля версий и основа любого проекта разработки программного обеспечения. Обычно он служит двум основным целям: резервное копирование кода и управление версиями кода. Вы можете работать над кодом шаг за шагом, сохраняя прогресс каждого шага на тот случай, если вам понадобится откат к резервной копии!

Распространенная проблема заключается в том, что Git сложно использовать. Бывают случаи, когда версии и ветки не синхронизированы, и вы тратите много времени, просто пытаясь продвинуть свой код! Хуже того, незнание того, как именно работают определенные команды, может легко привести к случайному удалению или перезаписи битов кода!

Вот почему я подготовил это руководство, чтобы научить вас правильно использовать git, чтобы мы все могли приступить к программированию!

Установить и настроить

Установка

Прежде всего, мы должны установить git, чтобы использовать его! Мы можем сделать это быстро и легко с помощью apt:

sudo apt install git-all

Базовая настройка

При желании вы можете сохранить свое имя пользователя и адрес электронной почты git, чтобы вам не приходилось вводить их снова для будущих команд git.

git config --global user.name "User Name"
git config --global user.email "email"

Цвета

Изящный трюк, который некоторые люди часто упускают, заключается в том, что вы можете включить дополнительную раскраску для git, чтобы вам было легче читать вывод команд!

git config --global color.ui true

Базовый контроль версий

Инициализация git

Теперь мы можем приступить к управлению версиями нашего проекта. Идите дальше и перейдите в каталог, для которого вы хотите настроить контроль версий в терминале, используя стандартную команду «cd». Теперь вы можете инициализировать репозиторий git следующим образом:

git init

Это создает новый подкаталог с именем .git, содержащий все необходимые файлы репозитория - скелет репозитория Git. На данный момент в вашем проекте еще ничего не отслеживается.

Добавление и фиксация

Чтобы начать управление версиями существующих файлов, вы должны начать с отслеживания этих файлов и выполнить первоначальную фиксацию. Для этого вы начинаете с добавления в git файлов, которые хотите прикрепить к своему проекту git.

git add <file>
git commit -m 'first commit'

Удаленное резервное копирование

Большой! Вы начали создавать версии своего проекта GitHub локально. Если вы хотите сохранить и сделать резервную копию своего проекта удаленно, вам необходимо создать удаленный репозиторий на GitHub (это бесплатно!). Итак, сначала зайдите на github.com и создайте репозиторий. Затем используйте ссылку репозитория, чтобы добавить его в качестве origin вашего локального проекта git, то есть где этот код будет храниться.

### General example
git remote add origin \
https://github.com/user/repo.git 
### An example with a repository of mine
git remote add origin \
https://github.com/GeorgeSeif/Semantic-Segmentation-Suite.git

Затем вы можете отправить свой код на GitHub… альт! Вы создали резервную копию своего кода!

git push origin master

Работа с вашими файлами

Проверка статуса

Главный инструмент, который вы используете для определения того, какие файлы в каком состоянии находятся, - это команда git status. Это позволяет вам видеть, какие из ваших файлов уже зафиксированы, а какие нет. Если вы запустите эту команду, когда все файлы уже зафиксированы и отправлены, вы должны увидеть что-то вроде этого:

$ git status
# On branch master
nothing to commit (working directory clean)

Если вы добавляете новый файл в свой проект, а этот файл раньше не существовал, при запуске $ git status вы должны увидеть неотслеживаемый файл следующим образом:

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   README
nothing added to commit but untracked files present (use "git add" to track)

Это делает $ git status действительно полезным для быстрой проверки того, что вы уже скопировали, а что есть только локально.

Расширенное добавление файлов

Есть еще несколько дополнительных способов добавления файлов в Git, которые сделают ваш рабочий процесс более эффективным. Вместо того, чтобы искать все файлы с изменениями и добавлять их один за другим, мы можем сделать следующее:

### Adding files one by one
git add filename

### Adding all files in the current directory
git add -A

### Adding all files changes in the current directory
git add .

### Choosing what changes to add (this will got through all your  ### changes and you can 'Y' or 'N' the changes)
git add -p

Продвинутые коммиты

Ранее мы видели, что можем зафиксировать файл в Git, используя $ git commit -m "commit message". Это нормально для коротких сообщений о фиксации, но если вы хотите сделать что-то более сложное, вам понадобится немного больше:

### Commit staged file(s) 
### This is typically used for shorter commit messages
git commit -m 'commit message'

### Add file and commit in one shot
git commit filename -m 'commit message'

### Add file and commit staged file
git commit -am 'insert commit message'

### Changing your most recent commit message
git commit --amend 'new commit message' 

# Combine a sequence of commits together into a single one 
### You might use this to organise a messy commit history
git rebase -i
### This will give you an interface on your core editor:
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell

Ветвление и слияние

Ветвь master вашего репозитория GitHub всегда должна содержать рабочий и стабильный код. Однако вы можете также сделать резервную копию некоторого кода, над которым вы сейчас работаете, но который не является полностью стабильным. Может быть, вы добавляете новую функцию, много экспериментируете и ломаете код, но все же хотите сохранить резервную копию, чтобы сохранить свой прогресс!

Ветвление позволяет вам работать с отдельной копией вашего кода, не затрагивая главную ветвь. Когда вы впервые создаете ветку, под новым именем создается полный клон вашей главной ветки. Затем вы можете независимо изменить код в этой новой ветке, включая фиксацию файлов и т. Д. После того, как новая функция будет полностью интегрирована и код станет стабильным, вы объедините ее в главную ветку!

Разветвление

Вот все, что вам нужно для создания ветки и работы с ней:

### Create a local branch to work on
git checkout -b branchname

### Switching between 2 branches 
git checkout branch_1
git checkout branch_2
### Pushing your new local branch to remote as backup
git push -u origin branch_2

### Deleting a local branch - this won't let you delete a branch  ### that hasn't been merged yet
git branch -d branch_2

### Deleting a local branch - this WILL delete a branch even if it ### hasn't been merged yet!
git branch -D branch_2

### Viewing all current branches for the repository, including both ### local and remote branches. Great to see if you already have a ### branch for a particular feature addition, especially on bigger ### projects
git branch -a

### Viewing all branches that have been merged into your current  ### branch, including local and remote. Great for seeing where all ### your code has come from!
git branch -a --merged

### Viewing all branches that haven't been merged into your current ### branch, including local and remote
git branch -a --no-merged

### Viewing all local branches
git branch

### Viewing all remote branches
git branch -r

# Rebase master branch into local branch
$ git rebase origin/master

# Pushing local branch after rebasing master into local branch
$ git push origin +branchname

Слияние

Большой! Теперь вы узнали, как создать ветку и работать с этим кодом! Когда вы закончите добавлять новую функцию в свою ветку, вы захотите снова объединить ее с главной веткой, чтобы у вашего мастера были все новейшие функции кода.

Вот как это сделать:

### First make sure you're looking at master branch
git checkout master

### Now merge your branch to master
git merge branch_2

Вот и все! возможно, вам придется исправить любые конфликты кода между вашей веткой и мастером, но Git покажет вам, как это сделать, после того, как вы введете эту команду слияния.

Исправление ошибок и возврат

Ошибки случаются…. и они часто случаются с кодированием! Важно то, что мы можем их исправить.

Здесь не бойтесь! В Git есть все, что вам нужно на случай, если вы ошиблись с введенным кодом, что-то перезаписали или просто хотите исправить что-то, что вы нажали.

### Switch to the version of the code of the most recent commit
git reset HEAD 
git reset HEAD -- filename # for a specific file
### Switch to the version of the code before the most recent commit
git reset HEAD^ -- filename
git reset HEAD^ -- filename # for a specific file
### Switch back 3 or 5 commits
git reset HEAD~3 -- filename
git reset HEAD~3 -- filename # for a specific file
git reset HEAD~5 -- filename
git reset HEAD~5 -- filename # for a specific file
### Switch back to a specific commit
### Where the '0766c053' is the commit ID
git reset 0766c053 -- filename
git reset 0766c053 -- filename # for a specific file
### The previous commands were what's known as "soft" resets. Your ### code is reset, but git will still keep a copy of the other code ### handy in case you need it. On the other hand, the --hard flag ### tells Git to overwrite all changes in the working directory.
git reset --hard 0766c053

Полезные советы и рекомендации для Git

Мы все закончили с мелкими мелочами! Вот еще несколько советов и приемов Git, которые могут оказаться полезными для улучшения рабочего процесса!

Searching

### Searches for parts of strings in a directory
git grep 'something'

### Searches for parts of strings in a directory and the -n prints ### out the line numbers where git has found matches
git grep -n 'something'

### Searches for parts of string with some context (some lines 
### before and some after the 'something' we are looking for)
git grep -C<number of lines> 'something'

### Searches for parts of string and also shows lines BEFORE it
git grep -B<number of lines> 'something'

### Searches for parts of string and also shows lines AFTER it
git grep -A<number of lines> 'something'

Видя, кто что написал

### Show alteration history of a file with the name of the author
git blame 'filename'

### Show alteration history of a file with the name of the author ### and the git commit ID
git blame 'filename' -l

логирование

### Show a list of all commits in a repository. This command shows ### everything about a commit, such as commit ID, author, date and ### commit message.
git log

### List of commits showing only commit messages and changes
git log -p

### List of commits with the particular string you are looking for
git log -S 'something'

### List of commits by author
git log --author 'Author Name'

### Show a summary of the list of commits in a repository. This   ### shows a shorter version of the commit ID and the commit message.
git log --oneline

### Show a list of commits in a repository since yesterday
git log --since=yesterday

### Shows log by author and searching for specific term inside the ### commit message
git log --grep "term" --author "name"