вторник, 3 января 2012 г.

Git, в примерах

Содержание
1. Введение
2. Запуск консоли для работы с Git
3. Git, простые примеры
3.1. Настройка Git-репозитория
3.1.1. Пример 1: создание репозитория и установка локальных настроек
3.1.2. Пример 2: то же что и пример1, но короче запись
3.1.3. Пример 3: установка пользовательских настроек
3.2. Простые операции с одним репозиторием
3.2.1. Пример 1: создать репозиторий, зафиксировать изменения
3.2.2. Пример 2: создать репозиторий, сделать 3 фиксации
3.2.3. Пример 3: работа с git checkout (возврат)
3.2.4. Пример 4: работа с git checkout и git branch (возврат и создание новой ветки)
3.2.5. Пример 5: работа с git branch (слияние двух веток)
3.3. Операции с двумя репозиториями
3.3.1. Пример 1: создать реп, отклонироваться, внести изменения в первый, обновиться во втором
3.3.2. Пример 2: создать два репозитория, внести изменения в оба, второй слить с первым
3.3.3. Пример 3: создать два репозитория, внести изменения в оба, второй слить с первым
3.3.4. Пример 4: втолкнуть данные в удалённый пустой репозиторий
3.3.5. Пример 5: втолкнуть данные в удалённый не пустой репозиторий
3.4. Заключение

Введение

В этой части мы рассмотрим работу с репозиторием git на примерах

Команды, которые будут использоваться здесь, кратко описаны в предыдущей части Git, краткий справочник команд.

Запуск консоли для работы с Git

В одной из предыдущих статей я расказал, как установить Git на ваш компьютер. Сейчас я исхожу из того, что у вас всё установлено.

Напомню ещё раз, что должно быть на данный момент:

  1. у вас установлен Git примерно в такую папку c:\Program Files (x86)\Git\
  2. у вас создан текстовый файл c:\bin\gitbash.bat с содержимым @%WINDIR%\system32\cmd.exe /c ""C:\Program Files (x86)\Git\bin\sh.exe" --login -i"
  3. путь c:\bin\ добавлен в переменную окружения PATH

Если что-то не сделано, прочитайте ещё раз статью по установке Git.

Имея эти настройки, мы можем вызывать MINGW32 консоль для работы с git, находясь в любой папке, просто набрав команду

gitbash
Далее я исхожу из того, что мы работаем в MINGW32 консоли.

Создадим папку c:\git для запуска примеров в ней:

cd c:
mkdir git
cd git
После этого мы располагаемся в директории c:\git. Отсюда я предполагаю, что все последующие примеры будут запускаться из этой же директории (Хотя это совершенно не обязательно).

В некоторых примерах я пишу комментарии на английском, чтобы была возможность выполнить код скрипта в MINGW32 под Windows командой

sh -- yourScriptFile
где yourScriptFile - имя файла со скриптами примера. К сожалению, русские комментарии не дают выполнять скрипты.

Git, простые примеры

Настройка Git-репозитория

Пример 1: создание репозитория и установка локальных настроек

Цель: создать репозиторий, установить свое имя и емаил для репозитория

mkdir a1
cd a1
git init                                #1. создать репозиторий в текущей папке
git config user.name YourName           #2. установим имя и эл. ящик для этого репозитория
git config user.name YourEmail@email.x

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

Пример 2: то же что и пример1, но короче запись

Цель: создать репозиторий, установить свое имя и емаил для репозитория
Заметка: то же, что и в предыдущем примере, но более короткая запись.

git init a1                             #1. создать репозиторий в папке a1 (папка будет создана)
cd a1                                   # перейти в новый репозиторий
git config user.name YourName           #2. установим имя и эл. ящик для этого репозитория
git config user.name YourEmail@email.x

Пример 3: установка пользовательских настроек

Цель: установить глобальные настройки имени и эл. ящика для всех будущих репозиториев

git config --global -l                              # прочитать список глобальных настроек
git config --global user.name YourName              # установить имя и эл. ящик
git config --global user.name YourEmail@email.x

Теперь в каждом новом вашем репозитории не придётся заного устанавливать имя и эл. ящик, т.к. эти данные будут браться из глобальным настроек вашего пользователя. (Файл ~/.gitconfig)

Простые операции с одним репозиторием

Пример 1: создать репозиторий, зафиксировать изменения

Цель: сделать первую фиксацию, просмотреть лог фиксаций

git init a2                     #1. создать репозиторий a2
cd a2                           #2. перейти в новый репозиторий
echo 'line-1' > file1           #3. записать строку 'line-1' в текстовый файл file1 (файл создастся)
git add .                       #4. добавить все файлы в index (staging area)
git commit -m 'My 1 commit'     #5. зафиксировать изменения, установив комментарий 'My first commit'
git log                         #6. просмотреть лог фиксаций

Последняя команда #6 выведет текст, похожий на следующий:

commit 533542948c6e7d4a25925d695d4cf81312d1a30f
Author: YourName 
Date:   Wed Jan 4 18:54:49 2012 +0600

    My 1 commit

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

Пример 2: создать репозиторий, сделать 3 фиксации

Цель: сделать 3 фиксации, просмотреть лог фиксаций

git init a3                     #1. создать репозиторий a3
cd a3                           #2. перейти в новый репозиторий

echo 'line-1' > file1           #3. записать строку 'line-1' в текстовый файл file1 (файл создастся)
git add .                       #4. добавить все файлы в index (staging area)
git commit -m 'My 1 commit'     #5. зафиксировать изменения, установив комментарий 'My first commit'

echo 'line-2' >> file1           #6. добавить запись в file1
git commit -a -m 'My 2 commit'  #7. фиксируем изменения. Обратите внимание на ключ -a, который
                                #   позволяет нам не выполнять git add . для файлов, которые ранее уже
                                #   участвовали в фиксациях (см. #4)

echo 'line-3' >> file1           #8. добавить запись в file1
git commit -a -m 'My 3 commit'  #9. зафиксировать изменения

git log                         #10. просмотреть лог фиксаций

Лог фиксаций будет примерно таким:

commit 812f2a05e9104e3e6f921f62839f75333a8f3150
Author: YourName 
Date:   Wed Jan 4 19:22:43 2012 +0600

    My 3 commit

commit 1edf5fedb8d86deed2764d2b6701c1d10c35e7b2
Author: YourName 
Date:   Wed Jan 4 19:12:19 2012 +0600

    My 2 commit

commit 533542948c6e7d4a25925d695d4cf81312d1a30f
Author: YourName 
Date:   Wed Jan 4 18:54:49 2012 +0600

    My 1 commit

Пример 3: работа с git checkout (возврат)

Цель: сделать 2 фиксации и вернуться на 1 фиксацию назад

git init a4                     #1. создать репозиторий a4
cd a4                           #2. перейти в новый репозиторий

echo 'line-1' > file1           #3. записать строку 'line-1' в текстовый файл file1 (файл создастся)
git add .                       #4. добавить все файлы в index (staging area)
git commit -m 'My 1 commit'     #5. зафиксировать изменения, установив комментарий 'My first commit'

echo 'line-2' >> file1           #6. добавить запись в file1
git commit -a -m 'My 2 commit'  #7. фиксируем изменения

cat file1                       #8. вывести содержимое файла file1 в консоль (увидим две срочки текста)

git checkout HEAD~1             #9. возвращаемся на 1 фиксацию назад относительно положения HEAD
git log                         #10. смотрим лог изменений относительно нашего текущего положения
git checkout master             #11. возвращаемся на верхушку ветки master

Пример 4: работа с git checkout и git branch (возврат и создание новой ветки)

Цель: сделать 2 фиксации и вернуться на 1 фиксацию назад

git init a5                     #1. создать репозиторий a5
cd a5                           #2. перейти в новый репозиторий

echo 'line-1' > file1           #3. записать строку 'line-1' в текстовый файл file1 (файл создастся)
git add .                       #4. добавить все файлы в index (staging area)
git commit -m 'My 1 commit'     #5. зафиксировать изменения, установив комментарий 'My first commit'

echo 'line-2' >> file1           #6. добавить запись в file1
git commit -a -m 'My 2 commit'  #7. фиксируем изменения

echo 'line-3' >> file1           #8. добавить запись в file1
git commit -a -m 'My 3 commit'  #9. фиксируем изменения

cat file1                       #10. вывести содержимое файла file1 в консоль (увидим две срочки текста)

git commit -b br1 HEAD~1        #11. возвратиться на 1 фиксацию назад относительно HEAD и создать ветку br1
git branch                      #12. убедимся, что сейчас сущесвует две ветки: br1 и master. 
                                #    Звёздочка указывает, что мы находимся в ветке br1
   
echo 'line-3 from br1' >> file1         #13. добавить запись в file1 в ветке br1
git commit -a -m 'My 4 commit br1'      #14. фиксируем изменения

git log                         #15. смотрим лог изменений
cat file1                       #16. смотрим содержимое файла file1

#теперь возвращаемся в ветку master, и видим что данные там остались неизменны
git checkout master
git log
cat file1

Пример 5: работа с git branch (слияние двух веток)

Цель: сделать разные изменения в двух ветках, а потом слить ветки

git init repo                   #1. создать репозиторий repo
cd repo                         #2. перейти в новый репозиторий

echo -e 'A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\n' > file1    #3. записать 10 строк в файл
git add .                       #4. добавить все файлы в index (staging area)
git commit -m 'My 1 commit'     #5. зафиксировать изменения, установив комментарий 'My first commit'

# добавим строку "111" после строки "С"
echo -e 'A\nB\nC\n111\nD\nE\nF\nG\nH\nI\nJ\n' > file1
git commit -a -m 'My 2 commit'

# откатимся до предыдущей фиксации с созданием новой ветки
git checkout -b br1 HEAD~1
cat file1                       #6. убедимся, что строки "111" нет

# добавим строку "222" после строки "I"
echo -e 'A\nB\nC\nD\nE\nF\nG\nH\nI\n222\nJ\n' > file1
git commit -a -m 'My 3 commit'

# возвратимся в ветку master
git checkout master
cat file1                       #7. увидим, что есть строка "111", но нет строки "222".

# произведём слияние текущей ветки master с веткой br1
git merge br1
cat file1                       #8. увидим, что теперь в файле присутствую обе строки "111" и "222"
git commit -a -m 'My 4 commit'  #9. зафиксируем слияние

# просмотреть историю изменений через графическую оболочку gitk
gitk

Операции с двумя репозиториями

Пример 1: создать реп, отклонироваться, внести изменения в первый, обновиться во втором

Цель: создать репозиторий, отклонироваться, внести изменения в первый репозиторий, обновиться во втором

# Create repo1
git init repo1
cd repo1
echo 'line-1' > file1
git add .
git commit -m "My 1 commit"

# Go up
cd ..

# Clone repo1 to repo2
git clone repo1 repo2
cd repo2

# See content
cat file

# Go to repo1 and make changes
cd ../repo1
echo 'line-2' >> file1
git commit -a -m "My 2 commit"

# Go to repo2 and see log
cd ../repo2
git log
# See, there is commit1, but there isn't commit2

# Now refresh current repo2
git pull

# Now we check that there ara both commits
git log

Пример 2: создать два репозитория, внести изменения в оба, второй слить с первым

Цель: создать два репозитория, в первом создать файл file1, во втором - файл file2. Далее слить репозиторий 2 с 1-ым.

# Create repo1
git init repo1
cd repo1
echo 'line-1 in file1' > file1
git add .
git commit -m "My 1 commit in repo1"

# Create repo2
cd ..
git init repo2
cd repo2
echo 'line-1 in file2' > file2
git add .
git commit -m "My 1 commit in repo2"

# Fetch data from repo1 to FETCH_HEAD link
git fetch ../repo1
# See the log for repo1
git log FETCH_HEAD

# Now merge FETCH_HEAD with HEAD link
git merge FETCH_HEAD

# See difference between work tree and staging area
git diff

# See difference between staging area and last commit
git diff --cached

Пример 3: создать два репозитория, внести изменения в оба, второй слить с первым

Цель: создать два репозитория, внести изменения в оба. Во втором создать удалённое наблюдене за первым, а потом слиться

# Create repo1
git init repo1
cd repo1
echo 'line-1 in file1' > file1
git add .
git commit -m "My 1 commit in repo1"

# Create repo2
cd ..
git init repo2
cd repo2
echo 'line-1 in file2' > file2
git add .
git commit -m "My 1 commit in repo2"

# Create remote to repo1
git remote add myRepo1 ../repo1

# See the exists remote
git remote

# Fetch data from the remote
git fetch myRepo1

# Merge the remote myRepo1/master branch to current master branch
git merge myRepo1/master

# See status and log 
git status
git log

Пример 4: втолкнуть данные в удалённый пустой репозиторий

Цель: создать пустой голый репозиторий, отклонироваться от него, внести изменения в клонированый репозиторий, втолкнуть данные в исходный голый репозиторий.

# Create bare repo1
git init --bare repo1

# See that nothing log
git log

# Create clone repository repo2 from repo1
git clone repo1 repo2
cd repo2

# Edit
echo 'line-1' > file1
git add .
git commit -m 'My 1 commit'

# See that exists the remote link
git remote
cat .git/config

# Now push current commit to the remote bare repo1
git push origin master

# Go to repo1 and see log
cd ../repo1
git log
# Bingo!

Пример 5: втолкнуть данные в удалённый не пустой репозиторий

Цель: создадим голый репозиторий, отклонируемся от него, внесём изменения в клон. Втолкнём изменения в оригинальный репозиторий. Потом сделаем ещё изменения и снова втолкнём их в оригинальный репозиторий

# Create bare repo1
git init --bare repo1

# Create clone repository repo2 from repo1
git clone repo1 repo2
cd repo2

# Edit
echo 'line-1' > file1
git add .
git commit -m 'My 1 commit'

# Now push current commit to the remote bare repo1
git push origin master

# Edit again
echo 'line-2' >> file1
git commit -a -m 'My 2 commit'

# Now short push record
git push

# Go to repo1 and see log
cd ../repo1
git status
git log

Заключение

Эти примеры не охватывают все возможности git, но дают хороший старт для их самостоятельного изучения. Большую часть информации по работе с git я подчерпнул из его справки (git help git).
На этом я завершаю данную статью.

Смотрите также:

2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. в простых операциях в примере 4 ошибка. "git commit -b br1 HEAD~1 #11. возвратиться на " вместо commit должно быть checkout

    ОтветитьУдалить