Моя борьба с git длится уже пятый год. Большую часть времени я его просто игнорировал. Последние пол года начал активно работать. Вообще, прекрасная иллюстрация импринтинга: первой системой была svn, а затем произошел переезд на идейного наследника mercurial - после чего git кажется технологией пришельцев. Первые попытки были вынужденными: нужно было попатчить драйвер couchdb для диплома, заслать пару пуллреквестов - каждый раз приходилось открывать шпаргалку и копипастить команды в консоль. Не помогла даже книга Pro Git, пол года назад пролистал еще раз - пока читаешь - все понятно, но повторить не смог бы.
Есть базовая идея, которая лежит в основе, без понимания которой все остальное не имеет смысла. В идеологии git есть один мастер бранч, все остальные - временные недоразумения, которые либо вливаются в главный, либо удаляются целиком, безымянные бранчи не могут существовать (хотя конечно есть reflog). В mercurial, как наследнике svn, бранчи - полноценные долгоживущие сущности, которие живут и после слияния. Поэтому граф git выглядит как корень дерева, а mercurial - как крона. Поэтому в git сложно взглянув на граф определить в каком бранче был сделан коммит, как он попал в текущую ветку и если ли эти изменения в ней вообще.
Другая идея важная для понимания - в git, пока не был сделан merge или rebase, визуально четко разделяются чужие ветки и твои (branch-name vs origin/branch-name) поэтому fetch совершенно безопасен, поэтому push --force деструктивнее, но крайне удобен если понимаешь, что ты делаешь, в mercurial как только коммит попал к тебе, он становится твоим сразу же, поэтому hg strip приходится делать каждому разработчику. Интересно, что mercurial органично впитывает лучшие идеи git: strip, rebase, rebase -i, stash, backup copy при деструктивных операциях - обратного дрейфа не заметно.
После того как освоил инструмент, обязательно начинаешь затачивать под свой workflow. Недавно, задействовав все свое bash-fu, родил монструозный алиас, чтобы понять в каком же бранче находится закрытый тикет (на самом деле главное - смерджен/не смерджен). Делать
git log --grep
git branch --contain
быстро надоело, поэтому легко заменить на
git gb #ISSUE-1234
при помощи
gb = !git --no-pager log --format=\"%H\" --decorate --all --grep=$1 | xargs -I {} sh -c \"git branch --contains {}| paste -sd ',' - && git --no-pager log --oneline --decorate {}^..{}\"
Интересная статья от tonsky
Мой .gitconfig
Есть базовая идея, которая лежит в основе, без понимания которой все остальное не имеет смысла. В идеологии git есть один мастер бранч, все остальные - временные недоразумения, которые либо вливаются в главный, либо удаляются целиком, безымянные бранчи не могут существовать (хотя конечно есть reflog). В mercurial, как наследнике svn, бранчи - полноценные долгоживущие сущности, которие живут и после слияния. Поэтому граф git выглядит как корень дерева, а mercurial - как крона. Поэтому в git сложно взглянув на граф определить в каком бранче был сделан коммит, как он попал в текущую ветку и если ли эти изменения в ней вообще.
Другая идея важная для понимания - в git, пока не был сделан merge или rebase, визуально четко разделяются чужие ветки и твои (branch-name vs origin/branch-name) поэтому fetch совершенно безопасен, поэтому push --force деструктивнее, но крайне удобен если понимаешь, что ты делаешь, в mercurial как только коммит попал к тебе, он становится твоим сразу же, поэтому hg strip приходится делать каждому разработчику. Интересно, что mercurial органично впитывает лучшие идеи git: strip, rebase, rebase -i, stash, backup copy при деструктивных операциях - обратного дрейфа не заметно.
После того как освоил инструмент, обязательно начинаешь затачивать под свой workflow. Недавно, задействовав все свое bash-fu, родил монструозный алиас, чтобы понять в каком же бранче находится закрытый тикет (на самом деле главное - смерджен/не смерджен). Делать
git log --grep
git branch --contain
быстро надоело, поэтому легко заменить на
git gb #ISSUE-1234
при помощи
gb = !git --no-pager log --format=\"%H\" --decorate --all --grep=$1 | xargs -I {} sh -c \"git branch --contains {}| paste -sd ',' - && git --no-pager log --oneline --decorate {}^..{}\"
ЗЫ
Великолепный курс от codeschoolИнтересная статья от tonsky
Мой .gitconfig


