Временами при работе с git одновременно нескольких человек возникают не очень красивые записи в журнале: «Merge branch ‘master’ of ssh://<usr>@<server>/path/to/repo», которые не несут особенно большого объема информации. Так, к примеру, посмотрев данный коммит в git-web мы не увидим никакой информации об измененных файлах. Такая ситуация возникает когда вы делаете git pull в вашей рабочей копии репозитория, в которую внесены изменения, при этом происходит авто merge.
Git stash
Для борьбы с такими записями существует специальная команда — git stash.
Команда git stash созраняет все не закомиченные изменения во временное хранилище (карман) и сбрасывает состояние ветки до HEAD.
- git stash — добавить текущие незакоммиченные изменения в стек изменений и сбросить текущую рабочую копию до HEAD’а репозитория;
- git stash list — показать все изменения в стеке;
- git stash show — показать последнее измененеие в стеке (патч);
- git stash apply — применить последнее изменение из стека к текущей рабочей копии;
- git stash drop — удалить последнее изменение в стеке;
- git stash pop — применить последнее изменение из стека к текущей рабочей копии и удалить его из стека;
- git stash clear — очистить стек изменений.
То есть фактически необходимо вызвать следующую последовательность команд:
1 2 3 4 5 6 7 |
git stash git pull git stash apply git add -u git commit git push git stash drop |
Git rebase
При работе с несколькими ветками одновременно в конце концов возникает необходимость применить все изменения с одной ветки на базовую (ну конечно это возникает не всегда, но часто), причем, как правило, базовая ветка с тех пор успела поменять свое содержимое. В таких случаях для слияния веток рекомендуется использовать команду git rebase.
Данная команда сохраняет все ваши изменения на ветке, которые вы сделали с момента ответвления, и накладывает на эту ветку все изменения которые были сделаны на master ветке, после чего применяет все ваши изменения. Таким образом вы получаете ветку, которая ответвляется от текущей master-ветки и теперь вы можете успешно сделать git merge.
Пример использования:
1 2 3 4 |
git checkout feature1 git rebase master git checkout master git merge feature1 |
Литература:
- git add —help
- git rebase —help
- http://evasive.ru/articles/git_kung-fu.html