20.10.2012, 18:25
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от melky
|
cкажите, зачем после stash apply делать всё, что есть ниже? (до проф. уровня пользования git'ом ещё не дошло)
|
Представь что ты находишься в какой-то ветке, и тебе кидают таск с критическим статусом.
Если внесенных изменений не достаточно для полноценного комита, то логично сделать git stash, чтобы потом к ним вернуться.
В тот момент когда ты делал другой таск в твою ветку что-то запушили. И для того чтобы работать с актуальной версией нужно сделать pull и накатить свои изменения (git stash apply). Тоже самое можно сделать с помощью git stash pop.
Но вот не задача, ты случайно закоммитил файл c каким-то багом, и хочешь убрать из его ветки, для этого есть git cherry-pick.
А git revert -nm 1 ... нужно для того чтобы вырвать пуш из мержда.
И вот ты вернулся к своему таску, все сделал, теперь можно сделать git stash drop, чтобы удалить из стека stash
Последний раз редактировалось monolithed, 20.10.2012 в 21:31.
|
|
20.10.2012, 22:45
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
monolithed, разве не было бы легче просто вести изменения в свою ветку.ю и иметь track под рукой?
... сколько бы я ни читал, всё равно не могу понять работу cherry-pick. Не могли бы вы обьяснить простым языком, зачем она нужна?
|
|
20.10.2012, 23:41
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от melky
|
разве не было бы легче просто вести изменения в свою ветку
|
До недавнего времени у меня была такая структура проекта:
master
workspace
Сейчас:
master
alpha
feature
Если мне нужно пофиксить какой-то баг или ввести новую фичу, то я создаю ветку feature-1 (постфикс инкрементируется), тестирую, если все гуд, то вливаю в alpha.
Когда протестирую в альфе, переношу в мастер и удаляю feature
alpha нужна потому, что параллельно может делаться несколько фич и если их сразу мерджить в мастер, то все может взорваться.
У меня стандартный workflow выглядит примерно так:
...
git checkout alpha
git checkout -b feature-8628
git pull origin alpha
...
git status
git commit -am 'feature-8628: description'
git push origin feature-8628
git log -p
git checkout alpha
...
git diff HEAD feature-8628
git merge origin/feature-8628
git status
git commit -a
git push origin alpha
git log --graph
git checkout master
git pull origin master
git merge alpha
git diff --staged
git commit -a
git branch -d feature-8628
git push origin master
git log --stat
PS: Для меня такая структура оптимальна, однако для многопользовательской работы над ответственным проектом не помешает еще одна промежуточная ветка test
Сообщение от melky
|
иметь track под рукой?
|
Причем тут трек?
Я лично использую JetBrains YourTrack, в котором и создаю таски
Сообщение от melky
|
... сколько бы я ни читал, всё равно не могу понять работу cherry-pick. Не могли бы вы обьяснить простым языком, зачем она нужна?
|
Выдергивает коммит из ветки, путем создания нового коммита (патч)
Последний раз редактировалось monolithed, 21.10.2012 в 13:12.
|
|
24.10.2012, 02:06
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
monolithed, давай еще раз
Код:
|
# надо исправить критический баг
git stash # откладываешь текущие изменения
git pull origin branch # получаешь актуальное содержимое ветки
.... # исправляешь баг, commit, push
git stash apply # возвращаешься к тому, чем до этого занимался
... # понимаешь, что надо отменить коммит abcdef
git cherry-pick -nm 1 abcdef # применяешь коммит (из другой ветки?)
git revert -nm 1 abcdef # отменяешь его действие |
А про -m 1 можешь подробнее рассказать? Насколько я понимаю, это на случай если в том коммите будет merge? Можно сказать, что там должна быть единица, не смотря в журнал?
Сообщение от melky
|
... сколько бы я ни читал, всё равно не могу понять работу cherry-pick. Не могли бы вы обьяснить простым языком, зачем она нужна?
|
Давай еще я попробую. Копирует отдельный коммит (или несколько коммитов) в текущую ветку, при этом связь (типа merge) не образуется. В первую очередь нужно когда есть несколько веток (репозиториев), которые не предполагается мерджить. Например, кто-то форкнул твой проект, и вносит туда изменения. Часть изменений тебя интересует. Или если надо пофиксить баг в предыдущей версии программы. Cherry pick - это что-то типа "выбирать лучшее".
|
|
24.10.2012, 11:27
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
спасибо, очень просто и в то же время подробно. теперь наконец-то стало понятно, что такое cherry-pick.
карма не плюсюется (
Сообщение от x-yuri
|
Например, кто-то форкнул твой проект, и вносит туда изменения. Часть изменений тебя интересует.
|
кстати, как забирать изменения из форков?
|
|
24.10.2012, 16:10
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от melky
|
кстати, как забирать изменения из форков?
|
$ git remote add fork url
$ git fetch fork
$ git cherry-pick ...
|
|
24.10.2012, 20:49
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от x-yuri
|
А про -m 1 можешь подробнее рассказать? Насколько я понимаю, это на случай если в том коммите будет merge?
|
Верно понимаешь
|
|
24.10.2012, 22:35
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от monolithed
|
Верно понимаешь
|
Но не до конца
Код:
|
git cherry-pick -nm 1 abcdef # применяешь коммит (из другой ветки?)
git revert -nm 1 abcdef # отменяешь его действие |
Раз ты делаешь cherry-pick, значит ты хочешь отменить коммит в другой ветке. Но зачем отменять коммит из другой ветки в текущей ветке? Почему не переключиться на нужную ветку и там сделать git revert?
И еще там был вопрос: можно сказать, что там должна быть единица, не смотря в журнал?
|
|
25.10.2012, 01:13
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от x-yuri
|
Раз ты делаешь cherry-pick, значит ты хочешь отменить коммит в другой ветке.
|
Может мне наоборот нужно накатить чей-то коммит из другой ветки в свою
Сообщение от x-yuri
|
Но зачем отменять коммит из другой ветки в текущей ветке? Почему не переключиться на нужную ветку и там сделать git revert?
|
Преположим что есть ветка alpha, в которую мы подмерджили beta. Помимо ветки beta в мердже участвовали и другие ветки.
И в какой-то момент стало понятно что ветку beta нужно вырвать из итерации. Сделать это безопасно можно так:
git revert -nm 1 hash
Сообщение от x-yuri
|
И еще там был вопрос: можно сказать, что там должна быть единица, не смотря в журнал?
|
В большинстве случаев, да (-m 1 первый коммит)
Последний раз редактировалось monolithed, 25.10.2012 в 01:20.
|
|
25.10.2012, 17:27
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
значит получается так:
Код:
|
# ВНЕЗАПНО! надо исправить критический баг
$ git stash # откладываешь текущие изменения
$ git pull origin branch # получаешь актуальное содержимое ветки
.... # исправляешь баг
$ git commit
$ git push
...
$ git stash pop # возвращаешься к тому, чем до этого занимался
...
$ git cherry-pick -nm 1 a12345 # копируешь один коммит из другой ветки
...
$ git revert -nm 1 b67890 # отменяешь другой коммит из текущей ветки |
по поводу -m, получается, что -m 1 - для той ветки, в которую делали merge:
Код:
|
git init
echo '1
2
3' > 1
git add .
git commit -m 1
git checkout -b 2
echo '1
2
33' > 1
git add .
git commit -m 2
git checkout master
echo '11
2
3' > 1
git add .
git commit -m 2
# git checkout 2 # не работает, если раскомментировать
# git merge master # и комментарий к reverse неправильный (reversing changes made to ...)
# git checkout master # потому что в этом случае должно быть -m 2
git merge 2
git revert -m 1 HEAD |
|
|
|
|