1
1
[[_replace]]
2
2
=== 替换
3
3
4
- Git对象是不可改变的,但它提供一种有趣的方式来用其他对象假替换数据库中的数个Git对象 。
4
+ Git 对象是不可改变的,但它提供一种有趣的方式来用其他对象假替换数据库中的数个 Git 对象 。
5
5
6
6
7
- `replace`命令可以让你在Git中指定一个对象并可以声称“每次你遇到这个Git对象时 ,假装它是其他的东西”。在你的历史中替换一个已有的提交时,这是一个最常用的方法。
7
+ `replace`命令可以让你在 Git 中指定一个对象并可以声称“每次你遇到这个 Git 对象时 ,假装它是其他的东西”。在你的历史中替换一个已有的提交时,这是一个最常用的方法。
8
8
9
9
10
- 例如,你有一个大型的代码历史并想把自己的仓库分成一个短的历史和一个更大更长久的历史,短历史供新的开发者使用,后者给喜欢数据挖掘的人使用。你可以通过最新提交来“替换”早期提交的方式来将一个历史移植到其他历史上。这意味着你不用在新历史中真正替换每一个提交,(历史来源会影响SHA的值 )你可以加入他们。
10
+ 例如,你有一个大型的代码历史并想把自己的仓库分成一个短的历史和一个更大更长久的历史,短历史供新的开发者使用,后者给喜欢数据挖掘的人使用。你可以通过最新提交来“替换”早期提交的方式来将一个历史移植到其他历史上。这意味着你不用在新历史中真正替换每一个提交,(历史来源会影响 SHA 的值 )你可以加入他们。
11
11
12
- 让我们来试试吧!首先获取一个已经存在的仓库,并将其分成两个仓库,一个是最近的仓库,一个是历史版本的仓库。然我们将见证在不更改仓库SHA值的情况下通过 `replace`命令来合并他们。
12
+ 让我们来试试吧!首先获取一个已经存在的仓库,并将其分成两个仓库,一个是最近的仓库,一个是历史版本的仓库。然我们将见证在不更改仓库 SHA 值的情况下通过 `replace`命令来合并他们。
13
13
14
14
我们将使用一个拥有5个提交的简单仓库:
15
15
@@ -27,7 +27,7 @@ c1822cf first commit
27
27
28
28
image::images/replace1.png[]
29
29
30
- 创建历史版本的历史很容易,我们可以只将一个分支放入历史中,然后将这个分支推送到一个新的远程仓库的master分支 。
30
+ 创建历史版本的历史很容易,我们可以只将一个分支放入历史中,然后将这个分支推送到一个新的远程仓库的 master 分支 。
31
31
32
32
[source,console]
33
33
----
@@ -73,7 +73,7 @@ c1822cf first commit
73
73
在这个案例中,创建一个基础提交很有用,这个提交拥有如何扩展历史的命令。这样一来,如果其他的开发者在截断的历史中命中第一个提交或需要更多提交时就知晓做什么了。
74
74
因此,接下来我们要做的是用命令创建一个最初的提交对象 ,然后在其上面变基剩下的提交(第四、五个提交)。
75
75
76
- 为了这么做,我们需要选择一个点去拆分,对于我们而言是第三个提交(SHA是 `9c68fdc`),因此我们的提交将基于此提交树。我们可以使用`commit-tree`命令来创建基础提交,这样我们就有了一个树,并返回一个全新的、无父节点的SHA提交对象 。
76
+ 为了这么做,我们需要选择一个点去拆分,对于我们而言是第三个提交( SHA 是 `9c68fdc`),因此我们的提交将基于此提交树。我们可以使用`commit-tree`命令来创建基础提交,这样我们就有了一个树,并返回一个全新的、无父节点的 SHA 提交对象 。
77
77
[source,console]
78
78
----
79
79
$ echo 'get history from blah blah blah' | git commit-tree 9c68fdc^{tree}
@@ -82,12 +82,12 @@ $ echo 'get history from blah blah blah' | git commit-tree 9c68fdc^{tree}
82
82
83
83
[NOTE]
84
84
=====
85
- `commit-tree`命令属于底层指令。有许多指令并非直接使用,而需通过其他的Git命令替换使用 。有时当我们做一些像这样的奇怪事情时,Git允许我们偶尔使用这些底层的命令 。想了解更多关于底层命令的内容参见<<_plumbing_porcelain>>
85
+ `commit-tree`命令属于底层指令。有许多指令并非直接使用,而需通过其他的 Git 命令替换使用 。有时当我们做一些像这样的奇怪事情时,Git 允许我们偶尔使用这些底层的命令 。想了解更多关于底层命令的内容参见<<_plumbing_porcelain>>
86
86
=====
87
87
88
88
image::images/replace3.png[]
89
89
90
- 现在我们已经有一个基础提交了,我们可以通过`git rebase --onto`命令来讲其他的历史变基到基础提交之上。`--onto`参数是刚才`commit-tree`命令返回的SHA值 ,变基点则在第三个提交:
90
+ 现在我们已经有一个基础提交了,我们可以通过`git rebase --onto`命令来讲其他的历史变基到基础提交之上。`--onto`参数是刚才`commit-tree`命令返回的 SHA 值 ,变基点则在第三个提交:
91
91
92
92
[source,console]
93
93
----
@@ -136,7 +136,7 @@ c6e1e95 fourth commit
136
136
c1822cf first commit
137
137
----
138
138
139
- 为了合并他们,你可以使用`git replace`命令加上你想替换的提交信息来进行替换。这样一来,我么就可以将`project-history/master`分支中的第四个提交替换为master分支中的第四次提交 。
139
+ 为了合并他们,你可以使用`git replace`命令加上你想替换的提交信息来进行替换。这样一来,我么就可以将`project-history/master`分支中的第四个提交替换为 master 分支中的第四次提交 。
140
140
141
141
[source,console]
142
142
----
@@ -155,11 +155,11 @@ e146b5f fifth commit
155
155
c1822cf first commit
156
156
----
157
157
158
- 不用改变上游的SHA我们就能用一个提交来替换历史中的所有不同的提交 ,并且所有的工具(bisect,blame等 )也都奏效。
158
+ 不用改变上游的 SHA 我们就能用一个提交来替换历史中的所有不同的提交 ,并且所有的工具( bisect , blame 等 )也都奏效。
159
159
160
160
image::images/replace5.png[]
161
161
162
- 有趣的是,即使是使用了`c6e1e95`提交数据来进行替换,它的SHA仍显示为 `81a708d`。即使你运行了`cat-file`命令,它仍会显示你替换的数据:
162
+ 有趣的是,即使是使用了`c6e1e95`提交数据来进行替换,它的 SHA 仍显示为 `81a708d`。即使你运行了`cat-file`命令,它仍会显示你替换的数据:
163
163
164
164
[source,console]
165
165
----
0 commit comments