Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → [RU] Research & Development → Вопросы по git

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 2

1 (edited by iltmpz 19.11.2014 19:54)

Topic: Вопросы по git

(чувствую, что тему сейчас создам не в том разделе, но другое место для нее найти не могу)
Не знаю, нужна ли здесь на форуме эта тема, но уже замучился вникать в git - постоянно то одна мелочь, то другая - приходится тратить по часу и больше на элементарнейшие операции.
Попытаюсь свои вопросы как-то системазитировать в этой теме, ну и тут спрашивать, когда что-нибудь конкретное никак не удается сделать. Может, она когда-нибудь превратится в законченное руководство по git, переедет в раздел FAQ и кому-нибудь пригодится?..

В процессе изучения пользуюсь следующими инструкциями:
git-scm.com/book/ru - Отличный источник для ознакомления с git отсюда: harpywar.com/?a=articles&b=2 … mp;lang=ru Очень подробная инструкция. Из которой понятно, что git умеет, но не всегда понятно, как сделать то, что мне в данный момент требуется.
habrahabr.ru/post/125999/ - краткое описание схемы, которую я пытаюсь использовать для модификации pvpgn.

Что я имею в данный момент (шпаргалка для меня, и может, посоветуете, как это оптимизировать?):

Задача №1:
имею на github свой форк проекта pvpgn, чистый комп, на котором собираюсь ее развивать. Надо ее туда скачать, накатить все последние коммиты (на которые родительский проект ушел вперед) и мои личные ветки, которых пока одна:

скачиваю:

# git clone git://github.com/iltmpz/pvpgn
Cloning into 'pvpgn'...
remote: Counting objects: 9845, done.
remote: Compressing objects: 100% (3288/3288), done.
remote: Total 9845 (delta 6479), reused 9845 (delta 6479)
Receiving objects: 100% (9845/9845), 7.30 MiB | 1.35 MiB/s, done.
Resolving deltas: 100% (6479/6479), done.
Checking connectivity... done.
# cd pvpgn/

Подцепить родительский форк от HarpyWar:

# git remote add upstream git://github.com/HarpyWar/pvpgn
# git fetch upstream
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 0), reused 1 (delta 0)
Unpacking objects: 100% (8/8), done.
From git://github.com/HarpyWar/pvpgn
 * [new branch]      clan_refactorings -> upstream/clan_refactorings
 * [new branch]      master     -> upstream/master

Вроде по мануалу я оригинальный репозитарий подцепил, но git log не показывает его последних коммитов, сделанных после моего форка.

# git pull upstream master
From git://github.com/HarpyWar/pvpgn
 * branch            master     -> FETCH_HEAD
Updating 451718a..954dcd1
Fast-forward
 src/bnetd/handle_wol.cpp | 57 ++++++++++++++++++++++++++++-----------------------------
 src/bnetd/helpfile.cpp   |  2 +-
 src/bnetd/irc.cpp        | 19 +++++++++----------
 src/bnetd/message.cpp    |  4 ++--
 4 files changed, 40 insertions(+), 42 deletions(-)

Вот, сейчас все эти изменения скачались - вижу.

Кстати, у меня "git log", равно как и "git diff" и т.п. команды показывали вместо подсвеченных разноцветных скобочек вот такой мусор:
ESC[33mcommit 954dcd131ae1b2c8f992932872d4990c610a0581ESC[m
Для решения этой проблемы помогло изменение PAGER с more на less.

Теперь шаг следующий: надо подцепить мою ветку, которую я пока разрабатываю и не готов отправить в pull request:

# git checkout -b origin/attrgroup_refactoring
Switched to a new branch 'origin/attrgroup_refactoring'

Кстати, не понял, могу ли я как-то узнать, как она называется из командной строки? Я просто знаю еще название (могу подсмотреть через веб-интерфейс). А могу ли я узнать имена всех своих веток? И почему она не подгрузилась автоматом, когда я делал clone?

Дальше эта только что подключенная ветка у меня пуста - не совсем понимая почему, методом тыка подобрал такую команду:

# git fetch origin attrgroup_refactoring
From git://github.com/iltmpz/pvpgn
 * branch            attrgroup_refactoring -> FETCH_HEAD

Что-то скачалось, теперь после fetch обычно надо сделать pull:

# git pull origin attrgroup_refactoring

Опа - выдало код в редакторе с предложением:
"Merge branch 'attrgroup_refactoring' of git://github.com/iltmpz/pvpgn into origin/attrgroup_refactoring"

Кажется, я сделал что-то не то: создал пустую локальную ветку и загрузил в нее одноименную удаленную... Как надо было сделать правильно?
Ладно, вышел из редактора, получил:

Merge made by the 'recursive' strategy.
 src/bnetd/attrgroup.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 55 insertions(+), 24 deletions(-)

Ура, результат достигнут, в git log я его вижу.

Надеюсь на развернутые пояснения по шагам, что и как я сделал неправильно.
Ну и буду пользоваться этой инструкцией для себя в будущем, а то каждый раз наощупь пытаюсь подбирать команды для получения требуемого результата...

Задача №2:
переключиться в новую ветку, сделать в ней изменения, отправить ее в свой удаленный репозиторий на github

# git checkout -b gccfix_err_warn
Switched to a new branch 'gccfix_err_warn'

Все, ветка создана, дальше творю нечто с кодом...
Что-то сделал, смотрим, что именно:

# git status
On branch gccfix_err_warn
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   ../src/bnetd/account.cpp
        modified:   ../src/bnetd/adbanner.cpp
        modified:   ../src/bnetd/i18n.cpp
        modified:   ../src/bnetd/luafunctions.cpp
        modified:   ../src/bnetd/luainterface.cpp
        modified:   ../src/bnetd/luaobjects.cpp
        modified:   ../src/bnetd/luawrapper.cpp
        modified:   ../src/bnetd/output.cpp
        modified:   ../src/bnetd/userlog.h
        modified:   ../src/bnpass/sha1hash.cpp
        modified:   ../src/common/bigint.cpp
        modified:   ../src/compat/pdir.cpp

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        ./
        ../cmake/Modules/cmake_purge.cmake
        ../cmake/Modules/cmake_uninstall.cmake
        ../src/common/.xstring.cpp.swp

no changes added to commit (use "git add" and/or "git commit -a")

Так, добавляю каждый файл по очереди в будущий коммит:

root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/account.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/adbanner.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/i18n.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/luafunctions.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/luainterface.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/luaobjects.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/luawrapper.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/output.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnetd/userlog.h
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/bnpass/sha1hash.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/common/bigint.cpp
root@backup:~/pvpgn/iltmpz/pvpgn/build # git add ../src/compat/pdir.cpp

Вроде бы, можно было вместо всего этого сделать git commit -a?
смотрим теперь:

# git status
On branch gccfix_err_warn
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   ../src/bnetd/account.cpp
        modified:   ../src/bnetd/adbanner.cpp
        modified:   ../src/bnetd/i18n.cpp
        modified:   ../src/bnetd/luafunctions.cpp
        modified:   ../src/bnetd/luainterface.cpp
        modified:   ../src/bnetd/luaobjects.cpp
        modified:   ../src/bnetd/luawrapper.cpp
        modified:   ../src/bnetd/output.cpp
        modified:   ../src/bnetd/userlog.h
        modified:   ../src/bnpass/sha1hash.cpp
        modified:   ../src/common/bigint.cpp
        modified:   ../src/compat/pdir.cpp

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        ./
        ../cmake/Modules/cmake_purge.cmake
        ../cmake/Modules/cmake_uninstall.cmake
        ../src/common/.xstring.cpp.swp

Коммитим:

#git commit

открылся редактор, я в нем пишу новую строку, о чем этот коммит.

Все, коммит сделан, в локальном репозитории.
Теперь надо отправить его на github:

# git push origin gccfix_err_warn
fatal: remote error:
  You can't push to git://github.com/iltmpz/pvpgn.git
  Use https://github.com/iltmpz/pvpgn.git

Опа, что это еще такое?
Нагуглил решение: https://coderwall.com/p/7begkw

# git remote rm origin
# git remote add origin git@github.com:iltmpz/pvpgn
# git push origin gccfix_err_warn
The authenticity of host 'github.com (192.30.252.128)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Не знаю, что это, но не получается.
Получилось в итоге вот так:

# git remote rm origin
# git remote add origin https://github.com/iltmpz/pvpgn.git
# git push origin gccfix_err_warn
Username for 'https://github.com':
Password for 'https://iltmpz@github.com':
Counting objects: 98, done.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 2.90 KiB | 0 bytes/s, done.
Total 31 (delta 28), reused 0 (delta 0)
To https://github.com/iltmpz/pvpgn.git
 * [new branch]      gccfix_err_warn -> gccfix_err_warn

Ура! Коммит ушел на сервер!

Задача №3:
У меня на сервере в отправленном коммите оказался лишний файл, который вообще был из другой ветки: src/bnetd/attrgroup.cpp. Как мне его удалить из своего коммита и своей ветки на github?
И откуда он вообще там взялся?
Я ведь сделал отдельную ветку attrgroup_refactoring, в ней отредактировал и закоммитил файл src/bnetd/attrgroup.cpp, отправил на сервер,
после чего создал другую ветку gccfix_err_warn, переключился в нее и там произвел изменения. И при этом файл src/bnetd/attrgroup.cpp не добавлял. Откуда же он тогда взялся?

2

Re: Вопросы по git

iltmpz wrote:

А могу ли я узнать имена всех своих веток?

git branch показывает список всех веток.
git checkout название_ветки переходит в другую ветку
git checkout -b название_ветки создает новую ветку

iltmpz wrote:

У меня на сервере в отправленном коммите оказался лишний файл, который вообще был из другой ветки: src/bnetd/attrgroup.cpp. Как мне его удалить из своего коммита и своей ветки на github?

В новую ветку нельзя переместиться не зафиксировав из в предыдущей. Поэтому, скорее всего, где-то была сделана ошибка или лишнее действие в наборе команд.


Инструменты сайта github.com позволяют упростить некоторые вещи. Например, чтобы стянуть изменения из моего репозитария, достаточно нажать кнопку "Compare" (она отображается в своем форке) и там сделать обратный Pull request моих изменений в свой репозитарий.

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


Очень важно ознакомиться с возможностями Git в командной строке, чтобы понимать как это работает. Но затем, как по мне, удобнее использовать графический интерфейс. TortoiseGit для Windows мне показался наиболее удобным из всех. Но некоторые вещи, бывает, проще делать напрямую через командную строку.

Do not ask for support in PM.

Posts: 2

Pages 1

You must login or register to post a reply

Who now at forum

Currently view post: 1 guest, 0 registered users

forums.pvpgn.pro → [RU] Research & Development → Вопросы по git