---
description: VCS - Version Control System
---

# Git

Репозиторий программного кода позволяет команде совместно работать над проектом, автоматически разрешает большое количество конфликтов совместного редактирования. Позволяет фиксировать состояние при помощи тегов и вести разработку в отдельных ветках. Объединять изменения сделанные в различных ветках и репозиториях, получать доступ к истории изменений.

По структуре репозитория можно сделать вывод о профессиональном уровне разработчиков. Так в частности анализируется:

* Как команда работает с репозиторием (gitflow, теги для релизных версий, организация ветвления)
* Как команда пишет комментарии к комитам
  * Являются ли комиты атомарными (только одно изменение за раз или комментарий об одном а изменения в том числе о другом)

**Области для изучения**

* [Cherry pick](https://www.atlassian.com/git/tutorials/cherry-pick) - выборочный перенос комитов других веток в текущую
* [Squash](https://www.devroom.io/2011/07/05/git-squash-your-latests-commits-into-one/) - объединение связанных комитов

**Git сценарии**

* git revert -  делает новый коммит, в котором отменяет все изменения из указанного:  \
  git revert <хэш коммита>
*  Если вы сделали коммит, но забыли внести в него некоторые файлы, вы можете отменить коммит, сохранив все ваши изменения на диске:&#x20;  git reset --soft HEAD\~1
*  Чтобы удалить последний коммит вместе с изменениями в файлах, вы можете воспользоваться командой:  &#x20;git reset --hard HEAD\~1
*  Вы также можете откатить несколько последних коммитов. К примеру:  &#x20;git reset --hard HEAD\~3
*  Если вы сделали коммит не в той ветке, вы можете легко скопировать его в нужную, используя команду:  &#x20;git cherry-pick <хэш коммита>
*  Если вы случайно закоммитили файл, который не должен был попасть в индекс репозитория (например, конфигурационный файл или лог), добавление его в .gitignore уже не поможет. Все будущие изменения этого файла будут фиксироваться Git-ом.  &#x20;Чтобы убрать файл из индекса, не удаляя его из директории, можно использовать следующую команду:  &#x20;git rm --cached path-to/file.txt
* git pull --rebase  # забрать изменения и свои незалитые файлы расположить поверх
*  создаем некую ветку на основании бренча develop для реализации новой фичи  &#x20;git checkout -b my\_feature develop
*  Флаг --no-ff вынуждает Git всегда создавать новый объект коммита при слиянии, даже если слияние может быть осуществлено алгоритмом fast-forward. Это позволяет не терять информацию о том, что ветка существовала, и группирует вместе все внесённые изменения.&#x20;
*  Добавить что то к предыдущему комиту  &#x20;git commit -amend
*  Текущее состояние индекса можно посмотреть командой git status:
* &#x20;Посмотреть комиты в удаленный репозиторий git log

![](https://621469499-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lk33ExZ9AulnEh_PKUM%2F-LvaIiLrum0uDvlkje-G%2F-LvaIpTcCg1oOLI49k5y%2Fgit.png?alt=media\&token=6303043c-1b0e-4309-a73d-ded700057ce9)

**Дополнительные источники**

* Базовий курс по роботі з git для повних новачків [https://www.youtube.com/watch?v=SEvR78OhGtw](https://www.youtube.com/watch?v=SEvR78OhGtw)
* [Руководство по git (ч1) и gitflow (ч2)  &#x20;](https://youtu.be/9iWVaJpeDA8)
* [Расширенные функции Git](https://habr.com/ru/post/472600/)
* [Sthash и rebase  ](http://blog.nsws.ru/bolee-pravilnaya-rabota-s-git-git-stash-i-git-rebase.html)&#x20;



