Git: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
м замена категории на шаблон для работы полки, removed: Категория:Программирование с помощью AWB
Строка 6: Строка 6:


* <span style="color:darkblue">'''git config --global user.email your.name@domain'''</span>
* <span style="color:darkblue">'''git config --global user.email your.name@domain'''</span>

* <span style="color:darkblue">'''git config --global user.name "Your Name"'''</span>
* <span style="color:darkblue">'''git config --global user.name "Your Name"'''</span>

* <span style="color:darkblue">'''git config --global push.default current'''</span>
* <span style="color:darkblue">'''git config --global push.default current'''</span>

* <span style="color:darkblue">'''git clone <url репозитория>'''</span>
* <span style="color:darkblue">'''git clone <url репозитория>'''</span>


Строка 16: Строка 13:


* создание ветки <br> <span style="color:darkblue">'''git branch <имя ветки>'''</span>
* создание ветки <br> <span style="color:darkblue">'''git branch <имя ветки>'''</span>

* переключение <br> <span style="color:darkblue">'''git checkout <имя ветки>'''</span>
* переключение <br> <span style="color:darkblue">'''git checkout <имя ветки>'''</span>

* две операции вместе <br> <span style="color:darkblue">'''git checkout -b <имя ветки>'''</span>
* две операции вместе <br> <span style="color:darkblue">'''git checkout -b <имя ветки>'''</span>

* посмотреть ветки в своем репозитории <br> <span style="color:darkblue">'''git branch'''</span>
* посмотреть ветки в своем репозитории <br> <span style="color:darkblue">'''git branch'''</span>

* посмотреть ветки на удаленном репозитории <br> <span style="color:darkblue">'''git branch -r'''</span>
* посмотреть ветки на удаленном репозитории <br> <span style="color:darkblue">'''git branch -r'''</span>

* создание удаленной ветки (соответствующей текущей ветке) <br> <span style="color:darkblue">'''git push -u origin <имя ветки на удаленном репозитории, обычно такое же, как и локальное>''' </span>
* создание удаленной ветки (соответствующей текущей ветке) <br> <span style="color:darkblue">'''git push -u origin <имя ветки на удаленном репозитории, обычно такое же, как и локальное>''' </span>

* удаление локальной ветки
* удаление локальной ветки
# <span style="color:darkblue">'''git branch -d <имя ветки>'''</span>. Но в этом случае git иногда ноет, что у вас ветка не слита с HEADом или upstream-branch.
# <span style="color:darkblue">'''git branch -d <имя ветки>'''</span>. Но в этом случае git иногда ноет, что у вас ветка не слита с HEADом или upstream-branch.
Строка 46: Строка 37:
- обновляем master
- обновляем master
<br> <span style="color:darkblue">'''git checkout master'''</span>
<br> <span style="color:darkblue">'''git checkout master'''</span>
<br> <span style="color:darkblue">'''git pull --rebase'''</span><br>
<br> <span style="color:darkblue">'''git pull --rebase'''</span>


- ребейзим ветки на master <br>
- ребейзим ветки на master <br>
<span style="color:darkblue">'''git checkout <имя ветки> '''</span> <br>
<span style="color:darkblue">'''git checkout <имя ветки> '''</span> <br>
<span style="color:darkblue">'''git rebase master '''</span> <br>
<span style="color:darkblue">'''git rebase master '''</span> <br>
* master при этом не меняется, то есть если вы хотите просто влить в Вашу ветку общие изменения, на этом надо остановиться.<br>
* master при этом не меняется, то есть если вы хотите просто влить в Вашу ветку общие изменения, на этом надо остановиться.

* Только не забудьте перед следующим git pull --rebase(в своей ветке) сделать git push --force origin <имя ветки>, поскольку из-за ребейза <имя ветки> и origin/<имя ветки> разошлись. Иначе, если сделать pull --rebase то вы снова примените к своей ветке свои коммиты.
* Только не забудьте перед следующим git pull --rebase(в своей ветке) сделать git push --force origin <имя ветки>, поскольку из-за ребейза <имя ветки> и origin/<имя ветки> разошлись. Иначе, если сделать pull --rebase то вы снова примените к своей ветке свои коммиты.

* возвращаемся обратно, делаем fast-forward merge и выливаем в репозиторий <br>
* возвращаемся обратно, делаем fast-forward merge и выливаем в репозиторий <br>
<span style="color:darkblue">'''git checkout master <br>
<span style="color:darkblue">'''git checkout master <br>
<span style="color:darkblue">'''git merge <имя бранча> (должно быть написано fast-forward) <br>
<span style="color:darkblue">'''git merge <имя бранча> (должно быть написано fast-forward) <br>
<span style="color:darkblue">'''git push</span><br>
<span style="color:darkblue">'''git push</span>


=== Исправления ===
=== Исправления ===
Строка 67: Строка 56:
# сторонние gui git приложения (Валера пользуется <span style="color:blue">'''smartgit'''</span>)
# сторонние gui git приложения (Валера пользуется <span style="color:blue">'''smartgit'''</span>)


* исправление коммитов
* исправление коммитов

* отлично работающая штука, если вы сделали какую-то глупость (например, смерджились случайно c master): <br>
* отлично работающая штука, если вы сделали какую-то глупость (например, смерджились случайно c master): <br>
::<span style="color:darkblue">'''git reflog</span> <br>
::<span style="color:darkblue">'''git reflog</span> <br>
Строка 75: Строка 63:


* слияние коммитов <br> <span style="color:darkblue">''' git rebase -i <start_point></span> (внимание, ребейз начинается после start point'a)
* слияние коммитов <br> <span style="color:darkblue">''' git rebase -i <start_point></span> (внимание, ребейз начинается после start point'a)

* исправление предыдущего коммита <br> <span style="color:darkblue">''' git commit --amend</span>
* исправление предыдущего коммита <br> <span style="color:darkblue">''' git commit --amend</span>


: откат коммита <br>
: откат коммита <br>
::<span style="color:darkblue">''' git reset HEAD~<n></span> (сами файлы в working tree останутся) <br>
::<span style="color:darkblue">''' git reset HEAD~<n></span> (сами файлы в working tree останутся) <br>
::<span style="color:darkblue">''' git reset --hard HEAD~<n></span> (working tree файлы не останутся) <br>
::<span style="color:darkblue">''' git reset --hard HEAD~<n></span> (working tree файлы не останутся)


: откат из индекса
: откат из индекса
::<span style="color:darkblue">''' git reset <file name></span>
::<span style="color:darkblue">''' git reset <file name></span>


: откат измененного файла
: откат измененного файла
Строка 100: Строка 87:
http://git-scm.com/book
http://git-scm.com/book


[[Категория:Программирование]]
{{Темы|Программирование}}

[[Категория:Веб-разработка]]
[[Категория:Веб-разработка]]

Версия от 22:29, 8 февраля 2016

Это краткий справочник по командам git. Используется договорённость об обязательном использовании rebase при синхронизации с получаемой веткой.

Начальная настройка

  • git config --global user.email your.name@domain
  • git config --global user.name "Your Name"
  • git config --global push.default current
  • git clone <url репозитория>

Работа с ветками

  • создание ветки
    git branch <имя ветки>
  • переключение
    git checkout <имя ветки>
  • две операции вместе
    git checkout -b <имя ветки>
  • посмотреть ветки в своем репозитории
    git branch
  • посмотреть ветки на удаленном репозитории
    git branch -r
  • создание удаленной ветки (соответствующей текущей ветке)
    git push -u origin <имя ветки на удаленном репозитории, обычно такое же, как и локальное>
  • удаление локальной ветки
  1. git branch -d <имя ветки>. Но в этом случае git иногда ноет, что у вас ветка не слита с HEADом или upstream-branch.
  2. git branch -D <имя ветки>. Так он удалит в любом случае, вне зависимости от merged status ветки, которую вы хотите удалить.
  • cинхронизация с ветками
--взятие, без флага rebase будет выполняться merge, а с этим флагом будет выполняться rebase
  1. git pull --rebase
  2. git pull без --rebase использовать ЗАПРЕЩЕНО! - это создаст проблемы при последующих rebase и слиянии веток.
Также рекомендуется один раз запустить
git config branch.autosetuprebase always
Это позволит автоматически во время git pull добавлять флаг --rebase
--отправка на сервер. после первого push'a с флагом -u достаточно писать лишь git push

Пример: Cлияние ветки с master через rebase с обновлением ветки master

- обновляем master
git checkout master
git pull --rebase

- ребейзим ветки на master
git checkout <имя ветки>
git rebase master

  • master при этом не меняется, то есть если вы хотите просто влить в Вашу ветку общие изменения, на этом надо остановиться.
  • Только не забудьте перед следующим git pull --rebase(в своей ветке) сделать git push --force origin <имя ветки>, поскольку из-за ребейза <имя ветки> и origin/<имя ветки> разошлись. Иначе, если сделать pull --rebase то вы снова примените к своей ветке свои коммиты.
  • возвращаемся обратно, делаем fast-forward merge и выливаем в репозиторий

git checkout master
git merge <имя бранча> (должно быть написано fast-forward)
git push

Исправления

  • конфликтов
  1. в любимом редакторе
  2. git mergetool [--tool=<tool>]
  3. сторонние gui git приложения (Валера пользуется smartgit)
  • исправление коммитов
  • отлично работающая штука, если вы сделали какую-то глупость (например, смерджились случайно c master):
git reflog
Там будет список Ваших последних действий. К любому из них можно откатиться вполне стандартным способом:
git reset --hard HEAD@{n}
  • слияние коммитов
    git rebase -i <start_point> (внимание, ребейз начинается после start point'a)
  • исправление предыдущего коммита
    git commit --amend
откат коммита
git reset HEAD~<n> (сами файлы в working tree останутся)
git reset --hard HEAD~<n> (working tree файлы не останутся)
откат из индекса
git reset <file name>
откат измененного файла
git checkout HEAD <file name>
взятие отдельного коммита в свой бранч
git cherry-pick <commit>
взятие несколько подряд идущих коммитов
git cherry-pick <commit_from>..<commmit_to>

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

git push origin :<имя ветки на удаленном репозитории>

См. также

http://git-scm.com/book