Skip to content

Commit 9f94543

Browse files
committed
Revise Round 1
Revise section "replace" based on the public review records, with a few additional changes.
1 parent 08d1a8d commit 9f94543

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

book/07-git-tools/sections/replace.asc

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@
33

44
Git 对象是不可改变的,但它提供一种有趣的方式来用其他对象假装替换数据库中的 Git 对象。
55

6+
`replace` 命令可以让你在 Git 中指定一个对象并可以声称“每次你遇到这个 Git 对象时,假装它是其他的东西”。在你用一个不同的提交替换历史中的一个提交时,这会非常有用。
67

7-
`replace` 命令可以让你在 Git 中指定一个对象并可以声称“每次你遇到这个 Git 对象时,假装它是其他的东西”。在你的历史中替换一个提交为另一个时,这会非常有用
8+
例如,你有一个大型的代码历史并想把自己的仓库分成一个短的历史和一个更大更长久的历史,短历史供新的开发者使用,后者给喜欢数据挖掘的人使用。 你可以通过用新仓库中最早的提交 `replace` 老仓库中最新的提交来连接历史,这种方式可以把一条历史移植到其他历史上。这意味着你不用在新历史中真正替换每一个提交(因为历史来源会影响 SHA 的值),你可以加入他们
89

10+
让我们来试试吧!首先获取一个已经存在的仓库,并将其分成两个仓库,一个是最近的仓库,一个是历史版本的仓库。然后我们将看到如何在不更改仓库 SHA 值的情况下通过 `replace` 命令来合并他们。
911

10-
例如,你有一个大型的代码历史并想把自己的仓库分成一个短的历史和一个更大更长久的历史,短历史供新的开发者使用,后者给喜欢数据挖掘的人使用。
11-
你可以使用最新提交来将新一条历史中的早期提交“替换”掉的方式,这种方式可以把一条历史移植到其他历史上。这意味着你不用在新历史中真正替换每一个提交,(历史来源会影响 SHA 的值)你可以加入他们。
12-
13-
让我们来试试吧!首先获取一个已经存在的仓库,并将其分成两个仓库,一个是最近的仓库,一个是历史版本的仓库。然我们将见证在不更改仓库 SHA 值的情况下通过`replace`命令来合并他们。
14-
15-
我们将使用一个拥有5个提交的简单仓库:
12+
我们将使用一个拥有 5 个提交的简单仓库:
1613

1714
[source,console]
1815
----
@@ -24,7 +21,7 @@ c6e1e95 fourth commit
2421
c1822cf first commit
2522
----
2623

27-
我们想将其分成拆分成两条历史。第一条作为历史版本的仓库-包括第一个到第四个提交,第二条作为最近的仓库-包括第四、五个提交
24+
我们想将其分成拆分成两条历史。第一个到第四个提交的作为第一个历史版本,第四、第五个提交的作为最近的第二个历史版本
2825

2926
image::images/replace1.png[]
3027

@@ -43,7 +40,7 @@ c1822cf first commit
4340

4441
image::images/replace2.png[]
4542

46-
现在我们可以把这个新的`history`分支推送到我们新仓库的`master`分支:
43+
现在我们可以把这个新的 `history` 分支推送到我们新仓库的 `master` 分支:
4744

4845
[source,console]
4946
----
@@ -59,7 +56,7 @@ To [email protected]:schacon/project-history.git
5956
* [new branch] history -> master
6057
----
6158

62-
这样一来,我们的历史就发布了。稍难的部分则是截断我们最近的历史来让它变的更小。我们需要一个重叠以便于用一个相等的提交来替换另一个提交,这样一来,我们将截断到第四、五个提交。
59+
这样一来,我们的历史版本就发布了。稍难的部分则是删减我们最近的历史来让它变得更小。我们需要一个重叠以便于用一个相等的提交来替换另一个提交,这样一来,我们将截断到第四、五个提交。
6360

6461
[source,console]
6562
----
@@ -71,10 +68,10 @@ c6e1e95 (history) fourth commit
7168
c1822cf first commit
7269
----
7370

74-
在这个案例中,创建一个基础提交很有用,这个提交拥有如何扩展历史的指令。这样一来,如果其他的开发者在截断的历史中命中第一个提交或需要更多提交时就知晓做什么了。
75-
因此,接下来我们要做的是用命令创建一个最初的提交对象,然后在其上面变基剩下的提交(第四、五个提交)。
71+
在这种情况下,创建一个能够指导扩展历史的基础提交是很有用的。这样一来,如果其他的开发者想要修改第一次提交或者其他操作时就知道要做些什么。 因此,接下来我们要做的是用命令创建一个最初的提交对象,然后将剩下的提交(第四、第五个提交)变基到它的上面。
72+
73+
为了这么做,我们需要选择一个点去拆分,对于我们而言是第三个提交(SHA 是 `9c68fdc`)。因此我们的提交将基于此提交树。我们可以使用 `commit-tree` 命令来创建基础提交,这样我们就有了一个树,并返回一个全新的、无父节点的 SHA 提交对象。
7674

77-
为了这么做,我们需要选择一个点去拆分,对于我们而言是第三个提交( SHA 是`9c68fdc`),因此我们的提交将基于此提交树。我们可以使用`commit-tree`命令来创建基础提交,这样我们就有了一个树,并返回一个全新的、无父节点的 SHA 提交对象。
7875
[source,console]
7976
----
8077
$ echo 'get history from blah blah blah' | git commit-tree 9c68fdc^{tree}
@@ -83,12 +80,12 @@ $ echo 'get history from blah blah blah' | git commit-tree 9c68fdc^{tree}
8380

8481
[NOTE]
8582
=====
86-
`commit-tree`命令属于底层指令。有许多指令并非直接使用,而是被 **其他的** Git 命令用来做更小一些的工作。有时当我们做一些像这样的奇怪事情时,它们允许我们做一些真的底层的东西但并不适用于日常使用。想了解更多关于底层命令的内容参见 <<_plumbing_porcelain>>
83+
`commit-tree` 命令属于底层指令。有许多指令并非直接使用,而是被 **其他的** Git 命令用来做更小一些的工作。有时当我们做一些像这样的奇怪事情时,它们允许我们做一些不适用于日常使用但真正底层的东西。更多关于底层命令的内容请参见 <<_plumbing_porcelain>>
8784
=====
8885

8986
image::images/replace3.png[]
9087

91-
现在我们已经有一个基础提交了,我们可以通过 `git rebase --onto` 命令来将剩余的历史变基到基础提交之上。`--onto`参数是刚才`commit-tree`命令返回的 SHA 值,变基点会成为第三个提交(我们想留下的第一个提交的父提交, `9c68fdc`):
88+
现在我们已经有一个基础提交了,我们可以通过 `git rebase --onto` 命令来将剩余的历史变基到基础提交之上。`--onto` 参数是刚才 `commit-tree` 命令返回的 SHA 值,变基点会成为第三个提交(我们想留下的第一个提交的父提交,`9c68fdc`):
9289

9390
[source,console]
9491
----
@@ -100,10 +97,10 @@ Applying: fifth commit
10097

10198
image::images/replace4.png[]
10299

103-
我们已经用基础提交重写了最近的历史,基础提交包括如何重新组成整个历史的命令。我们可以将新历史推送到新项目中,当其他人克隆这个仓库时,他们仅能看到最近两次提交以及一个包含指令的基础提交。
104-
105-
现在我们将以想获得整个历史的人的身份来初次克隆这个项目。在克隆这个截断后的仓库后为了得到历史数据,需要添加第二个远程的历史版本库并抓取。
100+
我们已经用基础提交重写了最近的历史,基础提交包括如何重新组成整个历史的说明。我们可以将新历史推送到新项目中,当其他人克隆这个仓库时,他们仅能看到最近两次提交以及一个包含上述说明的基础提交。
106101

102+
现在我们将以想获得整个历史的人的身份来初次克隆这个项目。
103+
在克隆这个截断后的仓库后为了得到历史数据,需要添加第二个远程的历史版本库并对其做获取操作:
107104

108105
[source,console]
109106
----
@@ -121,7 +118,7 @@ From https://github.com/schacon/project-history
121118
* [new branch] master -> project-history/master
122119
----
123120

124-
现在,协作者在`master`分支中拥有他们最近的提交并且在`project-history/master`分支中拥有过去的提交。
121+
现在,协作者在 `master` 分支中拥有他们最近的提交并且在 `project-history/master` 分支中拥有过去的提交。
125122

126123
[source,console]
127124
----
@@ -137,14 +134,14 @@ c6e1e95 fourth commit
137134
c1822cf first commit
138135
----
139136

140-
为了合并他们,你可以使用`git replace`命令加上你想替换的提交信息来进行替换。这样一来,我么就可以将 master 分支中的第四个提交替换为 `project-history/master` 分支中的第四个提交
137+
为了合并它们,你可以使用 `git replace` 命令加上你想替换的提交信息来进行替换。这样一来,我们就可以将 master 分支中的第四个提交替换为 `project-history/master` 分支中的“第四个”提交
141138

142139
[source,console]
143140
----
144141
$ git replace 81a708d c6e1e95
145142
----
146143

147-
现在,查看`master`分支中的历史信息,显示如下:
144+
现在,查看 `master` 分支中的历史信息,显示如下:
148145

149146
[source,console]
150147
----
@@ -156,11 +153,11 @@ e146b5f fifth commit
156153
c1822cf first commit
157154
----
158155

159-
很酷,是不是?不用改变上游的 SHA 我们就能用一个提交来替换历史中的所有不同的提交,并且所有的工具(\`bisect`, \`blame` 等)也都奏效。
156+
很酷,是不是?不用改变上游的 SHA 我们就能用一个提交来替换历史中的所有不同的提交,并且所有的工具`bisect``blame` 等也都奏效。
160157

161158
image::images/replace5.png[]
162159

163-
有趣的是,即使是使用了`c6e1e95`提交数据来进行替换,它的 SHA 仍显示为`81a708d`。即使你运行了`cat-file`命令,它仍会显示你替换的数据:
160+
有趣的是,即使是使用了 `c6e1e95` 提交数据来进行替换,它的 SHA 仍显示为 `81a708d`。即使你运行了 `cat-file` 命令,它仍会显示你替换的数据:
164161

165162
[source,console]
166163
----
@@ -187,4 +184,4 @@ e146b5f14e79d4935160c0e83fb9ebe526b8da0d commit refs/remotes/origin/master
187184
c6e1e95051d41771a649f3145423f8809d1a74d4 commit refs/replace/81a708dd0e167a3f691541c7a6463343bc457040
188185
----
189186

190-
这意味着可以轻而易举的和其他人分享我们的替换,正因为我们可以将替换推送到服务器中,其他人才可以下载到。也许在历史移植情况下不是很有用(既然每个人都能轻松下载到,为何还要拆分他们呢?),但在其他情况下仍然很有用。
187+
这意味着我们可以轻而易举的和其他人分享替换,因为我们可以将替换推送到服务器中并且其他人可以轻松地下载。也许在历史移植情况下不是很有用(既然每个人都乐意下载最新版本和历史版本,为何还要拆分他们呢?),但在其他情况下仍然很有用。

0 commit comments

Comments
 (0)