update Russian translation (#286)

This commit is contained in:
Artem Buslov 2019-10-15 14:24:03 +03:00 committed by Richard Littauer
parent 40a542d31a
commit e0ff2c06b9
1 changed files with 214 additions and 76 deletions

View File

@ -20,7 +20,6 @@
Приведенные команды работают на Git версии 2.13.0 и выше. Для обновления Вашей версии Git посетите [вебсайт Git](https://www.git-scm.com/).
[![Заходите в чат https://gitter.im/k88hudson/git-flight-rules](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/k88hudson/git-flight-rules?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
@ -29,6 +28,9 @@
- [Я хочу создать локальный репозиторий](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9)
- [Я хочу клонировать удаленный репозиторий](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BA%D0%BB%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9)
- [Я неправильно задал удаленный репозиторий](#%D0%AF-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BB-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9)
- [Я хочу добавить код в чужой репозиторий](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BA%D0%BE%D0%B4-%D0%B2-%D1%87%D1%83%D0%B6%D0%BE%D0%B9-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9)
- [Предложение кода с помощью пулл-реквестов](#%D0%9F%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%B4%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-%D0%BF%D1%83%D0%BB%D0%BB-%D1%80%D0%B5%D0%BA%D0%B2%D0%B5%D1%81%D1%82%D0%BE%D0%B2)
- [Мне нужно обновить свой форк последними изменениями из исходного репозитория](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%B2%D0%BE%D0%B9-%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC%D0%B8-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8-%D0%B8%D0%B7-%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F)
- [Редактирование коммитов](#%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2)
- [Что я только что сохранил?](#%D0%A7%D1%82%D0%BE-%D1%8F-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D1%87%D1%82%D0%BE-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB)
- [Я неправильно написал сообщение коммита](#%D0%AF-%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE-%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BB-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0)
@ -40,6 +42,10 @@
- [Я случайно сделал жесткий сброс (--hard) и теперь хочу вернуть свои изменения](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D0%B6%D0%B5%D1%81%D1%82%D0%BA%D0%B8%D0%B9-%D1%81%D0%B1%D1%80%D0%BE%D1%81---hard-%D0%B8-%D1%82%D0%B5%D0%BF%D0%B5%D1%80%D1%8C-%D1%85%D0%BE%D1%87%D1%83-%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C-%D1%81%D0%B2%D0%BE%D0%B8-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F)
- [Я случайно опубликовал ненужное слияние](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BB-%D0%BD%D0%B5%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%D0%B5-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5)
- [Я случайно закоммитил и опубликовал файлы с конфиденциальными данными](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D0%B7%D0%B0%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B8%D0%BB-%D0%B8-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BB-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B4%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8)
- [Я хочу удалить большой файл из истории репозитория](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C-%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9-%D1%84%D0%B0%D0%B9%D0%BB-%D0%B8%D0%B7-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F)
- [Рекомендуемый способ: Использование bfg](#%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D0%BC%D1%8B%D0%B9-%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1-%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-bfg)
- [Встроенный способ: Использование git-filter-branch](#%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1-%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-git-filter-branch)
- [Финальный шаг: Публикация измененной истории репозитория](#%D0%A4%D0%B8%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D1%88%D0%B0%D0%B3-%D0%9F%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F)
- [Мне нужно изменить содержимое коммита, который не является последним](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9-%D0%BD%D0%B5-%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC)
- [Подготовка изменений (staging)](#%D0%9F%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-staging)
- [Мне нужно добавить подготовленные изменения в предыдущий коммит](#%D0%9C%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-%D0%BF%D1%80%D0%B5%D0%B4%D1%8B%D0%B4%D1%83%D1%89%D0%B8%D0%B9-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82)
@ -115,6 +121,7 @@
- [Я хочу откатить файл до заданной ревизии](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BE%D1%82%D0%BA%D0%B0%D1%82%D0%B8%D1%82%D1%8C-%D1%84%D0%B0%D0%B9%D0%BB-%D0%B4%D0%BE-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9-%D1%80%D0%B5%D0%B2%D0%B8%D0%B7%D0%B8%D0%B8)
- [Я хочу получить список изменений в заданном файле из разных коммитов или веток](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%BC-%D1%84%D0%B0%D0%B9%D0%BB%D0%B5-%D0%B8%D0%B7-%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2-%D0%B8%D0%BB%D0%B8-%D0%B2%D0%B5%D1%82%D0%BE%D0%BA)
- [Я хочу, чтобы Git игнорировал изменения в определенном файле](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D1%87%D1%82%D0%BE%D0%B1%D1%8B-git-%D0%B8%D0%B3%D0%BD%D0%BE%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BB-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC-%D1%84%D0%B0%D0%B9%D0%BB%D0%B5)
- [Отладка с помощью Git](#%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-git)
- [Конфигурация](#%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F)
- [Я хочу добавить псевдонимы для некоторых команд Git](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D0%BD%D0%B8%D0%BC%D1%8B-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D1%85-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4-git)
- [Я хочу добавить в свой репозиторий пустую папку](#%D0%AF-%D1%85%D0%BE%D1%87%D1%83-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B2-%D1%81%D0%B2%D0%BE%D0%B9-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9-%D0%BF%D1%83%D1%81%D1%82%D1%83%D1%8E-%D0%BF%D0%B0%D0%BF%D0%BA%D1%83)
@ -146,7 +153,7 @@
### Я хочу клонировать удаленный репозиторий
Чтобы клонировать (копировать) удаленный репозиторий, скопируйте адрес репозиторий и запустите:
Чтобы клонировать (копировать) удаленный репозиторий, скопируйте URL репозитория и запустите:
```sh
$ git clone [url]
@ -166,7 +173,7 @@ $ git clone [url] name-of-new-folder
Если Вы склонировали неправильный репозиторий, то просто удалите появившуюся папку и склонируйте правильный репозиторий.
Если Вы неправильно настроили origin для существующего локального репозиторий, то измените адрес origin на правильный с помощью:
Если Вы неправильно настроили origin для существующего локального репозиторий, то измените URL-адрес origin на правильный с помощью:
```sh
$ git remote set-url origin [правильный url]
@ -174,10 +181,82 @@ $ git remote set-url origin [правильный url]
См. [подробнее на StackOverflow](https://stackoverflow.com/questions/2432764/how-to-change-the-uri-url-for-a-remote-git-repository#2432799).
### Я хочу добавить код в чужой репозиторий
Git не разрешает добавлять код в чужой репозиторий без соответствующих прав доступа. Так же, как и GitHub, который, вообще говоря, не является самим Git-ом, а скорее хостингом для репозиториев Git. Тем не менее, вы можете предложить код посредством патчей или, на GitHub, посредством форков (ответвлений) и пулл-реквестов (запросов на слияние).
Сначала немного о форках. Форк - это копия репозитория. Эта операция не имеет прямого отношения к Git, это общая операция на GitHub, Bitbucket, GitLab и на других хостингах репозиториев Git. Вы можете сделать форк с помощью веб-интерфейса.
#### Предложение кода с помощью пулл-реквестов
После создания форка вам нужно склонировать репозиторий на свой компьютер. Вы можете сделать мелкие правки прямо на GitHub без клонирования, но это не "Правила полёта на GitHub", так что рассмотрим, как это сделать у себя на компьютере.
```sh
# если вы используете SSH
$ git clone git@github.com:k88hudson/git-flight-rules.git
# если вы используете HTTPS
$ git clone https://github.com/k88hudson/git-flight-rules.git
```
Если перейти в появившийся каталог и ввести команду `git remote`, то напечатается список ссылок на удаленные репозитории. Обычно будет единственная ссылка `origin`, которая будет указывать на `k88hudson/git-flight-rules`. Ещё вам понадобится ссылка на ваш форк.
Следуя общепринятым соглашениям, название `origin` используется для вашего собственного репозитория, а `upstream` - для исходного репозитория, с которого вы сделали форк. Так что переименуем `origin` в `upstream`
```sh
$ git remote rename origin upstream
```
Вместо этого можно использовать `git remote set-url`, но это дольше и требует больше действий.
Теперь настроим удаленную ссылку на ваш собственный репозиторий.
```sh
$ git remote add origin git@github.com:YourName/git-flight-rules.git
```
Обратите внимание, что у вас два удаленных репозитория.
- `origin` ссылается на ваш собственный репозиторий.
- `upstream` ссылается на исходный репозиторий.
Репозиторий origin доступен для чтения и записи, тогда как upstream доступен только для чтения.
Когда вы сделаете изменения, которые хотели, отправьте свои изменения (которые обычно делаются в отдельной ветке) в репозиторий `origin`. Если вы делаете изменения в отдельной ветке, то удобно пользоваться опцией `--set-upstream`, чтобы в будущем при отправке данной локальной ветки не приходилось каждый раз указывать удаленную ветку. Например:
```sh
$ (feature/my-feature) git push --set-upstream origin feature/my-feature
```
Git не располагает командами для создания пулл-реквестов (хотя есть внешние инструменты вроде [hub](http://github.com/github/hub)). Так что, когда подготовите необходимые изменения, открывайте GitHub (или другой сервер Git) и создавайте пулл-реквест. Обратите внимание, что сервер автоматически связывает исходный репозиторий и форк.
После этого не забудьте добавить описание предлагаемых изменений.
#### Мне нужно обновить свой форк последними изменениями из исходного репозитория
Со временем репозиторий `upstream` может обновиться, и эти обновления нужно внести в ваш репозиторий `origin`. Не забывайте, что другие люди тоже вносят свои изменения. Предположим, вы находитесь на ветке для своей фичи и вам нужно её обновить согласно последним изменениям исходного репозитория.
Возможно, вы уже настроили ссылку на исходный удаленный репозиторий. Если нет, тогда сделайте это сейчас. Обычно исходный удаленный репозиторий называют `upstream`:
```sh
$ (master) git remote add upstream <link-to-original-repository>
# $ (master) git remote add upstream git@github.com:k88hudson/git-flight-rules.git
```
Теперь вы можете получить последние обновления из upstream.
```sh
$ (master) git fetch upstream
$ (master) git merge upstream/master
# или одной командой
$ (master) git pull upstream master
```
## Редактирование коммитов
<a name="diff-last"></a>
### Что я только что сохранил?
Допустим, Вы не глядя сохранили изменения с помощью `git commit -a` и теперь не уверены что именно сохранили. В таком случае Вы можете просмотреть последний коммит в HEAD с помощью:
@ -215,7 +294,6 @@ $ git commit --amend --only -m 'xxxxxxx'
Если Вы уже сделали `push`, то Вы по-прежнему можете исправить коммит, но после этого придется делать `push` с принудительной перезаписью, что не рекомендуется.
<a name="commit-wrong-author"></a>
### Я сделал коммит с неправильным именем автора и адресом электронной почты
Если это один коммит, то исправьте его с помощью `amend`
@ -252,7 +330,6 @@ $ git commit --amend --no-edit
Это особенно полезно, когда у Вас открытый патч, а Вы сохранили ненужный файл и теперь нужно сделать принудительный `push` для обновления патча в удаленном репозитории. Опция `--no-edit` оставляет прежнее сообщение коммита без изменений.
<a name="delete-pushed-commit"></a>
### Я хочу удалить последний коммит
Если хотите удалить опубликованные коммиты, воспользуйтесь приведенным ниже приемом. Однако, это бесповоротно изменит у Вас историю Git, а также испортит историю Git у любого, что уже стянул (pull) изменения из репозитория. Короче говоря, никогда так не делайте, если не уверены.
@ -272,7 +349,6 @@ $ git push --force-with-lease [remote] [branch]
Это работает, если Вы еще не сделали `push`. Если Вы уже сделали `push`, то единственный по-настоящему безопасный способ это `git revert SHAofBadCommit`. Это создаст новый коммит, который отменит все изменения предыдущего коммита. Или, если ветка, в которую вы делаете `push` безопасна для перезаписи (т.е. не предполагается, другие разработчики будут стягивать из нее изменения), то просто используйте `git push --force-with-lease`. Подробнее см. [в этом пункте выше](#delete-pushed-commit).
<a name="delete-any-commit"></a>
### Удалить произвольный коммит
Здесь уместны те же предупреждения, что и в пункте выше. По возможности, никогда так не делайте.
@ -285,7 +361,6 @@ $ git push --force-with-lease [remote] [branch]
Или сделайте [интерактивное перебазирование](#interactive-rebase) и удалите строки ненужных коммитов.
<a name="#force-push"></a>
### Я пытаюсь опубликовать исправленный коммит, но получаю сообщение об ошибке
```sh
@ -309,7 +384,6 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Если Вы *абсолютно* уверены, что никто кроме Вас не работает с данной веткой или Вы хотите обновить вершину ветви в любом случае, то используйте `--force` (`-f`), но вообще этого следует избегать.
<a href="undo-git-reset-hard"></a>
### Я случайно сделал жесткий сброс (--hard) и теперь хочу вернуть свои изменения
Если Вы случайно сделали `git reset --hard`, то вы можете вернуть назад коммиты, т.к. Git несколько дней хранит все действия в журнале.
@ -372,6 +446,77 @@ echo sensitive_file >> .gitignore
Если Вы успели сделать другие коммиты после коммита с конфиденциальными данными, то Вам нужно использовать rebase.
<a href="#i-want-to-remove-a-large-file-from-ever-existing-in-repo-history"></a>
### Я хочу удалить большой файл из истории репозитория
Если вы хотите удалить пароль или другую конфиденциальную информацию, то вместо этого смотрите [Я случайно закоммитил и опубликовал файлы с конфиденциальными данными](#%D0%AF-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE-%D0%B7%D0%B0%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B8%D0%BB-%D0%B8-%D0%BE%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%D0%BB-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B4%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8).
Даже если вы удалите большие или ненужные файлы из последнего коммита, они останутся в истоии Git, в подкаталоге `.git` вашего репозитория и `git clone` будет загружать ненужные файлы.
Действия, описанные в этой части руководства требуют принудительной перезаписи истории репозитория Git, так что, если вы сотрудничаете с удаленными разработчиками, что сначала убедитесь, что они опубликовали на сервере все свои локальные изменения.
Есть два способа переписывания истории: встроенная команда `git-filter-branch` и сторонняя программа [`bfg-repo-cleaner`](https://rtyley.github.io/bfg-repo-cleaner/). `bfg` значительно понятнее в использовании и быстрее по производительности, но её нужно устанавливать отдельно и она требует Java. Мы опишем оба этих способа. Финальный шаг - это принудительный push ваших изменений, который мы обсудим отдельно, поскольку, в отличие от обычного принудительного push, он приводит к масштабной безвозвратной перезаписи истории.
#### Рекомендуемый способ: Использование bfg
Использование bfg-repo-cleaner требует наличия Java. Скачайте bfg jar-файл по ссылке [здесь](https://rtyley.github.io/bfg-repo-cleaner/). В наших примерах будет использоваться `bfg.jar`, а загруженный вами файл будет содержать в названии номер версии, например, `bfg-1.13.0.jar`.
Чтобы удалить определенный файл:
```sh
(master)$ git rm path/to/filetoremove
(master)$ git commit -m "Commit removing filetoremove"
(master)$ java -jar ~/Downloads/bfg.jar --delete-files filetoremove
```
Заметьте, что в bfg вы должны использовать имя файла без пути, даже если файл находится в подкаталоге.
Также вы можете пользоваться шаблонами имен:
```sh
(master)$ git rm *.jpg
(master)$ git commit -m "Commit removing *.jpg"
(master)$ java -jar ~/Downloads/bfg.jar --delete-files *.jpg
```
При использовании bfg, файлы, существующие в вашем последнем коммите не будут затронуты. Например, если в вашем репозитории было много больших .tga файлов, а потом вы удалили несколько из них, то bfg не тронет файлы, которые присутствуют в последнем коммите.
Заметьте, что если вы переименовали файл в коммите, например, если он сначала назывался `LargeFileFirstName.mp4` и коммит переименовал его в `LargeFileSecondName.mp4`, то запуск `java -jar ~/Downloads/bfg.jar --delete-files LargeFileSecondName.mp4` не удалит его из истории Git. В таком случае запустите команду `--delete-files` с обоими именами или с шаблоном имен.
#### Встроенный способ: Использование git-filter-branch
Команду `git-filter-branch` сложнее использовать и она имеет меньше возможностей, но вы можете ей воспользоваться, если не хотите пользоваться `bfg`.
В приведенной ниже команде замените `filepattern` на требуемое имя или шаблон, например, `*.jpg`. Эта команда удалит файлы, подходящие под заданный шаблон из истории всех ветвей.
```sh
(master)$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch filepattern' --prune-empty --tag-name-filter cat -- --all
```
Пояснения:
`--tag-name-filter cat` - это неуклюжий, но в то же время самый простой способ применить исходные метки к новым коммитам с помощью команды cat.
`--prune-empty` удаляет все коммиты, которые теперь стали пустыми.
#### Финальный шаг: Публикация измененной истории репозитория
Как только вы удалили файлы, которые хотели, внимально проверьте, что ничего не сломали в репозитории - если сломали, то проще всего склонировать ваш репозиторий и начать снова.
Для завершения вы можете опционально запустить сборщик мусора Git, чтобы минимизировать размер локальной папки .git folder size, а после этого сделать принудительный push.
```sh
(master)$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
(master)$ git push origin --force --tags
```
После того, как вы переписали всю историю репозитория, операция `git push` может оказаться слишком большой и вернет ошибку `“The remote end hung up unexpectedly” (Удаленный хост неожиданно прервал соединение)`. Если это произошло, то попробуйте увеличить размер буфера передачи:
```sh
(master)$ git config http.postBuffer 524288000
(master)$ git push --force
```
Если это не работает, то вам придется делать push частями. В команде ниже пробуйте увеличивать `<number>` пока push не сработает.
```sh
(master)$ git push -u origin HEAD~<number>:refs/head/master --force
```
После того как только команда push сработала в первый раз, постепенно уменьшайте `<number>`, пока не сработает обычная `git push`.
<a href="i-need-to-change-the-content-of-a-commit-which-is-not-my-last"></a>
### Мне нужно изменить содержимое коммита, который не является последним
@ -413,11 +558,9 @@ pick f4037ec The last commit
сделает оставшуюся работу за Вас.
## Подготовка изменений (staging)
<a href="#i-need-to-add-staged-changes-to-the-previous-commit"></a>
### Мне нужно добавить подготовленные изменения в предыдущий коммит
```sh
@ -432,7 +575,6 @@ pick f4037ec The last commit
<a name="commit-partial-new-file"></a>
### Я хочу подготовить только часть файла, а не весь файл целиком
Обычно, если хотите подготовить часть файл, Вы запускаете:
@ -451,7 +593,6 @@ $ git add -N filename.x
`git diff --staged`, Вы увидите какие строки вы подготовили по-сравнению с тем, что сохранено в рабочей копии.
<a href="stage-in-two-commits"></a>
### Я хочу добавить изменения одного файла в два разных коммита
`git add` добавляет в коммит весь файл целиком. `git add -p` позволяет интерактивно выбрать изменения, которые Вы хотите добавить.
@ -462,7 +603,6 @@ $ git add -N filename.x
`git reset -p` откроет интерактивный диалог сброса. Это похоже на `git add -p`, за исключением того, что выбор "yes" уберёт правку из готовящегося коммита.
<a href="unstaging-edits-and-staging-the-unstaged"></a>
### Я хочу подготовить свои неподготовленные правки и убрать из подготовки то, что уже подготовлено
Это сложно. Лучшее, что я смог придумать это отложить (stash) неподготовленные изменения. Затем сделать сброс. После этого вернуть отложенные изменения и добавить их.
@ -477,7 +617,6 @@ $ git add -A
## Неподготовленные правки
<a href="move-unstaged-edits-to-new-branch"></a>
### Я хочу переместить мои неподготовленные правки в новую ветку
```sh
@ -485,7 +624,6 @@ $ git checkout -b my-branch
```
<a href="move-unstaged-edits-to-old-branch"></a>
### Я хочу переместить неподготовленные правки в другую существующую ветку
```sh
@ -495,7 +633,6 @@ $ git stash pop
```
<a href="i-want-to-discard-my-local-uncommitted-changes"></a>
### Я хочу отменить мои локальные несохраненные изменения (подготовленные и неподготовленные)
Если Вы хотите отменить все подготовленные и неподготовленные изменения, то можете сделать так:
@ -587,9 +724,7 @@ $ git checkout myFirstFile mySecondFile
```sh
$ git checkout .
```
<a href="i-want-to-discard-all-my-untracked-files"></a>
### Я хочу удалить все неотслеживаемые файлы
Когда Вы хотите удалить все неотслеживаемые файлы
@ -632,15 +767,12 @@ $ git branch -a
```
<a name="create-branch-from-commit"></a>
### Создать ветку на определенном коммите
```sh
$ git checkout -b <branch> <SHA1_OF_COMMIT>
```
<a name="pull-wrong-branch"></a>
### Я стянул изменения (pull) из неправильной ветки или в неправильную ветку
Это очередная возможность воспользоваться `git reflog`, чтобы посмотреть куда указывала ваша HEAD перед неправильным pull.
@ -660,7 +792,6 @@ $ git reset --hard c5bc55a
Готово.
<a href="discard-local-commits"></a>
### Я хочу отменить локальные коммиты, чтобы моя ветка стала такой же как на сервере
Подтвердите, что не хотите отправлять изменения на сервер.
@ -682,7 +813,6 @@ $ git reset --hard c5bc55a
```
<a name="commit-wrong-branch"></a>
### Я сохранил коммит в ветку master вместо новой ветки
Создайте новую ветку, оставаясь на master:
@ -717,7 +847,6 @@ HEAD is now at a13b85e
```
<a name="keep-whole-file"></a>
### Я хочу сохранить файл целиком из другого ref-ish
Скажем, у Вас рабочий spike (см. заметку) на сотни изменений. Всё работает. Теперь Вы сохраняете эту работу в другую ветку:
@ -755,7 +884,6 @@ HEAD is now at a13b85e
Заметка: Spike-решения делаются для анализа или решения проблемы. Эти решения используют, чтобы оценить проблему, и отбрасывают сразу же, как только все получают ясное представление о проблеме. ~ [Wikipedia](https://en.wikipedia.org/wiki/Extreme_programming_practices).
<a name="cherry-pick"></a>
### Я сделал несколько коммитов в одной ветке, а нужно было сохранять их в разных ветках
Скажем, Вы в ветке master. Запустив `git log`, Вы увидите, что сделали два коммита:
@ -821,9 +949,7 @@ HEAD is now at a13b85e
```
<a name="delete-stale-local-branches"></a>
### Я хочу удалить локальные ветки, которые были удалены в upstream
Как только Вы слили пулл-реквест на GitHub, Вам предлагают удалить слитую ветку из Вашего форка. Если Вы не планируете продолжать работу в этой ветке, то для поддержания рабочей копии в чистоте Вы можете удалить локальные копии ненужных веток, чтобы не путаться в них.
```sh
@ -833,7 +959,6 @@ $ git fetch -p upstream
где `upstream` - удаленная ветка, из которой Вы хотите получить изменения.
<a name="restore-a-deleted-branch"></a>
### Я нечаянно удалил мою ветку
Если Вы регулярно отправляете изменения в удаленное хранилище, большую часть времени Вы в безопасности. Но в один прекрасный момент Вы всё же можете случайно удалить Ваши ветки. Скажем, мы создали ветку и создали новый файл:
@ -952,7 +1077,6 @@ README.md foo.txt
```
<a name="i-want-to-checkout-to-a-remote-branch-that-someone-else-is-working-on"></a>
### Я хочу перейти на удаленную ветку, над которой работает кто-то еще
Во-первых, получим все ветки из удаленного репозитория:
@ -1010,7 +1134,6 @@ $ git branch -u [remotename]/[branch] [local-branch]
```
<a name="i-want-to-set-my-HEAD-to-track-the-default-remote-branch"></a>
### Я хочу настроить HEAD на отслеживание основной удаленной ветки
При просмотре удаленных веток можно увидеть какую удаленную ветку отслеживает HEAD. Может оказаться, что это не та ветка что нужно.
@ -1041,7 +1164,6 @@ origin/HEAD set to master
## Перебазирование (rebase) и слияние (merge)
<a name="undo-rebase"></a>
### Я хочу отменить перебазирование/слияние
Вы можете слить/перебазировать Вашу ветку с неправильной веткой. А также бывают случаи, когда Вы не можете предугадать успешно ли завершится процесс перебазирования/слияния. Git сохраняет исходный указатель HEAD в переменную ORIG_HEAD перед тем как приступить к опасным операциям, так что вернуть ветку на состояние до перебазирования/слияния просто.
@ -1051,7 +1173,6 @@ origin/HEAD set to master
```
<a name="force-push-rebase"></a>
### Я сделал перебазирование, но я не хочу делать принудительный push
К сожалению, вы должны сделать принудительный push, если хотите, чтобы изменения были отражены на удаленной ветке. Это потому что у вас изменена история. Удаленная ветка не примет изменения, если не сделать принудительный push. Это одна из основных причин, по которым большинство людей основывает свой рабочий процесс на слиянии вместо перебазирования - большие команды могут столкнуться с проблемами, если разработчики будут делать принудительный `push`. Используйте это с осторожностью. Безопасный способ использовать перебазирование - это не отражать Ваши изменения напрямую на удаленную ветку, а вместо этого делать следующее:
@ -1066,7 +1187,6 @@ origin/HEAD set to master
Чтобы узнать больше, см. [эту SO ветку](https://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push).
<a name="interactive-rebase"></a>
### Я хочу объединить коммиты
Предположим, что Вы работаете в ветке, которая стала или станет пулл-реквестом в `master`. В простейшем случае когда всё, что Вы хотите сделать - это объединить *все* коммиты в один единственный коммит и Вам не важны временные метки, Вы можете сделать сброс и заново сделать коммит. Убедитесь, что ветка master обновлена и Ваши изменения сохранены, затем:
@ -1160,7 +1280,6 @@ Newer, awesomer features
```
#### Безопасная стратегия слияния
`--no-commit` производит слияние, но не делает коммит результата, давая пользователю возможность проверить и доработать результат слияния перед коммитом. `no-ff` сохраняет доказательства того, что когда-то существовала ветка feature, сохраняя цельность истории проекта.
```sh
@ -1174,7 +1293,6 @@ Newer, awesomer features
```
<a name="rebase-unpushed-commits"></a>
#### Я хочу объединить только неопубликованные коммиты
Иногда у Вас бывает несколько временных коммитов, которые Вы хотите объединить перед публикацией в upstream. Вы не хотите ненароком объединить свои коммиты с уже опубликованными, потому что кто-то уже мог работать с ними.
@ -1222,11 +1340,9 @@ Newer, awesomer features
### Возможные проблемы интерактивного перебазирования
<a name="noop"></a>
#### Экран перебазирования говорит 'noop'
Если Вы видите это:
```
noop
```
@ -1237,7 +1353,6 @@ noop
- вместо этого перебазировать `HEAD~2` или что-то более раннее
<a name="merge-conflict"></a>
#### Здесь были конфликты
Если Вам не удается успешно завершить перебазирование, то, возможно, Вам придется разрешать конфликты.
@ -1297,7 +1412,6 @@ Changes not staged for commit:
```
<a name="stashing"></a>
## Отложенные изменения (stash)
### Отложить все правки
@ -1329,7 +1443,6 @@ $ git stash push working-directory-path/filename1.ext working-directory-path/fil
```
<a name="stash-msg"></a>
### Отложить с сообщением
```sh
@ -1337,7 +1450,6 @@ $ git stash save <message>
```
<a name="stash-apply-specific"></a>
### Применить заданный stash из списка
Во-первых, проверьте список отложенных изменений, используя
@ -1373,7 +1485,6 @@ $ git log -S "string to find"
- `--reverse` выводит коммиты в обратном порядке, это значит, что вверху будет первый коммит, в котором сделано это изменение.
<a name="i-want-to-find-by-author-committer"></a>
### Я хочу искать по автору или сохранившему изменения (committer)
Найти все коммиты по автору или сохранившему изменения:
@ -1427,7 +1538,6 @@ $ git tag --contains <commitid>
## Субмодули
<a name="clone-submodules"></a>
### Клонировать все субмодули
```sh
@ -1441,7 +1551,6 @@ $ git submodule update --init --recursive
```
<a name="delete-submodule"></a>
### Удалить субмодуль
Создание субмодуля довольно прямолинейно, чего не скажешь об удалении. Команды, которые Вам нужны:
@ -1477,7 +1586,6 @@ $ git push <remote> :refs/tags/<tag_name>
```
<a name="recover-tag"></a>
### Восстановить удаленную метку
Если хотите восстановить метку, которая была удалена, Вы можете сделать следующее: во-первых, Вам нужно найти недостижимую метку:
@ -1509,7 +1617,6 @@ From github.com:foo/bar
```sh
$ git archive --format zip --output /full/path/to/zipfile.zip master
```
### Как опубликовать ветку и метку, если они имеют одинаковые имена
Если в удаленном репозитории есть метка с таким же именем, как и ветка <branch>, то после выполнения команды `$ git push <remote> <branch>` Вы получите следующую ошибку:
@ -1535,7 +1642,6 @@ $ git push origin refs/tags/<tag-name>
## Отслеживание файлов
<a href="i-want-to-change-a-file-names-capitalization-without-changing-the-contents-of-the-file"></a>
### Я хочу изменить регистр в имени файла, не меняя содержимое файла
```sh
@ -1550,7 +1656,6 @@ $ git push origin refs/tags/<tag-name>
```
<a href="remove-from-git"></a>
### Я хочу удалить файл из git, но оставить сам файл
```sh
@ -1599,6 +1704,39 @@ $ git update-index --assume-unchanged file-to-ignore
$ git update-index --no-assume-unchanged file-to-stop-ignoring
```
## Отладка с помощью Git
Команда [git-bisect](https://git-scm.com/docs/git-bisect) с помощью двоичного поиска находит в истории Git коммит, в котором впервые появилась ошибка.
Пусть вы находитесь на ветке `master` и хотите найти коммит, которых поломал некую функцию. Вы начинаете процедуру поиска:
```sh
$ git bisect start
```
Затем вы должны указать коммит, где функция поломана (bad), коммит, где функция работает правильно (good). Предположим, что *текущая* версия поломана, а `v1.1.1` - работоспособная:
```sh
$ git bisect bad
$ git bisect good v1.1.1
```
После этого `git-bisect` выберет коммит из середины заданного вами диапазона, перейдет на него и спросит у вас: хороший он или плохой. Вы увидите что-то вроде:
```sh
$ Bisecting: 5 revision left to test after this (roughly 5 step)
$ [c44abbbee29cb93d8499283101fe7c8d9d97f0fe] Commit message
$ (c44abbb)$
```
Вы проверите хороший ли коммит. Если хороший:
```sh
$ (c44abbb)$ git bisect good
```
и `git-bisect` выберет другой коммит. Этот процесс (выбора `good` или `bad`) будет повторяться до тех пор, пока диапазон поиска не сузится до единственного коммита, после чего команда выведет описание **первого** плохого коммита.
## Конфигурация
### Я хочу добавить псевдонимы для некоторых команд Git
@ -1784,43 +1922,43 @@ function Squash-Commits {
## Книги
* [Learn Enough Git to Be Dangerous](https://www.learnenough.com/git-tutorial) - Книга Майкла Хартла, посвященная Git с самых основ
- [Pro Git](https://git-scm.com/book/ru/v2) - великолепная книга Скотта Чакона и Бена Страуба про Git
- [Git Internals](https://github.com/pluralsight/git-internals-pdf) - еще одна великолепная книга Скотта Чакона, посвященная Git
* [Pro Git](https://git-scm.com/book/ru/v2) - великолепная книга Скотта Чакона и Бена Страуба про Git
* [Git Internals](https://github.com/pluralsight/git-internals-pdf) - еще одна великолепная книга Скотта Чакона, посвященная Git
* [Nasa handbook](https://www.nasa.gov/sites/default/files/atoms/files/nasa_systems_engineering_handbook.pdf)
## Учебники
* [19 Git Tips For Everyday Use](https://www.alexkras.com/19-git-tips-for-everyday-use) - Список полезных однострочников Git
- [Atlassian's Git tutorial](https://www.atlassian.com/git/tutorials) Получите Git сразу с учебниками от начального до продвинутого уровня.
- [Изучаем ветвление в Git](https://learngitbranching.js.org/) Интерактивный веб-учебник по ветвлению/слиянию/перебазированию
- [Конструктивно о слиянии и перебазировании в Git](https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa)
* [Atlassian's Git tutorial](https://www.atlassian.com/git/tutorials) Получите Git сразу с учебниками от начального до продвинутого уровня.
* [Изучаем ветвление в Git](https://learngitbranching.js.org/) Интерактивный веб-учебник по ветвлению/слиянию/перебазированию
* [Конструктивно о слиянии и перебазировании в Git](https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa)
* [Git Commands and Best Practices Cheat Sheet](https://zeroturnaround.com/rebellabs/git-commands-and-best-practices-cheat-sheet) - Шпаргалка Git с подробными пояснениями
* [Git изнутри](https://codewords.recurse.com/issues/two/git-from-the-inside-out) - Учебник, погружающий во внутренности Git
- [git-workflow](https://github.com/asmeurer/git-workflow) - Руководство от [Aaron Meurer](https://github.com/asmeurer) по использованию Git в совместной разработке проектов с открытым исходным кодом
- [GitHub как рабочий процесс](https://hugogiraudel.com/2015/08/13/github-as-a-workflow/) - Интересный подход к использованию GitHub в качестве рабочего процесса, в частности с пустыми пулл-реквестами
- [Githug](https://github.com/Gazler/githug) - Игра для изучения более общих рабочих процессов Git
* [git-workflow](https://github.com/asmeurer/git-workflow) - Руководство от [Aaron Meurer](https://github.com/asmeurer) по использованию Git в совместной разработке проектов с открытым исходным кодом
* [GitHub как рабочий процесс](https://hugogiraudel.com/2015/08/13/github-as-a-workflow/) - Интересный подход к использованию GitHub в качестве рабочего процесса, в частности с пустыми пулл-реквестами
* [Githug](https://github.com/Gazler/githug) - Игра для изучения более общих рабочих процессов Git
* [learnGitBranching](https://github.com/pcottle/learnGitBranching) - Изучение ветвлений git в игровой форме.
## Скрипты и инструменты
- [firstaidgit.io](http://firstaidgit.io/) Выборка наиболее частых вопросов и ответов по Git c поиском
- [git-extra-commands](https://github.com/unixorn/git-extra-commands) - сборник полезных дополнительных скриптов для Git
- [git-extras](https://github.com/tj/git-extras) - GIT utilities -- статистика репозитория, REPL, генерация журнала изменений, статистика по авторам изменений и многое другое
- [git-fire](https://github.com/qw3rtman/git-fire) - git-fire - это плагин для Git, который предупреждает при потенциально опасных действиях, таких как: добавление всех файлов из текущей папки, создание коммита и публикация измений в новую ветку (для предотвращения конфликтов при слиянии).
- [git-tips](https://github.com/git-tips/tips) - Краткие советы по Git
- [git-town](https://github.com/Originate/git-town) - Общая высокоуровневая поддержка рабочего процесса Git! http://www.git-town.com
* [firstaidgit.io](http://firstaidgit.io/) Выборка наиболее частых вопросов и ответов по Git c поиском
* [git-extra-commands](https://github.com/unixorn/git-extra-commands) - сборник полезных дополнительных скриптов для Git
* [git-extras](https://github.com/tj/git-extras) - GIT utilities -- статистика репозитория, REPL, генерация журнала изменений, статистика по авторам изменений и многое другое
* [git-fire](https://github.com/qw3rtman/git-fire) - git-fire - это плагин для Git, который предупреждает при потенциально опасных действиях, таких как: добавление всех файлов из текущей папки, создание коммита и публикация измений в новую ветку (для предотвращения конфликтов при слиянии).
* [git-tips](https://github.com/git-tips/tips) - Краткие советы по Git
* [git-town](https://github.com/Originate/git-town) - Общая высокоуровневая поддержка рабочего процесса Git! http://www.git-town.com
## Графические клиенты
- [GitKraken](https://www.gitkraken.com/) - роскошный Git-клиент для Windows, Mac и Linux
- [git-cola](https://git-cola.github.io/) - еще один Git-клиент для Windows и OS X
- [GitUp](https://github.com/git-up/GitUp) - новый графический клиент, имеющий весьма своеобразные методы работы со сложностями Git
- [gitx-dev](https://rowanj.github.io/gitx/) - еще один графический Git-клиент для OS X
- [Sourcetree](https://www.sourcetreeapp.com/) - Простота и мощь в красивом и свободном графическом Git-клиенте. Для Windows и Mac.
- [Tower](https://www.git-tower.com/) - графический Git-клиент для OS X (платный)
- [tig](https://jonas.github.io/tig/) - консольный текстовый интерфейс для Git
- [Magit](https://magit.vc/) - интерфейс для Git, реализованный в виде модуля Emacs.
- [GitExtensions](https://github.com/gitextensions/gitextensions) - расширение оболочки, плагин для Visual Studio 2010-2015 и автономный инструмент для управления репозиториями Git.
- [Fork](https://git-fork.com/) - быстрый и дружелюбный Git-клиент для Mac (бета)
- [gmaster](https://gmaster.io/) - Git-клиент для Windows с трехсторонним слиянием, обнаружением рефакторинга, семантическим сравнением и слиянием (бета)
- [gitk](https://git-scm.com/docs/gitk) - Git-клиент под Linux для просмотра состояния репозитория.
* [GitKraken](https://www.gitkraken.com/) - роскошный Git-клиент для Windows, Mac и Linux
* [git-cola](https://git-cola.github.io/) - еще один Git-клиент для Windows и OS X
* [GitUp](https://github.com/git-up/GitUp) - новый графический клиент, имеющий весьма своеобразные методы работы со сложностями Git
* [gitx-dev](https://rowanj.github.io/gitx/) - еще один графический Git-клиент для OS X
* [Sourcetree](https://www.sourcetreeapp.com/) - Простота и мощь в красивом и свободном графическом Git-клиенте. Для Windows и Mac.
* [Tower](https://www.git-tower.com/) - графический Git-клиент для OS X (платный)
* [tig](https://jonas.github.io/tig/) - консольный текстовый интерфейс для Git
* [Magit](https://magit.vc/) - интерфейс для Git, реализованный в виде модуля Emacs.
* [GitExtensions](https://github.com/gitextensions/gitextensions) - расширение оболочки, плагин для Visual Studio 2010-2015 и автономный инструмент для управления репозиториями Git.
* [Fork](https://git-fork.com/) - быстрый и дружелюбный Git-клиент для Mac (бета)
* [gmaster](https://gmaster.io/) - Git-клиент для Windows с трехсторонним слиянием, обнаружением рефакторинга, семантическим сравнением и слиянием (бета)
* [gitk](https://git-scm.com/docs/gitk) - Git-клиент под Linux для просмотра состояния репозитория.
* [SublimeMerge](https://www.sublimemerge.com/) - Шустрый, расширяемый клиент для трехстороннего слияния, мощного поиска и подсветки синтаксиса. В активной разработке.