PDA

Просмотр полной версии : GIT и несколько веток


Fear
17.01.2010, 13:04
Вот у меня есть некоторое не допонимание в таком вопросе:
К примеру мы скачиваем пропатченные сорцы scriptdev2 карателя (http://github.com/insider42/scriptdev2) командой "git clone git://github.com/insider42/scriptdev2.git" там имеется 2 ветки, master и 330, мне нужна 330, но если посмотреть "git branch", он показывает только master, вот как скачать 330?

Я пробывал создать у себя новую ветку ("git branch 330") с таким же названием, переключиться в нее ("git checkout 330") и выполнить команду "git pull origin 330", но не получается.


Ну и допустим мы скачиваем сорцы мангоса, там тоже есть несколько веток, по умолчанию идет master, а мне нужна 330, как обновить мои файлы до ветки 330?


Просто я немног запутался :)

NeatElves
17.01.2010, 13:15
Инструкций валом...
Пример:
git pull git://github.com/insider42/scriptdev2.git имя ветки

timmit
17.01.2010, 14:45
Даже книжка по Git вышла недавно, даже с русским языком :)

tempura
17.01.2010, 15:34
но если посмотреть "git branch", он показывает только master



Посмотреть все локальные ветки:
git branch

Посмотреть все ветки репозитория:
git branch -a

Создаем новую ветку:
git branch 330

Переключaемся в ветку:
git checkout 330


хелп могу выложить. :)

KiriX
19.01.2010, 21:15
На выкачку смежной удалённой ветки - какой-то хитрый запрос. Он точно был на вики мангос.ру - я сам его туда записывал. Сейчас у меня этой инфы нет =(
Всё, что у меня осталось:
Вобщем собрал все основные команды в кучу:
Чтобы скачать сорцы:git clone git://github.com/mangos/mangos.git
Чтобы обновить:git pull origin master
Создаем новую ветку: git branch имя ветки
Посмотреть все ветки: git branch
Переключемся в ветку:git checkout имя ветки
Покажет изменения:git status
Создать патч файл:git diff > имя файла.patch
Патч отличий чистых сырцов и ветки:git diff master ветка -p > имя файла.patch
git diff master ветка > имя файла.patch
Применить патч:git am < имя файла.patch
git apply < имя файла.patch
Применение патча с созданием новых файлов:patch -p1 < имя файла.patch
Добавить все изменения:git add *
По отдельности:git add имя файла
Сделать commit:git commit -a -m "work patch"
Можно на него полюбоваться:git log
Возвращение к чистым исходникам:git clean -f -x -d
Переключаемся в основную ветку:git checkout master
Удаляем созданную ветку:git branch имя ветки -D

Собрано на просторах форума, думаю должно быть быть именно здесь

Вобщем собрал все основные команды в кучу:
Чтобы скачать сорцы:
Код:
git clone git://github.com/mangos/mangos.git

Чтобы обновить:
Код:
git pull origin master

Создаем новую ветку:
Код:
git branch имя ветки

Посмотреть все ветки:
Код:
git branch

Переключемся в ветку:
Код:
git checkout имя ветки

Покажет изменения:
Код:
git status

Создать патч файл:
Код:
git diff > имя файла.patch

Патч отличий чистых сырцов и ветки:
Код:
git diff master ветка -p > имя файла.patch
git diff master ветка > имя файла.patch

Применить патч:
Код:
git am < имя файла.patch
git apply < имя файла.patch

Применение патча с созданием новых файлов:
Код:
patch -p1 < имя файла.patch

Добавить все изменения:
Код:
git add *

По отдельности:
Код:
git add имя файла

Сделать commit:
Код:
git commit -a -m "work patch"

Можно на него полюбоваться:
Код:
git log

Возвращение к чистым исходникам:
Код:
git clean -f -x -d

Переключаемся в основную ветку:
Код:
git checkout master

Удаляем созданную ветку:
Код:
git branch имя ветки -D

Реверт всех изменений в коде:
Код:
git reset --hard

Патчи из другой ветки:
git branch 1, git checkout 1, затем одну из приведенных выше git pull, потом git diff master 1 -p > new_patch.patch , копируем его мне. Потом git checkout master, git branch -D 1 и по новой, но с другим git pull, опять же приведённым выше.

Откат патча:
patch -p1 -R < /путь до патча/*.patch
Выкачиваются же из другой удалённой ветки как-то так:
git clone git://github.com/mangos/mangos.git
git pull branch ИМЯ_ЛОКАЛЬНОЙ_ВЕТКИ origin ИМЯ_УДАЛЁННОЙ_ВЕТКИ
Это не точно, это приблизительно по памяти =)

Konctantin
19.01.2010, 21:31
Даже книжка по Git вышла недавно, даже с русским языком
гиде, можно увидеть?

timmit
19.01.2010, 21:47
http://habrahabr.ru/blogs/Git/80909/ в этой теме посмотри, там и на англ. и русский есть, и pdf и еще другое

Zetget
21.01.2010, 15:12
щас выкачиваю с ветки так (на lunix / ubuntu ):
git clone git://github.com/insider42/scriptdev2.git ~/mangos/scripts -o 330

на винде раньше выкачивал так:
git clone git://github.com/insider42/scriptdev2.git -b 330

Кот ДаWINчи
24.01.2010, 17:54
Вот собрал инструкцию по GIT. Пользуйтесь. Материал на гуглил в интернете. Потом слегка отформатировал и конвертанул в CHM.

Chesterfield
24.01.2010, 22:39
mercurial рулит :D

Кот ДаWINчи
24.01.2010, 23:09
mercurial рулит :D

Конструктива не вижу в данной фразе.... это не просто оффтопик, а злейший оффтопик. Здесь люди задают вопросы про ГИТ.


Теперь по теме.

Я обычно скачиваю ветку master

затем чтобы перейти на другую (например 330)
делаю так:
git branch 330
git Checkout 330

и всё в репозитории уже версия под 330

чтобы вернуться к master
делаю так:
git branch master
git Checkout master

при этом скачивается с инета очень мало. (посравнению со всем репозиторием)

timmit
24.01.2010, 23:11
mercurial рулит :D
Можно подробнее, чем он лучше?

Chesterfield
24.01.2010, 23:23
Конструктива не вижу в данной фразе....
Да не знаю что меня дернуло... но раз начал :)

Собщем давно сидел на Subversion как и все, и никаких проблем не знал, потом мангос вдруг резко перешел на git. Для меня эта система была нова, и понять я её сразу не смог, но как понял, то она мне понравилась. Тут тебе и ветки, и форки, и мержи - чего только нет. Но потом я узнал про mercurial. Система впринципе таже, только для чего было разделять коммит и слив коммита? Сначала не я понял, но когда поюзал, то понял что это самая удобная система управления версиями для меня. Чем она лучше гита рассказывать не буду (все это можно найти в инете по запросу hg vs git), но мне на данный момент больше всего нравится hg. Думаю кто юзал, тот меня понимает :)

KiriX
27.01.2010, 00:29
Я обычно скачиваю ветку master // git clone - и мы выкачиваем удалённую ветку по умолчанию

затем чтобы перейти на другую (например 330)
делаю так:
git branch 330 // нормальная команда - создаёт локальную ветку, по умолчанию - копия того, что выкачано командой git clone в самом начале
git Checkout 330 // Ага - первой командой ветку создали, а этой - в неё перешли/переключились

и всё в репозитории уже версия под 330 // из всего вышесказанного следует, что данная строка - бред =)

чтобы вернуться к master // Четыре строки просто без комментариев...
делаю так:
git branch master
git Checkout master

при этом скачивается с инета очень мало. (посравнению со всем репозиторием) // Ну естественно!!! "Очень мало" и "посравнению" как нельзя более точно подходит, если учесть, что таким образом git в интрнет вообще не обращается
Извините за грубость, но это бред сивой кобылы (чтим комменты). Не вводите, пожалуйста, людей в заблуждение.
Без обид, просто я постоянно работаю с этими командами и отлично знаю что и как они делают. Прежде чем перечить мне - просто отключи интернет и попробуй проделать эти же операции и ты узришь чудо: всё получится, т.к. при использовании данных команд никакого обращения к интернету гит не производит...

А меркуриал и правда в разы удобнее, понятнее и симпатичнее (хотя я с ним и работал совсем немного)

P.S: Первый же запрос в гугле вывел меня на вовжопаподобный сайт, куда кто-то заботливо перекатал текст из магос.ру вики. Узнаю свой текст (саму команду говорил в своё время TOM_RUS, я лишь записал на человекопонятном языке на вики) =)
Чтобы скачать сорсы из определённой удалённой ветки:
Сначала просто выкачиваем сорсы:
git clone АДРЕС
Затем можем переключиться в любую выбранную удалённую ветку:
git checkout -b ИМЯ_ЛОКАЛЬНОЙ_ВЕТВИ origin/ИМЯ_УДАЛЁННОЙ_ВЕТВИ_КОТОРУ _ХОТИМ_ВЫКАЧАТЬ

Пример для сорсов Карателя:
git clone git://github.com/insider42/mangos.git
git checkout -b OLD origin/322_stable
Таким образом и вправду выкачивается очень быстро

+ ещё всё что там было:
Основные команды

Чтобы скачать сорцы

git clone git://github.com/mangos/mangos.git

Чтобы обновить:

git pull origin master



Работа с ветками

Создаем новую ветку:

git branch имя ветки

Чтобы просмотреть все ветки (локальные + ветки удалённого репозитория):

git branch -a

Посмотреть все ветки:

git branch


Переключемся в ветку:

git checkout имя ветки

Покажет изменения:

git status

Переключаемся в основную ветку:

git checkout master

Удаляем созданную ветку:

git branch имя ветки -D

Удаляем ветку с сервера:

git push <сервер> :heads/<удаляемая ветка>

Чтобы скачать сорсы из определённой ветки: Сначала просто выкачиваем сорцы, а потом:

git checkout -b ИМЯ_ЛОКАЛЬНОЙ_ВЕТВИ origin/ИМЯ_ВЕТВИ,_КОТОРУЮ_ХОТИМ_ВЫ АЧАТЬ



Работа с патчами

Создать патч файл:

git diff > имя файла.patch

Патч отличий чистых сырцов и ветки:

git diff master ветка -p > имя файла.patch
git diff master ветка > имя файла.patch

Создание патч файла из разницы ревизий:

git diff id_commit1 id_commit2 > имя_файла.patch
пример:
git diff 1f7e07689fcc8c60d6d768df8aa268d11a9e8bfe 69b2263cdb620020df0bc9968168046ff12fd7d4 > 7768-7785.patch

Создание патч файла git-репозитория патча:

git branch ИМЯ_ВЕТКИ,_КУДА_БУДЕМ_СЛИВА Ь_ПАТЧ
git checkout ИМЯ_ВЕТКИ,_КУДА_БУДЕМ_СЛИВА Ь_ПАТЧ
git pull git://github.com/charlie2025/mangos.git outdoor_0.12 (пример)
git diff master ИМЯ_ВЕТКИ,_КУДА_БУДЕМ_СЛИВА Ь_ПАТЧ -p > outdoor.patch

идем в корневую папку мангоса и находим там outdoor.patch, его заливаем на форум либо на обменник и даём сцыль сюда

Применить патч:

git am < имя файла.patch

или

git apply < имя файла.patch

Применение патча с созданием новых файлов:

patch -p1 < имя файла.patch

или откатить определённый патч (например, при использовании кумулятивного патча):

patch -p1 -R < имя файла.patch



Другое

Добавить все изменения:

git add *

По отдельности:

git add имя файла

Сделать commit:

git commit -a -m "work patch"

Можно на него полюбоваться:

git log

Возвращение к чистым исходникам:

git clean -f -x -d

Реверт всех изменений в коде:

git reset --hard

Скачать определённую ревизию(к примеру 10 ревизий назад):

Скачивая самую свежую ревизию, Вы скачиваете всю историю изменений с момента создания репозитория.
Поэтому, чтобы получить исходники, например, которые были 10 коммитов назад на коммит (x-10) нужно:
git checkout master
git reset HEAD~10
Единственное - все изменения после коммита (x-10) буду потеряны.
Нужно будет заново закачать их. (с) begemot

Переход к определенной ревизии:

Найти код commit для нужной ревизии

git log -1 --grep=[7501]

где -1 это количество шагов к нашей ревизии 7501 от последней загруженной

вывод commit c879da174f4a2b6efbc59c43b34d580ff4de3efc

переход к нужной ревизии с созданием новой ветки "7501"

git checkout -b 7501 c879da174f4a2b6efbc59c43b34d580ff4de3efc

Посмотреть номер последнего коммита имеющихся исходников:

git show

Q:Вот ещё задачка: как заставить git не добавлять каждый раз в изменения определённую папку? например я положил папку ScriptDev2 в mangos\src\bindings, но при создании любых патчей она всплывает... черепашка тупо не трогала папки где нет её файлов, а как быть с git?
A: В .git/info/exclude добавь src/bindings/ScriptDev2/*


Совет: Если вы пользуетесь системой контроля версий git, то возможно вам надоедает набирать длинные команды git status, git checkout, git commit, git branch. Можно прописать в ~/.gitconfig для них короткие алиасы:

[alias]
ci = commit
co = checkout
st = status
br = branch
спасибо Skel за то, что он собрал всё в кучу:)
Взято с http://mangos.ru/wiki/index.php/FAQ_GIT

Moonkins
28.01.2010, 22:08
Чтобы скачать сорсы из определённой удалённой ветки:
Сначала просто выкачиваем сорсы:
git clone АДРЕС
Затем можем переключиться в любую выбранную удалённую ветку:
git checkout -b ИМЯ_ЛОКАЛЬНОЙ_ВЕТВИ origin/ИМЯ_УДАЛЁННОЙ_ВЕТВИ_КОТОРУ _ХОТИМ_ВЫКАЧАТЬ

Пример для сорсов Карателя:
git clone git://github.com/insider42/mangos.git
git checkout -b OLD origin/322_stable
Таким образом и вправду выкачивается очень быстро
Прозьба привести пример на сорцах карателя 330_test
Скачиваю: git clone git://github.com/insider42/mangos.git
Использую: git checkout -b OLD origin/330_test
Пишет: fatal: not a git repository: .git

tempura
28.01.2010, 22:36
вот странно.... цепочка:
git clone git://github.com/insider42/mangos.git
git pull origin 330_stable
нормально выкачивает стабильную ветку...

цепочка:
git branch 330_test
git checkout 330_test
git pull origin 330_test
нормально создает новую локальную ветку, переключается в нее, и обновляет в ней сорцы.

Не мог бы ты подробнее описать, что именно ты хочешь сделать?

Alexstrasza
28.01.2010, 23:10
есть еще и программы-фронтэнды к git,
а для mangos на github еще и можно скачать снапшоты
(выбираете нужную ветку, тыкаете в последний коммит, жмете на кнопочку download source)

KiriX
29.01.2010, 01:17
Прозьба привести пример на сорцах карателя 330_test
Скачиваю: git clone git://github.com/insider42/mangos.git
Использую: git checkout -b OLD origin/330_test
Пишет: fatal: not a git repository: .git
Я пример для чего вообще писал? Для кого? Кому тут в столь ясном примере что-то может быть неясно???
Может вам эти сорсы вообще выкачать и в архиве положить?
Обидно, что вы даже ошибку не удосужились хотя бы попытаться перевести =(
вот странно.... цепочка:
git clone git://github.com/insider42/mangos.git -- ну да - выкачиваем удалённую ветку по умолчанию
git pull origin 330_stable -- простое обновление выкаченной ветки, кстати, ветка 330_stable и есть ветка по умолчанию сейчас в репозитории Карателя
нормально выкачивает стабильную ветку...

цепочка:
git branch 330_test -- ага - создали ЛОКАЛНУЮ ветку, копию 330_stable в нашем случае, с НАЗВАНИЕМ ветки 330_test
git checkout 330_test -- переключились в только что созданную ветку
git pull origin 330_test -- СЛИЛИ локальную ветку (которая на самом-то деле 330_stable) с удалённой веткой 330_test
нормально создает новую локальную ветку, переключается в нее, и обновляет в ней сорцы.
Это не совсем корректный пример... Таким образом вы выкачиваете ветку по умолчанию удалённого репозитория и СЛИВАЕТЕ её с веткой 330_test... В случае карателя и сейчас - это прокатывает, т.к. 330_stable сейчас девственно чиста + меньшей ревизии, чем 330_test и сливая её с веткой 330_test вы не только накладываете на неё патчи, но и обновляете сами исходники мангоса. Когда набор патчей будет идентичен, а в 330_test будут теже патчи что и в стейбл + новые - при такой цепочке вы очень даже можете получить конфликты при слиянии. Мой же способ выкачивает ТОЛЬКО указанную удалённую ветки ни с чем её не сливая.
Темпура, таким образом всю твою цепочку можно легко сократить до:
git clone git://github.com/insider42/mangos.git
git pull origin 330_test
В итоге получим всё тоже самое, что и в вашей длинной цепочке.