Skip to content

Instantly share code, notes, and snippets.

@dmexe
Created December 21, 2011 22:32
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save dmexe/1508019 to your computer and use it in GitHub Desktop.
Save dmexe/1508019 to your computer and use it in GitHub Desktop.
Git workflow

После установки

Указываем свое имя и почту

git config --global user.name "Your Name Comes Here"
git config --global user.email you@yourdomain.example.com

Делаем алиасы на команды

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative"
git config --global alias.put "push origin HEAD"
git config --global alias.up "pull --rebase --stat"
git config --global alias.edit-unmerged '!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; vim `f`'
git config --global alias.add-unmerged '!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; git add `f`'
git config --global alias.lc "log ORIG_HEAD.. --stat --no-merges"

Настраиваем себе shell чтобы показывал как минимум текущий бранч, а лучше полную информацию о состоянии репозитория

Пример для ZSH:

# vcs
autoload -Uz vcs_info

zstyle ':vcs_info:*' stagedstr '%F{28}●'
zstyle ':vcs_info:*' unstagedstr '%F{11}●'
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{11}%r'
zstyle ':vcs_info:*' enable git svn

# prompt
precmd () {
  if [[ -z $(git ls-files --other --exclude-standard 2> /dev/null) ]] {
    zstyle ':vcs_info:*' formats ' %F{yellow}[%b%c%u%F{yellow}]%F{green}'
  } else {
    zstyle ':vcs_info:*' formats ' %F{yellow}[%b%c%u%F{red}●%F{yellow}]%F{green}'
  }
  vcs_info
}

autoload -U promptinit
promptinit
setopt prompt_subst
PROMPT='%B%F{blue}%n@%k %B%F{green}%1~${vcs_info_msg_0_} %# %b%f%k'

Работа над тикетами

После получения тикета создаем под него бранч (в мастере никогда не работаем) с именем -<title>, например 22-messages или 73-votes

$ git co master 
$ git co -b branch_name

После этого вы находитесь в копии master, всю работу делаем только в этом бранче. После того как сделали что то полезное, сохраняем это на сервере

$ git ci -a -m "(#22) сделал охуенную фичу"
$ git put

Если git put выдал ошибку, скорее всего у вас устаревшая копия бранча (кто то другой сделал комиты), нужно забрать свежие изменения с сервера, забираем их и сохраняем изменения на сервере поторно

$ git up
$ git put

Синхронизация с master

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

$ git rebase master

и если будут конфликты - обязательно их поправить.

rebase master и конфликты

Сама операция git rebase нужна для поддержания рабочей ветки в актуальном состоянии. По мимо вас, обычно, над приложением работает еще несколько человек и если постоянно не синхронизироваться с master, за то время, пока будете работать над очередной фичей, в мастере накопится куча изменений. При попытке залить комиты из рабочего бранча, будет скорее всего очень много конфликтов, иногда придется тратить весь рабочий день на их разрешение (были прецеденты).

Во время git rebase могут возникнуть конфликты, git об этом напишет, исправлять это так:

получаем новые изменения с сервера:

$ git up

запустили rebase:

$ git rebase master

получили конфликт в файле

открываем в любимом редакторе файл, и ищем подобный текст

<<<<<<< HEAD
client
=======
upstream
>>>>>>> d918d23958841041e2f75b9cbfafc93e9a9a1321

из этого оставляем текст client или upstream, служебные метки удаляем, ищем в файле конфликты дальше и исправляем, если все поправили не забываем сохранить файл

выполняем команду:

$ git add filename_with_conflicts

продолжаем rebase командой:

$ git rebase --continue

получили конфликт в файле

...

и так пока оно не синхронизируется

После того как сделали синхронизацию master, обязательно выполняем:

$ git put -f

При получении изменений с сервера командой git up, тоже могут возникнуть конфликты, исправлять так же:

$ git up
... конфликт
$ vim file_with_conflicts
... исправляем и сохраняем файл
$ git add file_with_conflicts
$ git rebase --continue
...
$ git put

Полезные команды

  • git stash - сохраняет не закомиченные изменения, для того что бы их применить нужно выполнить git stash apply
  • git diff - показывает незакомиченные изменения в файлах
  • git cherry branch1 branch2 -v - показывает отличия бранчей
  • git show - покажет изменения в последнем комите
  • git show commitId - покажет изменения в комите commitId
  • git push origin :branch1 - удаляет на сервере бранч branch1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment