Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 20.10.2012, 18:25
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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.
Ответить с цитированием
  #22 (permalink)  
Старый 20.10.2012, 22:45
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

monolithed, разве не было бы легче просто вести изменения в свою ветку.ю и иметь track под рукой?

... сколько бы я ни читал, всё равно не могу понять работу cherry-pick. Не могли бы вы обьяснить простым языком, зачем она нужна?
Ответить с цитированием
  #23 (permalink)  
Старый 20.10.2012, 23:41
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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 (permalink)  
Старый 24.10.2012, 02:06
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 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 - это что-то типа "выбирать лучшее".
Ответить с цитированием
  #25 (permalink)  
Старый 24.10.2012, 11:27
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

спасибо, очень просто и в то же время подробно. теперь наконец-то стало понятно, что такое cherry-pick.

карма не плюсюется (

Сообщение от x-yuri
Например, кто-то форкнул твой проект, и вносит туда изменения. Часть изменений тебя интересует.
кстати, как забирать изменения из форков?
Ответить с цитированием
  #26 (permalink)  
Старый 24.10.2012, 16:10
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от melky
кстати, как забирать изменения из форков?
$ git remote add fork url
$ git fetch fork
$ git cherry-pick ...
Ответить с цитированием
  #27 (permalink)  
Старый 24.10.2012, 20:49
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от x-yuri
А про -m 1 можешь подробнее рассказать? Насколько я понимаю, это на случай если в том коммите будет merge?
Верно понимаешь
Ответить с цитированием
  #28 (permalink)  
Старый 24.10.2012, 22:35
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от monolithed
Верно понимаешь
Но не до конца
Код:
git cherry-pick -nm 1 abcdef   # применяешь коммит (из другой ветки?)
git revert -nm 1 abcdef   # отменяешь его действие
Раз ты делаешь cherry-pick, значит ты хочешь отменить коммит в другой ветке. Но зачем отменять коммит из другой ветки в текущей ветке? Почему не переключиться на нужную ветку и там сделать git revert?

И еще там был вопрос: можно сказать, что там должна быть единица, не смотря в журнал?
Ответить с цитированием
  #29 (permalink)  
Старый 25.10.2012, 01:13
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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.
Ответить с цитированием
  #30 (permalink)  
Старый 25.10.2012, 17:27
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 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
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Collection – фреймворк для управления данными kobezzza Ваши сайты и скрипты 155 10.05.2013 08:59
Установка цвета через функцию .css() сбрасывает цвет для :hover xintrea jQuery 4 18.08.2012 15:38
Некорректная работа get(set)Attribute в IE для элементов img back to back Internet Explorer 15 09.06.2012 16:52
Удалению метаданных в JPEG lorents Библиотеки/Тулкиты/Фреймворки 2 22.04.2012 21:02
Переодическое обновление значений для графика, функция для обновления значений yupa87 Общие вопросы Javascript 0 09.07.2009 14:48