You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: book/07-git-tools/sections/rewriting-history.asc
+98-53Lines changed: 98 additions & 53 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,8 +6,15 @@
6
6
Область подготовленных изменений позволяет вам решить, какие файлы попадут в коммит непосредственно перед её выполнением; благодаря команде `stash` вы можете решить, что не хотите продолжать работу над какими-то изменениями; также вы можете изменить уже совершённые коммиты так, чтобы они выглядели совершенно другим образом.
7
7
В частности, можно изменить порядок коммитов, сообщения или изменённые в коммитах файлы, объединить вместе или разбить на части, полностью удалить коммит -- но только до того, как вы поделитесь своими наработками с другими.
8
8
9
-
В данном разделе вы узнаете, как выполнять эти очень полезные задачи.
10
-
Таким образом, перед тем, как поделиться вашими наработками с другими, вы сможете привести вашу историю коммитов к нужному виду.
9
+
В данном разделе вы узнаете, как выполнять эти очень полезные задачи, чтобы привести вашу историю коммитов к желаемому виду до того, как поделиться ей с остальными.
10
+
11
+
[NOTE]
12
+
.Не отправляйте свои наработки, пока вы ими не довольны
13
+
====
14
+
Одно из основноых правил Git заключается в том, что, так как большую часть работы вы делаете в своём локальном репозитории, то вы вольны переписывать свою историю _локально_.
15
+
Однако, как только вы отправите свои наработки, то это уже совсем другая история и вам следует рассматривать отправленные изменения как финальные до тех пор, пока у вас не появится весомая причина что-то изменить.
16
+
Если кратко, то вы должны воздержаться от отправки своих изменений, пока не будете полностью довольны и готовы поделиться ими со всем миром.
17
+
====
11
18
12
19
[[r_git_amend]]
13
20
==== Изменение последнего коммита
@@ -29,7 +36,21 @@ $ git commit --amend
29
36
Вы добавляете в индекс необходимые изменения, редактируя файл и выполняя для него `git add` или `git rm` для отслеживаемого файла, а последующая команда `git commit --amend` берет вашу текущую область подготовленных изменений и делает её снимок для нового коммита.
30
37
31
38
Вы должны быть осторожными, используя этот приём, так как при этом изменяется SHA-1 коммита.
32
-
Поэтому как и с операцией `rebase` -- не изменяйте ваш последний коммит, если вы уже отправили её в общий репозиторий.
39
+
Поэтому, как и с операцией `rebase` -- не изменяйте ваш последний коммит, если вы уже отправили его в общий репозиторий.
40
+
41
+
[TIP]
42
+
.Изменённый коммит может потребовать изменения сообщения коммита
43
+
====
44
+
При изменении коммита существует возможность изменить как его содержимое, так и сообщение коммита.
45
+
Если в коммит внесены существенные изменения, то почти наверняка следует обновить и его сообщение, чтобы оно более точно отражало содержимое коммита.
46
+
47
+
С другой стороны, если изменения незначительны (исправление опечаток, добаление в коммит забытого файла), то текущее сообщение вполне можно оставить; чтобы лишний раз не вызывать редактор, просто добавьте измененные файлы в индекс и выполните команду:
48
+
49
+
[source,console]
50
+
----
51
+
$ git commit --amend --no-edit
52
+
----
53
+
====
33
54
34
55
[[r_changing_multiple]]
35
56
==== Изменение сообщений нескольких коммитов
@@ -55,19 +76,27 @@ $ git rebase -i HEAD~3
55
76
56
77
[source,console]
57
78
----
58
-
pick f7f3f6d changed my name a bit
59
-
pick 310154e updated README formatting and added blame
60
-
pick a5f4a0d added cat-file
79
+
pick f7f3f6d Change my name a bit
80
+
pick 310154e Update README formatting and add blame
81
+
pick a5f4a0d Add cat-file
61
82
62
83
# Rebase 710f0f8..a5f4a0d onto 710f0f8
63
84
#
64
85
# Commands:
65
-
# p, pick = use commit
66
-
# r, reword = use commit, but edit the commit message
67
-
# e, edit = use commit, but stop for amending
68
-
# s, squash = use commit, but meld into previous commit
69
-
# f, fixup = like "squash", but discard this commit's log message
70
-
# x, exec = run command (the rest of the line) using shell
86
+
# p, pick <commit> = use commit
87
+
# r, reword <commit> = use commit, but edit the commit message
88
+
# e, edit <commit> = use commit, but stop for amending
89
+
# s, squash <commit> = use commit, but meld into previous commit
90
+
# f, fixup <commit> = like "squash", but discard this commit's log message
91
+
# x, exec <command> = run command (the rest of the line) using shell
92
+
# b, break = stop here (continue rebase later with 'git rebase --continue')
93
+
# d, drop <commit> = remove commit
94
+
# l, label <label> = label current HEAD with a name
# . create a merge commit using the original merge commit's
98
+
# . message (or the oneline, if no original merge commit was
99
+
# . specified). Use -c <commit> to reword the commit message.
71
100
#
72
101
# These lines can be re-ordered; they are executed from top to bottom.
73
102
#
@@ -84,9 +113,9 @@ pick a5f4a0d added cat-file
84
113
[source,console]
85
114
----
86
115
$ git log --pretty=format:"%h %s" HEAD~3..HEAD
87
-
a5f4a0d added cat-file
88
-
310154e updated README formatting and added blame
89
-
f7f3f6d changed my name a bit
116
+
a5f4a0d Add cat-file
117
+
310154e Update README formatting and add blame
118
+
f7f3f6d Change my name a bit
90
119
----
91
120
92
121
Обратите внимание на обратный порядок.
@@ -100,36 +129,36 @@ f7f3f6d changed my name a bit
100
129
101
130
[source,console]
102
131
----
103
-
edit f7f3f6d changed my name a bit
104
-
pick 310154e updated README formatting and added blame
105
-
pick a5f4a0d added cat-file
132
+
edit f7f3f6d Change my name a bit
133
+
pick 310154e Update README formatting and add blame
134
+
pick a5f4a0d Add cat-file
106
135
----
107
136
108
137
Когда вы сохраните сообщение и выйдете из редактора, Git переместит вас к самому раннему коммиту из списка и вернёт вас в командную строку со следующим сообщением:
109
138
110
139
[source,console]
111
140
----
112
141
$ git rebase -i HEAD~3
113
-
Stopped at f7f3f6d... changed my name a bit
142
+
Stopped at f7f3f6d... Change my name a bit
114
143
You can amend the commit now, with
115
144
116
145
git commit --amend
117
146
118
-
Once you’re satisfied with your changes, run
147
+
Once you're satisfied with your changes, run
119
148
120
149
git rebase --continue
121
150
----
122
151
123
152
Эти инструкции говорят вам в точности то, что нужно сделать.
124
-
Введите
153
+
Выполните:
125
154
126
155
[source,console]
127
156
----
128
157
$ git commit --amend
129
158
----
130
159
131
160
Измените сообщение коммита и выйдите из редактора.
132
-
Затем выполните
161
+
Затем выполните:
133
162
134
163
[source,console]
135
164
----
@@ -140,29 +169,28 @@ $ git rebase --continue
140
169
Если вы измените `pick' на `edit' в других строках, то можете повторить эти шаги для соответствующих коммитов.
141
170
Каждый раз Git будет останавливаться, позволяя вам исправить коммит, и продолжит, когда вы закончите.
142
171
143
-
==== Переупорядочивание коммитов
172
+
==== Упорядочивание коммитов
144
173
145
-
Вы также можете использовать интерактивное перебазирование для переупорядочивания или полного удаления коммитов.
146
-
Если вы хотите удалить коммит ``added cat-file'' и изменить порядок, в котором были внесены два оставшихся, то вы можете изменить скрипт перебазирования с такого:
174
+
Вы также можете использовать интерактивное перебазирование для изменения пордка или полного удаления коммитов.
175
+
Если вы хотите удалить коммит ``Add cat-file'' и изменить порядок, в котором были внесены два оставшихся, то вы можете изменить скрипт перебазирования с такого:
147
176
148
177
[source,console]
149
178
----
150
-
pick f7f3f6d changed my name a bit
151
-
pick 310154e updated README formatting and added blame
152
-
pick a5f4a0d added cat-file
179
+
pick f7f3f6d Change my name a bit
180
+
pick 310154e Update README formatting and add blame
181
+
pick a5f4a0d Add cat-file
153
182
----
154
183
155
184
на такой:
156
185
157
-
158
186
[source,console]
159
187
----
160
-
pick 310154e updated README formatting and added blame
161
-
pick f7f3f6d changed my name a bit
188
+
pick 310154e Update README formatting and add blame
189
+
pick f7f3f6d Change my name a bit
162
190
----
163
191
164
192
Когда вы сохраните скрипт и выйдете из редактора, Git переместит вашу ветку на родителя этих коммитов, применит `310154e`, затем `f7f3f6d` и после этого остановится.
165
-
Вы, фактически, изменили порядок этих коммитов и полностью удалили коммит ``added cat-file''.
193
+
Вы, фактически, изменили порядок этих коммитов и полностью удалили коммит ``Add cat-file''.
166
194
167
195
[[r_squashing]]
168
196
==== Объединение коммитов
@@ -174,12 +202,20 @@ Git добавляет полезные инструкции в сообщени
174
202
----
175
203
#
176
204
# Commands:
177
-
# p, pick = use commit
178
-
# r, reword = use commit, but edit the commit message
179
-
# e, edit = use commit, but stop for amending
180
-
# s, squash = use commit, but meld into previous commit
181
-
# f, fixup = like "squash", but discard this commit's log message
182
-
# x, exec = run command (the rest of the line) using shell
205
+
# p, pick <commit> = use commit
206
+
# r, reword <commit> = use commit, but edit the commit message
207
+
# e, edit <commit> = use commit, but stop for amending
208
+
# s, squash <commit> = use commit, but meld into previous commit
209
+
# f, fixup <commit> = like "squash", but discard this commit's log message
210
+
# x, exec <command> = run command (the rest of the line) using shell
211
+
# b, break = stop here (continue rebase later with 'git rebase --continue')
212
+
# d, drop <commit> = remove commit
213
+
# l, label <label> = label current HEAD with a name
# . create a merge commit using the original merge commit's
217
+
# . message (or the oneline, if no original merge commit was
218
+
# . specified). Use -c <commit> to reword the commit message.
183
219
#
184
220
# These lines can be re-ordered; they are executed from top to bottom.
185
221
#
@@ -195,9 +231,9 @@ Git добавляет полезные инструкции в сообщени
195
231
196
232
[source,console]
197
233
----
198
-
pick f7f3f6d changed my name a bit
199
-
squash 310154e updated README formatting and added blame
200
-
squash a5f4a0d added cat-file
234
+
pick f7f3f6d Change my name a bit
235
+
squash 310154e Update README formatting and add blame
236
+
squash a5f4a0d Add cat-file
201
237
----
202
238
203
239
Когда вы сохраните скрипт и выйдете из редактора, Git применит изменения всех трёх коммитов и затем вернёт вас обратно в редактор, чтобы вы могли объединить сообщения коммитов:
После сохранения сообщения, вы получите один коммит, содержащий изменения всех трёх коммитов, существовавших ранее.
@@ -228,9 +264,9 @@ added cat-file
228
264
229
265
[source,console]
230
266
----
231
-
pick f7f3f6d changed my name a bit
232
-
edit 310154e updated README formatting and added blame
233
-
pick a5f4a0d added cat-file
267
+
pick f7f3f6d Change my name a bit
268
+
edit 310154e Update README formatting and add blame
269
+
pick a5f4a0d Add cat-file
234
270
----
235
271
236
272
Затем, когда скрипт вернёт вас в командную строку, вам нужно будет отменить индексацию изменений этого коммита, и создать несколько коммитов на основе этих изменений.
@@ -242,9 +278,9 @@ pick a5f4a0d added cat-file
242
278
----
243
279
$ git reset HEAD^
244
280
$ git add README
245
-
$ git commit -m 'updated README formatting'
281
+
$ git commit -m 'Update README formatting'
246
282
$ git add lib/simplegit.rb
247
-
$ git commit -m 'added blame'
283
+
$ git commit -m 'Add blame'
248
284
$ git rebase --continue
249
285
----
250
286
@@ -253,13 +289,15 @@ Git применит последний коммит (`a5f4a0d`) из скрип
253
289
[source,console]
254
290
----
255
291
$ git log -4 --pretty=format:"%h %s"
256
-
1c002dd added cat-file
257
-
9b29157 added blame
258
-
35cfb2b updated README formatting
259
-
f3cc40e changed my name a bit
292
+
1c002dd Add cat-file
293
+
9b29157 Add blame
294
+
35cfb2b Update README formatting
295
+
f7f3f6d Change my name a bit
260
296
----
261
297
262
298
И снова, при этом изменились SHA-1 хеши всех коммитов в вашем списке, поэтому убедитесь, что ни один коммит из этого списка ранее не был отправлен в общий репозиторий.
299
+
Обратите внимание, что последний коммит в списке (`f7f3f6d`) не изменился.
300
+
Несмотря на то, что коммит был в списке перебазирования, он был отмечен как ``pick'' и применён до применения перебизирования, поэтому Git оставил его нетронутым.
263
301
264
302
==== Удаление коммита
265
303
@@ -295,6 +333,13 @@ Drew DeVault создал практическое руководство с у
295
333
Однако, эта команда может быть очень полезной.
296
334
Далее вы ознакомитесь с несколькими обычными вариантами использованиями этой команды, таким образом, вы сможете получить представление о том, на что она способна.
297
335
336
+
[CAUTION]
337
+
====
338
+
Команда `git filter-branch` таит в себе много подводных камней и более не является рекомендуемым способом изменения истории.
339
+
Вместо этого, рассмотрите возможность использования Python скрипта `git-filter-repo`, который лучше подходит для большинства ситуаций, в которых вы обычно используете `filter-branch`.
340
+
С документаций и исходным кодом скрипта можно ознакомиться здесь: https://github.com/newren/git-filter-repo[].
0 commit comments