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

 

  1. Установить значения username/email:
    $ git config --global user.email "e0ne@e0ne.info"
    $ git config --global user.name "e0ne"

    через .gitconfig это делать не всегда удобно, т.к. иногда нужно разные name/email для разных upstream repos
  2. Установить upstream branch:
    $ git branch --set-upstream master upstream/master
  3. Поменять последний коммит:
    $ git commit --amend -a
  4. Поменять автора нескольких коммитов:
    $ git filter-branch --commit-filter '
            if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
            then
                    GIT_COMMITTER_NAME="<New Name>";
                    GIT_AUTHOR_NAME="<New Name>";
                    GIT_COMMITTER_EMAIL="<New Email>";
                    GIT_AUTHOR_EMAIL="<New Email>";
                    git commit-tree "$@";
            else
                    git commit-tree "$@";
            fi' HEAD
    $ git push
  5. После мерджа пометить конфиликт как resolved:
    $ git add file
  6. Откатить локальные коммиты:
    reset --soft HEAD^
  7. Переместить тег на другой коммит:
    $ git tag -d ver_0.1
    $ git push origin :refs/tags/ver_0.1
  8. Лучший мануал по git’у:
    http://git-scm.com/book
  9. Мой .gitconfig лежит тут: https://github.com/e0ne/dot-files/blob/master/.gitconfig
  10. Мой .gitignore лежит тут: https://github.com/e0ne/dot-files/blob/master/.gitignore
  11. Cоздаем branch из tag'а: http://blog.e0ne.info/post/Git-create-branch-from-tag.aspx
  12. Мерджим апдейты с другого репозитория: http://korenkov.info/fetching-updates-from-another-git-repo

    [Updated 26.04.13]
  13. Обновить исходники, затирая локальные изменения:
    $ git fetch --all
    $ git reset --hard origin/master
  14. Удалить все недобавленные в репозиторий файлы и директории:
    $ git clean -f -d

 


Git: создаем branch из tag'а

Published 12/21/2011 by e0ne in Python
Tags: ,

 

Любая source control система (TFS, SVN, Git и т.д.) умеет работать с такими вещами, как branch (ветка) и tag (метка). Ветки нужны для разработки каких-то фич, исправления багов и т.д., что бы в это время не ломать уже работающий код. Тэги, в свою очередь, нужны для заморозки какой-то версии кода без возможности последующих исправлений. Грязные хаки вроде залезть в базу данных source control чтобы поменять файл с каким-то тэгом я не рассматриваю по понятным причинам.

В моем случае, изменения в код с каким-то тэгом было связано с задачей сборки новой версии Openstack essex-2 под Red Hat Enterprise Linux (RHEL). Алгоритм работы был, примерно такой:

 

  • забираем исходники Openstack’а: $ git clone https://github.com/openstack/nova.git
  • переключаемся на нужный тэг: $ git checkout essex-2
  • делаем необходимые изменения в коде и пытаемся запушить в новый бранч: $ git push myrepo essex-2.

 

После данных действий, в моем репозитории, к удивлению, вместо нового бранча с нужными изменениями появился тэг essex-2, который был идентичен такому тэгу с официального репозитория Openstack’а. Чтение Pro Git расставило все на свои места и стало ясно почему так случилось.

Далее, для выполнения нужных мне действий понадобилось выполнить команды: 

 

  • $ git checkout -b branchname tag
  • $ git push myrepo essex-2

 

Что эквивалентно такому:

 

  • $ git branch branchname tag
  • $ git checkout branchname
  • $ git push myrepo essex-2

 

Надеюсь что мой пост не помешает правильному использованию тэгов.