Шпаргалка по git

Как выписать репозиторий с github

  1. Создаем новую директорию для проекта project_name, переходим в нее.
  2. Выполняем команду:
     
    1
    git clone git@github.com:devlabuser/sharp.git ./

    "./" означает, что создать репозиторий нужно в текущей директории.

Результат: каталог с выписанной веткой master. Теперь можно создавать новые ветки, или выписывать с github существующие.

 

Как выписать ветку с github

С помощью команды "checkout" можно выписать уже существующую ветку с github:

 

 
1
2
$ git checkout -b dev origin/dev
$ git checkout -b project_branch origin/project_branch

 

Или так, что намного надежнее:

 
1
$ git checkout --track origin/production

Если команда не сработала, нужно попробовать выполнить обновление:

 
1
$ git remote update

 

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

1
2
git checkout -b project_branch
git pull origin project_branch

 

Т.е. сначала мы создаем новую ветку, а затем вливаем в нее изменения из ветки на github.

Как создать новую ветку в локальном репозитории

  1. Создаем новую ветку в локальном репозитории:
     
    1
    2
    $ git checkout -b dev
    Switched to a new branch 'dev'
  2. Публикуем ее на github:
     
    1
    2
    3
    4
    $ git push origin dev
    Total 0 (delta 0), reused 0 (delta 0)
    To git@github.com:devlabuser/sharp.git
    * [new branch]      dev -> dev

 

Как переключиться на другую ветку в git

1
$ git checkout project2_branch

 

Если вы случайно удалили какой-то файл, можно извлечь его из хранилища:

1
$ git checkout readme.txt

Как посмотреть список веток

Команда "branch" позволяет посмотреть список веток в локальном репозитории. Текущая ветка будет помечена звездочкой:

1
2
3
$ git branch
* dev
  master

Как сделать commit

Создаем новую ветку, выполняем в ней нужные изменения.

  1. Список всех измененных и добавленных файлов можно просмотреть командой:
     
    1
    $ git status
  2. Подготавливаем коммит, добавляя в него файлы командой:
     
    1
    $ git add <file1> <file2> ...

    Или удаляем устаревшие файлы:

    1
    $ git rm <file1> <file2> ...
  3. Выполняем коммит:
     
    1
    $ git commit -m 'Комментарий к коммиту'

     

  4. Как правило, в репозитории существует две основные ветки - dev и master. Dev - общая ветка разработчиков и тестировщиков. Именно в нее добавляются все новые разработки перед очередным релизом. Master - ветка для выкладки продукта на боевые сервера.

    После коммита надо влить в нашу ветку изменения из ветки dev и master:
    1
    2
    $ git pull origin dev
    $ git pull origin master

    Теперь наша ветка содержит изменения для проекта, и все последние изменения по другим задачам, которые успела внести команда.

  5. Переключаемся на ветку dev:
    1
    $ git checkout dev

     

  6. Вливаем в dev изменения из ветки проекта:
    1
    $ git merge project_branch

     

  7. Заливаем последнюю версию ветки dev на удаленный сервер:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ git push origin dev
     
    Counting objects: 4, done.
    Delta compression using up to 2 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 286 bytes, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To git@github.com:devlab/sharp.git
       d528335..9a452d9  dev -> dev

    push может не пройти, потому что удалённый origin/dev обогнал локальную его копию.

Как решить конфликт бинарных файлов

Допустим, при слиянии с другой веткой git выдал ошибку. Команда git status возвращает информацию о конфликте:

1
2
3
4
5
6
7
8
9
10
11
12
$ git status
...
Unmerged paths:
  (use "git add <file>..." to mark resolution)
 
        both modified:      root/css/styles.css.gz
 
 
$ git diff root/css/styles.css.gz
diff --cc root/css/styles.css.gz
index 970c721,bc6d170..0000000
Binary files differ

Конфликтный файл является бинарным (это могут быть архивные файлы, изображения и т.п.), и решение конфликта стандартным способом, с помощью редактирования - не возможно.

Чтобы решить такой конфликт, надо просто выбрать - какая версия файла будет использоваться: ваша или из вливаемой ветки. Чтобы использовать свой вариант файла, вводим команду:

1
2
git checkout --ours binary.dat
git add binary.dat

Если мы выбираем версию из вливаемой ветки:

1
2
git checkout --theirs binary.dat
git add binary.dat

"ours" - от английского "наш", "theirs" - от английского "их".

Как посмотреть историю изменений

git log - просмотр логов.

 
1
2
3
4
5
6
7
8
9
10
11
12
$ git log
commit 9a452d9cdbdb57e7e4f2b09f8ce2f776cd56657a
Author: DevLab User <user@mail.ru>
Date:   Wed Jul 31 18:35:47 2013 +0400
 
    first commit
 
commit d528335724dfc15461996ed9d44d74f23ce6a075
Author: DevLab User <user@mail.ru>
Date:   Wed Jul 31 06:24:57 2013 -0700
 
    Initial commit

Вывод данных о каждом коммите в одну строку:

1
2
3
4
git log --pretty=oneline
 
9a452d9cdbdb57e7e4f2b09f8ce2f776cd56657a first commit
d528335724dfc15461996ed9d44d74f23ce6a075 Initial commit

 

Для вывода информации git log использует просмотрщик, указанный в конфиге репозитория.

Поиск по ключевому слову в комментариях к коммиту:

1
2
$ git log | grep -e "first"
    first commit

 

Команда "git show" позволяет просмотреть, какие именно изменения произошли в указанном коммите:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ git show 99452d955bdb57e7e4f2b09f8ce2fbb6cd56377a
 
commit 99452d955bdb57e7e4f2b09f8ce2fbb6cd56377a
Author: DevLab User <user@mail.ru>
Date:   Wed Jul 31 18:35:47 2013 +0400
 
    first commit
 
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..4add785
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1 @@
+Text
\ No newline at end of file

 

Можно посмотреть построчную информацию о последнем коммите, имя автора и хэш коммита:

1
2
3
4
$ git blame README.md
 
^d528335 (devlabuser 2013-07-31 06:24:57 -0700 1) sharp
^d528335 (devlabuser 2013-07-31 06:24:57 -0700 2) =====

 

git annotate, выводит измененные строки и информацию о коммитах, где это произошло

1
2
$ git annotate readme.txt
9a452d9c        (DevLab User      2013-07-31 18:35:47 +0400       1)Text

Как сделать откат

  1. git log - просмотр логов, показывает дельту (разницу/diff), привнесенную каждым коммитом.
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    commit 9a452d9cdbdb57e7e4f2b09f8ce2f776cd56657a
    Author: devlabuser <user@mail.ru>
    Date:   Wed Jul 31 18:35:47 2013 +0400
     
        first commit
     
    commit d528335724dfc15461996ed9d44d74f23ce6a075
    Author: devlabuser <user@mail.ru>
    Date:   Wed Jul 31 06:24:57 2013 -0700
     
        Initial commit
  2. Копируем идентификатор коммита, до которого происходит откат.
  3. Откатываемся до последнего успешного коммита (указываем последний коммит):
     
    1
    2
    $ git reset --hard 9a452d955bdb57e7e4f2b09f8ce2fbb6cd56377a
    HEAD is now at 9a45779 first commit

    Можно откатить до последней версии ветки:
     
    1
    2
    $ git reset --hard origin/dev
    HEAD is now at 9a45779 first commit

После того, как откат сделан, и выполнен очередной локальный коммит, при попытке сделать push в удаленный репозиторий, git может начать ругаться, что версия вашей ветки младше чем на github и вам надо сделать pull. Это лечится принудительным коммитом:

1
git push -f origin master

Как выполнить слияние с другой веткой

git merge выполняет слияние текущей и указанной ветки. Изменения добавляются в текущую ветку.

 
1
$ git merge origin/ticket_1001_branch

git pull забирает изменения из ветки на удаленном сервере и проводит слияние с активной веткой.

1
$ git pull origin ticket_1001_branch

git pull отличается от git merge тем, что merge только выполняет слияние веток, а pull прежде чем выполнить слияние - закачивает изменения с удаленного сервера. mergeудобно использовать для слияния веток в локальном репозитории, pull - слияния веток, когда одна из них лежит на github.

Создание нового локального репозитория

1
2
3
$ mkdir project_dir
$ cd project_dir
$ git init

git cherry-pick

git cherry-pick помогает применить один-единственный коммит из одной ветки к дереву другой.

  1. Для этого нужно выписать ветку, в которую будем вливать коммит:
     
    1
    git checkout master
  2. Обновить ее:
     
    1
    git pull origin master
  3. Выполнить команду, указать код коммита:
     
    1
    git cherry-pick eb042098a5
  4. После этого обновить ветку на сервере:
     
    1
    git push origin master

Как раскрасить команды git

После создания репозитория в текущей директории появится субдиректория .git . Она содержит файл config .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = git@github.com:devlab/sharp.git
[branch "master"]
        remote = origin
        merge = refs/heads/master
[branch "dev"]
        remote = origin
        merge = refs/heads/dev

Чтобы раскрасить вывод git, можно добавить в файл блок [color]:

1
2
3
4
5
6
[color]
        branch = auto
        diff = auto
        interactive = auto
        status = auto
        ui = auto
5 ноября 2018 г. 10:36 Теги - # git Категория - Git Kiwi standing on oval380