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 не добавлял. Откуда же он тогда взялся?