Skip to content

Commit b79f688

Browse files
committed
Обновлён раздел 'Исправление истории' соответственно оригиналу
1 parent 9810e4d commit b79f688

File tree

1 file changed

+98
-53
lines changed

1 file changed

+98
-53
lines changed

book/07-git-tools/sections/rewriting-history.asc

Lines changed: 98 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,15 @@
66
Область подготовленных изменений позволяет вам решить, какие файлы попадут в коммит непосредственно перед её выполнением; благодаря команде `stash` вы можете решить, что не хотите продолжать работу над какими-то изменениями; также вы можете изменить уже совершённые коммиты так, чтобы они выглядели совершенно другим образом.
77
В частности, можно изменить порядок коммитов, сообщения или изменённые в коммитах файлы, объединить вместе или разбить на части, полностью удалить коммит -- но только до того, как вы поделитесь своими наработками с другими.
88

9-
В данном разделе вы узнаете, как выполнять эти очень полезные задачи.
10-
Таким образом, перед тем, как поделиться вашими наработками с другими, вы сможете привести вашу историю коммитов к нужному виду.
9+
В данном разделе вы узнаете, как выполнять эти очень полезные задачи, чтобы привести вашу историю коммитов к желаемому виду до того, как поделиться ей с остальными.
10+
11+
[NOTE]
12+
.Не отправляйте свои наработки, пока вы ими не довольны
13+
====
14+
Одно из основноых правил Git заключается в том, что, так как большую часть работы вы делаете в своём локальном репозитории, то вы вольны переписывать свою историю _локально_.
15+
Однако, как только вы отправите свои наработки, то это уже совсем другая история и вам следует рассматривать отправленные изменения как финальные до тех пор, пока у вас не появится весомая причина что-то изменить.
16+
Если кратко, то вы должны воздержаться от отправки своих изменений, пока не будете полностью довольны и готовы поделиться ими со всем миром.
17+
====
1118

1219
[[r_git_amend]]
1320
==== Изменение последнего коммита
@@ -29,7 +36,21 @@ $ git commit --amend
2936
Вы добавляете в индекс необходимые изменения, редактируя файл и выполняя для него `git add` или `git rm` для отслеживаемого файла, а последующая команда `git commit --amend` берет вашу текущую область подготовленных изменений и делает её снимок для нового коммита.
3037

3138
Вы должны быть осторожными, используя этот приём, так как при этом изменяется 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+
====
3354

3455
[[r_changing_multiple]]
3556
==== Изменение сообщений нескольких коммитов
@@ -55,19 +76,27 @@ $ git rebase -i HEAD~3
5576

5677
[source,console]
5778
----
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
6182
6283
# Rebase 710f0f8..a5f4a0d onto 710f0f8
6384
#
6485
# 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
95+
# t, reset <label> = reset HEAD to a label
96+
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
97+
# . 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.
71100
#
72101
# These lines can be re-ordered; they are executed from top to bottom.
73102
#
@@ -84,9 +113,9 @@ pick a5f4a0d added cat-file
84113
[source,console]
85114
----
86115
$ 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
90119
----
91120

92121
Обратите внимание на обратный порядок.
@@ -100,36 +129,36 @@ f7f3f6d changed my name a bit
100129

101130
[source,console]
102131
----
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
106135
----
107136

108137
Когда вы сохраните сообщение и выйдете из редактора, Git переместит вас к самому раннему коммиту из списка и вернёт вас в командную строку со следующим сообщением:
109138

110139
[source,console]
111140
----
112141
$ git rebase -i HEAD~3
113-
Stopped at f7f3f6d... changed my name a bit
142+
Stopped at f7f3f6d... Change my name a bit
114143
You can amend the commit now, with
115144
116145
git commit --amend
117146
118-
Once youre satisfied with your changes, run
147+
Once you're satisfied with your changes, run
119148
120149
git rebase --continue
121150
----
122151

123152
Эти инструкции говорят вам в точности то, что нужно сделать.
124-
Введите
153+
Выполните:
125154

126155
[source,console]
127156
----
128157
$ git commit --amend
129158
----
130159

131160
Измените сообщение коммита и выйдите из редактора.
132-
Затем выполните
161+
Затем выполните:
133162

134163
[source,console]
135164
----
@@ -140,29 +169,28 @@ $ git rebase --continue
140169
Если вы измените `pick' на `edit' в других строках, то можете повторить эти шаги для соответствующих коммитов.
141170
Каждый раз Git будет останавливаться, позволяя вам исправить коммит, и продолжит, когда вы закончите.
142171

143-
==== Переупорядочивание коммитов
172+
==== Упорядочивание коммитов
144173

145-
Вы также можете использовать интерактивное перебазирование для переупорядочивания или полного удаления коммитов.
146-
Если вы хотите удалить коммит ``added cat-file'' и изменить порядок, в котором были внесены два оставшихся, то вы можете изменить скрипт перебазирования с такого:
174+
Вы также можете использовать интерактивное перебазирование для изменения пордка или полного удаления коммитов.
175+
Если вы хотите удалить коммит ``Add cat-file'' и изменить порядок, в котором были внесены два оставшихся, то вы можете изменить скрипт перебазирования с такого:
147176

148177
[source,console]
149178
----
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
153182
----
154183

155184
на такой:
156185

157-
158186
[source,console]
159187
----
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
162190
----
163191

164192
Когда вы сохраните скрипт и выйдете из редактора, Git переместит вашу ветку на родителя этих коммитов, применит `310154e`, затем `f7f3f6d` и после этого остановится.
165-
Вы, фактически, изменили порядок этих коммитов и полностью удалили коммит ``added cat-file''.
193+
Вы, фактически, изменили порядок этих коммитов и полностью удалили коммит ``Add cat-file''.
166194

167195
[[r_squashing]]
168196
==== Объединение коммитов
@@ -174,12 +202,20 @@ Git добавляет полезные инструкции в сообщени
174202
----
175203
#
176204
# 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
214+
# t, reset <label> = reset HEAD to a label
215+
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
216+
# . 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.
183219
#
184220
# These lines can be re-ordered; they are executed from top to bottom.
185221
#
@@ -195,9 +231,9 @@ Git добавляет полезные инструкции в сообщени
195231

196232
[source,console]
197233
----
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
201237
----
202238

203239
Когда вы сохраните скрипт и выйдете из редактора, Git применит изменения всех трёх коммитов и затем вернёт вас обратно в редактор, чтобы вы могли объединить сообщения коммитов:
@@ -206,15 +242,15 @@ squash a5f4a0d added cat-file
206242
----
207243
# This is a combination of 3 commits.
208244
# The first commit's message is:
209-
changed my name a bit
245+
Change my name a bit
210246
211247
# This is the 2nd commit message:
212248
213-
updated README formatting and added blame
249+
Update README formatting and add blame
214250
215251
# This is the 3rd commit message:
216252
217-
added cat-file
253+
Add cat-file
218254
----
219255

220256
После сохранения сообщения, вы получите один коммит, содержащий изменения всех трёх коммитов, существовавших ранее.
@@ -228,9 +264,9 @@ added cat-file
228264

229265
[source,console]
230266
----
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
234270
----
235271

236272
Затем, когда скрипт вернёт вас в командную строку, вам нужно будет отменить индексацию изменений этого коммита, и создать несколько коммитов на основе этих изменений.
@@ -242,9 +278,9 @@ pick a5f4a0d added cat-file
242278
----
243279
$ git reset HEAD^
244280
$ git add README
245-
$ git commit -m 'updated README formatting'
281+
$ git commit -m 'Update README formatting'
246282
$ git add lib/simplegit.rb
247-
$ git commit -m 'added blame'
283+
$ git commit -m 'Add blame'
248284
$ git rebase --continue
249285
----
250286

@@ -253,13 +289,15 @@ Git применит последний коммит (`a5f4a0d`) из скрип
253289
[source,console]
254290
----
255291
$ 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
260296
----
261297

262298
И снова, при этом изменились SHA-1 хеши всех коммитов в вашем списке, поэтому убедитесь, что ни один коммит из этого списка ранее не был отправлен в общий репозиторий.
299+
Обратите внимание, что последний коммит в списке (`f7f3f6d`) не изменился.
300+
Несмотря на то, что коммит был в списке перебазирования, он был отмечен как ``pick'' и применён до применения перебизирования, поэтому Git оставил его нетронутым.
263301

264302
==== Удаление коммита
265303

@@ -295,6 +333,13 @@ Drew DeVault создал практическое руководство с у
295333
Однако, эта команда может быть очень полезной.
296334
Далее вы ознакомитесь с несколькими обычными вариантами использованиями этой команды, таким образом, вы сможете получить представление о том, на что она способна.
297335

336+
[CAUTION]
337+
====
338+
Команда `git filter-branch` таит в себе много подводных камней и более не является рекомендуемым способом изменения истории.
339+
Вместо этого, рассмотрите возможность использования Python скрипта `git-filter-repo`, который лучше подходит для большинства ситуаций, в которых вы обычно используете `filter-branch`.
340+
С документаций и исходным кодом скрипта можно ознакомиться здесь: https://github.com/newren/git-filter-repo[].
341+
====
342+
298343
[[r_removing_file_every_commit]]
299344
===== Удаление файла из каждого коммита
300345

0 commit comments

Comments
 (0)