Итак, первое, что необходимо сделать, чтобы работать с гит через консоль из под Windows, это скачать и установить git bash. Все настройки советую оставлять по умолчанию.
Итак, вы установили git bash и у имеете [удаленный репозиторий на github и] учетную запись, созданную через веб-интерфейс сайта github.com. Запускаем git bush и переходим в папку, в которой будет храниться/уже хранится наш локальный репозиторий. В дальнейшем, чтобы минимизировать выполняемые действия, советую создать небольшой скрипт вида:
cd путь_к_проекту; "%programfiles%\Git\git-bash.exe"
В моем случае это
D: & cd D:\_github\django_test & "C:\Program Files\Git\git-bash.exe"
Который автоматически будет запускать git-bash в корне проекта.
Теперь нужно сказать, что github предоставляет два варианта взаимодействия с сервером: https и ssh. Ниже мы рассмотрим их более детально в трех вариантах развития событий. И первый вариант развития:
1. Новый репозиторий
Вы только что создали репозиторий на гитхаб и собираетесь выложить туда готовый проект
Для начала необходимо подготовить локальный репозиторий. Для этого вводим команды:
git init git config --global user.name 'Sanshain' git config --global user.email 'my-email@ya.ru' git add . git commit -m "first commit"
Первой командой (git init
) мы инициализировали новый репозиторий. Команда git add .
проиндексировала все файлы внутри текущей директории, а командой git commit -m "first commit"
мы сделали первый commit (фиксацию изменений). Все, ура. Но пока промежуточное. Теперь нужно правильно выложить это все на гитхаб:
Для этого необходимо выполнить команду
git remote add origin <адрес нашего репозитория на гитхаб>
- https (например,
https://github.com/Sanshain/django_test.git
либоhttps://Sanshain@bitbucket.org/Sanshain/obfuscatenet.git
для bitbucket) - ssh (например,
git@github.com:Sanshain/django_test.git
)
git push -u origin master
Нужно всего лишь ввести свои учетные записи (логин/пароль) в падающем окошке от гитхаб. И все файлы будут экспортированы в удаленный репозиторий.
Для второго же случая вам необходимо будет сгенерировать открытый и закрытый ключи у себя на пк. Для это выполните следующие команды:
ssh-keygen -t rsa -b 4096 -C "<имя учетной записи>" eval $(ssh-agent -s) ssh-add "<желаемый путь, куда будет сгенерирован ключ>"
ssh-add -l
. Теперь необходимо скопировать содержимое публичного ключа и создать новый ключ с этим содержимым в настройках личного кабинета гитхаб. После всего вышепроделанного можно выгружать локальный репозиторий git push -u origin master
. Сложно? На вкус и цвет…
2. Удаленный репозиторий
У вас уже есть репозиторий с вашим проектом на гитхаб, и нужно его синхронизировать с новым локальным репозиторием на пк. Переходим в папку, где будет храниться наш /репозиторий/проект (у меня это D: & cd D:\_github\
)
Для примера возьму свой репозиторий https://github.com/Sanshain/django_test.
Для клонирования существующего репозитория по https пишем:
git clone https://github.com/Sanshain/django_test.git
Результат команды должен выглядеть примерно следующим образом:
Cloning into 'django_test'... remote: Enumerating objects: 200, done. remote: Counting objects: 100% (200/200), done. remote: Compressing objects: 100% (170/170), done. remote: Total 200 (delta 19), reused 200 (delta 19), pack-reused 0 Receiving objects: 100% (200/200), 8.09 MiB | 582.00 KiB/s, done. Resolving deltas: 100% (19/19), done.
Теперь внутри нашей папки мы увидим новую папку, содержащую все файлы и папки нашего (или не нашего открытого) удаленного репозитория. Для дальнейшей работы с этой папкой через git bash
переходим в нее командой cd django_test
Теперь нужно учесть, что месторасположение файла в системе может отличаться от исходного, поэтому при запуске, вероятно, вы можете увидеть ошибки. А потому и конфигурацию нужно настраивать самостоятельно. Для того, чтобы это не делать каждый раз, в удаленном репозитории необходимо правильно настроить .gitignore
, специальный файл исключений, который поможет отключить из скв файл конфигурации. В моем случае это файл — manage.py
.
Создается .gitignore
с помощью команды touch .gitignore
либо сразу с содержимым — echo 'manage.py' > .gitignore
.
Если у вас python, советую добавить туда pyc-файлы строкой `*.pyc`.
Однако это не все… Если ‘manage.py’ уже проиндексирован, то необходимо его удалить [из индекса], сделать коммит и затем снова добавить (не забудьте скопировать перед выполнением):
git rm путь/к/файлу [-f] git commit -m ".gitignore added"
И добавляем обратно. Пишем еще какие-то изменения.
Если в процессе изменений были добавлены новые файлы, делаем git add .
.
Теперь можно коммитить на удаленный репозиторий наши изменения. Сперва проверяем удаленные репозитории:
git remote -v
Если пусто, то задаем. Есть два варианта подключения к удаленным репозиториям:
git remote add origin https://github.com/Sanshain/django_test.git
— первый запросит у нас логин/пароль от аккаунта
git remote add origin git@github.com:Sanshain/django_test.git
— второй потребует создание публичного ключа шифрования для гитхаб
Если удаленные репозитории уже заданы, делаем git push origin master
(если репозиторий уже отpushен с другого локального репозитория, то сперва необходимо выполнить git pull origin master
)
3. Общий репозиторий
И теперь рассмотрим самый коронный случай: у нас есть общий удаленный репозиторий и два локальных репозитория на разных компах, при чем оба репозитория могут коммитить файлы независимо друг от друга. Пример:
Вася сделал коммит со своего компа на удаленный репозиторий и ушел домой, но Петя остался на работе и продолжил править файлы, и сделал коммит на удаленный позже Васи. Вася на следующий день придет и уже не сможет продолжить работу со своим локальным репозиторием без угрозы потери изменений, которые делал Петя в его отсутствие в глобальный репозиторий, поскольку если он продолжит работу со своим локальным репозиторием и ‘отpush
ит’ его в глобальный, то попросту рискует их затереть. Поэтому ему необходимо сделать так называемый pull.
Команда pull объединяет в себе две команды — fetch (скачивает изменения) и merge (делает слияние). Выглядит она вот так:
git pull <название удаленного репозитория>
В моем случае это выглядит вот так:
git pull https://github.com/Sanshain/django_test.git
Если же Вася перед push уже успел внести какие-либо правки до выполнения команды pull
, то при ее выполнении он может столкнуться с конфликтами. Конфликты бывают разной степени «тяжести».
Я сейчас рассмотрю самый простой вид разрешения — это выбор заменяющего файла целиком, а не его фрагмента (поскольку последнее, на мой взгляд заслуживает отдельной статьи). Для того, чтобы оставить в локальной ветке локальную версию файла, необходимо выполнить команду
git checkout --ours <название файла>
Например:
git checkout --ours db.sqlite3
Если же нужно, чтобы файл целиком подменился его глобальной версией, вместо outer
необходимо использовать параметр theirs
.
Далее выполнить `git add -u` и git commit -m 'merge'
.
На этом пожалуй, все. Продолжение следует…
от