1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
|
![[GIT_шпаргалка.jpg]]
```sh
## Команды для работы с `.gitignore`
bash
# Проверить, какие файлы игнорируются
git status --ignored
# Проверить, почему файл игнорируется
git check-ignore -v config.h
# Удалить файл из индекса Git (но оставить на диске)
git rm --cached config.h
# Добавить файл в .gitignore
echo "config.h" >> .gitignore
# Применить .gitignore к уже добавленным файлам
git rm -r --cached .
git add .
git commit -m "Apply .gitignore"
#=======================================
sudo apt install git
git config --global --edit
git config --global user.name "Name_Name"
git config --global user.email email@example.com
git config --list
# Создание "своего чистого" репозитория:
git init --bare ~/git/RadSens.git
git clone vlapa@178.20.46.157:~/git/......
# По умолчанию git clone загружает всю историю изменений, что может быть медленно и требовать много места. Если история не нужна, используйте:
git clone <repo_url> --depth=1
git commit -a -m
-m "text_commit"
-a (заменяет git add)
--amend - заменить/исправить последний commit
git init
git add . # добавить все файлы
git commit -m "first commit"
git branch -M main
git remote add origin vlapa@178.20.46.157:~/git/......
git push -u origin main
git remote set-url origin new.git.url/here
git@89.110.92.137:/home/git/my/esp8266/8266-clock_ws2812.git
======================
======= FLENOV =======
======================
git checkout -b имяветки база
# git checkout говорит, что мы должны переключиться на репозиторий. Ключик -b говорит, что нужно не просто переключиться, а создать новую ветку с именем =имяветки=.
# После имени бренча через пробел идет база - по документации необязательный параметр - от какой ветки вы хотите создать свою. Я рекомендую всегда указывать этот параметр. Если вы не укажите базу, то в качестве нее будет выступать текущая ветка. Чаще всего ветки нужно создавать от основной master, а не от текущей. Если только вы явно не хотите создать свою ветку от какой-то другой, команда создания будет
git checkout -b имяветки origin/master
# Стоп, еще немного о именовании. В данном случае я указываю origin/master и это удаленный ствол. На это указывает слово origin. Если мы создаем новую ветку fixdone/345321, то это локальная копия на нашем диске. Удаленная копия на сервере git в репозитории будет иметь имя origin/fixdone/345321. Когда мы создаем новые ветки, то желательно создавать от удаленной версии master, но у нас ее пока нет, поэтому если попытаться выполнить такую команду, то она завершиться ошибкой.
# Да, я рекомендую всегда использовать в качестве базы удаленную версию origin/master, которая указывает на версию на сервере, но если ее нет, то придется использовать локальную – просто master. Мы пока создали только локальный репозиторий. Пока нет удаленного, придется использовать локальный. Как только появиться удаленный, всегда используйте его. О удаленных ветках мы поговорим в следующий раз.
# Итак, пока нет удаленного мастера, давайте создадим новую ветку от локального:
git checkout -b initialwork master
# Я назвал ветку initialwork. В результате выполнения команды вы должны увидеть что-то типа:
Switched to a new branch 'initialwork'
# Теперь мы находимся в ветке, где мы можем исправлять баг или работать над новым функционалом. Давайте создадим файл index.html. Вы можете воспользоваться для этого любым текстовым редактором.
git add i* # все файлы начинающиеся с =i=
git add -u # все измененные файлы
git checkout master
git merge initialwork
git branch # отображает все ветки созданные локально
-M # переименовать ветку
-a # все ветки: локальные и удаленные
echo "# demo" >> README.md
git init
git add README.md
git commit -m "first commit"
# git branch -M main
git remote add origin vlapa@178.20.46.157:~/git/name.git
git push -u origin master # main
# Работа на другом компьютере:
git clone vlapa@178.20.46.157:~/git/name.git
# или:
git init
git remote add origin vlapa@178.20.46.157:~/git/name.git
# получить последние изменения:
git fetch
git checkout secondone
# изменеяем файл, далее:
git diff # file_name
git add -u
git commit -m "commit"
git push origin secondone
# теперь на сервере есть 2 ветки
# на еще одном компьютере:
git checkout -b origin/secondone
git merge origin/secondone
==============
git show
git commit --amend # дополнение и изменение коммита
git commit --amend -m "новое название" # переименовать
git checkout file_name # откатить последние изменения
git reset --hard # сбросить все последние изменения
git status
# untracked - неотслеживаемый
# modified - в рабочей директории есть более новая версия по сравнению с хранящейся в HEAD или в области подготовленных файлов (изменения не находятся в следующем коммите).
# staget - в рабочей директории и области подготовленных файлов есть более новая версия по сравнению с хранящейся в HEAD (готов к коммиту).
# Без изменений — одна версия файла во всех разделах, т. е. в последнем коммите содержится актуальная версия.
# Файл может быть одновременно в состоянии «изменён» и «подготовлен», если версия в рабочей директории новее, чем в области подготовленных файлов, которая в свою очередь новее версии в HEAD.
# Мы можем использовать опцию -s для команды git status, чтобы получить более компактный вывод (по строке на файл).
# Если файл не отслеживается, то будет выведено ??; если он был изменён, то его имя будет красным, а если подготовлен — зелёным.
# Чтобы посмотреть сами изменения, а не изменённые файлы, можно использовать следующие команды:
git diff
# — посмотреть что добавилось или сравнение рабочей директории с областью подготовленных файлов;
git diff --staged
# — сравнение области подготовленных файлов с HEAD.
# Если использовать аргумент <файл/папка>, то diff покажет изменения только для указанных файлов/папок, например git diff src/.
.gitignore
# Чтобы отметить файлы, которые мы хотим игнорировать, можно использовать шаблоны поиска (считайте их упрощёнными регулярными выражениями):
# /... — позволяет избежать рекурсивности — соответствует файлам только в текущей директории;
# .../ — соответствует всем файлам в указанной директории;
# *... — соответствует всем файлам с указанным окончанием;
# ! — игнорирование файлов, попадающих под указанный шаблон;
# [...] — соответствует любому символу из указанных в квадратных скобках;
# ? — соответствует любому символу;
# /**/ — соответствует вложенным директориям, например a/**/d соответствует a/d, a/b/d, a/b/c/d и т. д.
# Мы даже можем использовать шаблоны поиска при указании файла/папки в других командах. Например:
git add src/*.css
# добавит все файлы .css в папке src.
git log # - можно передать разные опции:
--oneline # короткий лог
-p # показывает изменения в каждом коммите;
--stat # показывает сокращённую статистику для коммитов, например изменённые файлы и количество добавленных/удалённых строк в каждом их них;
-n # показывает n последних коммитов;
--since=___ и --until=___ # позволяет отфильтровать коммиты по промежутку времени, например --since="2019-01-01" покажет коммиты с 1 января 2019 года;
--pretty # позволяет указать формат логов (например, --pretty=oneline), также можно использовать --pretty=format для большей кастомизации, например --pretty=format:"%h %s";
--grep и -S # фильтруют коммиты с сообщениями/изменениями кода, которые содержат указанную строку, например, git log -S имя_функции позволяет посмотреть добавление/удаление функции;
--no-merges # пропускает коммиты со слиянием веток;
ветка1..ветка2 # позволяет посмотреть, какие коммиты из ветки 2 не находятся в ветке 1 (полезно при слиянии веток). Например, `git log master..test` покажет, каких коммитов из ветки test нет в master (о ветках поговорим чуть позже).
--left-right # ветка1...ветка2 показывает коммиты, которые есть либо в ветке 1, либо в ветке 2, но не в обеих; знак < обозначает коммиты из ветка1, а > — из ветка2. Обратите внимание: используется три точки, а не две;
-L # принимает аргумент начало,конец:файл или :функция:файл и показывает историю изменений переданного набора строк или функции в файле.
```
# Свой GIT
```sh
# Server:
sudo apt install git
sudo useradd git
sudo passwd git
ssh-keygen # - ???
mkdir repo1.git
git init --bare
git init --bare ~/git/repo1.git
#------------------------
# Client:
sudo apt install git
ssh-copy-id git@server_adresses
git config --global --edit
git config --global user.name "Name_Name"
git config --global _user.email email@example.com
git config --global core.editor "vim" # устанавливаем редактор по умолчанию
git config --list
mkdir /home/user/repo1
cd /home/user/repo
git init
git add .
git commit -m "commit1"
git remote add origin git@addresses_server:/home/git/repo1.git
git push -u origin master
#-------------------------
# Создаем свою ветку:
git branch # смотрим ветку
git branch -a # - смотрим все ветки
git branch new_branch # - создаем ветку new_branch
git checkout -b new_branch # - так тоже можно создать
git checkout new_branch # - переключаемся на нее
git diff # - посмотреть изменения
git status
vim .gitignore # добавляем в игнор все лишнее
# .idea/
# .vscode/
# .pio
git add .
git commit -m "modified .gitignore"
git reset HEAD <file> # - убрать файл из индекса
git push --set-upstream origin new_branch
# установить ветку new_branch как origin
# указывается только при первом PUSH
git checkout <hash> # - переход на другой commit
# Сливаемся:
git checkout master # переключаемся на ветку master
git checkout -b new-branch # создаём новую ветку
git merge new_branch # сливаемся: master/new_branch
git branch -d new_branch
git branch -r
git branch -d -r origin/new_branch
git push --set-upstream origin new-branch
# Удалить файл удаленно и локально:
git branch -D new-branch # удаляем лишнюю ветку локально
git rm 'file name'
git rm -r 'folder name'
git commit -m 'message'
git push -u origin branch
# Удалить файл только удаленно:
git push --delete origin new-branch # удаляем ветку в репозитории
git rm --cached 'file name'
git rm -r 'folder name'
git commit -m'message'
git push -u origin branch
#=====================================
git fetch # - загружает коммиты, файлы и ссылки из удаленного репозитория в ваш локальный репозиторий.
# Извлеките данные с помощью команды fetch, если хотите увидеть, над чем работают остальные. Эта команда похожа на команду `svn update` и позволяет увидеть прогресс в центральном репозитории, но при этом не вынуждает вас выполнять слияние изменений с вашим репозиторием.
git pull # - слить локальную и удаленную версию на локальной машине (на самом деле представляет собой комбинацию двух других команд: git fetch и git merge)
git log --oneline # короткий LOG
git reset --...
# -- soft HEAD~ - на 1 commit назад без удаления последних изменений
# -- mixed HEAD~ - на 1 commit назад без удаления последних изменений и не внесенными предпоследними изменениями
# -- hard HEAD~ - на 1 commit назад с удалением ВСЕХ последних изменений
git rm file.name # - удаление и сразу git add . (если просто самому удалить файл из папки - то нужно самому git add .)
git mv file.name new_file.name # - переименование и сразу git add . (если просто самому переименовать файл из папки - то нужно самому git add .)
git restore file.name # - откат всех последних изменений до commit
--staged # убирает файл из зоны индекса
```
|