Git 什么';重写未出版的历史有什么坏处?

Git 什么';重写未出版的历史有什么坏处?,git,dvcs,bazaar,Git,Dvcs,Bazaar,我想知道在一个开发过程中“失去历史”的坏处是什么。一个著名的例子当然是git-rebase-i/git-merge-squash,还有“我想在将更改提交到主线之前清理提交历史记录”下的例子 我可以看出,导出补丁并将它们应用到另一个分支将丢失该分支的“历史记录”,但为什么该分支及其提交历史记录在合并后会有用呢 有人能详细说明为什么这些技术被认为是“肮脏的”吗?只要可以将更改应用于主分支,为什么最初提交更改的顺序很重要?如果您自己看不到历史记录的任何用处,那么就没有任何负面影响。事实上,许多开发人员

我想知道在一个开发过程中“失去历史”的坏处是什么。一个著名的例子当然是
git-rebase-i
/
git-merge-squash
,还有“我想在将更改提交到主线之前清理提交历史记录”下的例子

我可以看出,导出补丁并将它们应用到另一个分支将丢失该分支的“历史记录”,但为什么该分支及其提交历史记录在合并后会有用呢


有人能详细说明为什么这些技术被认为是“肮脏的”吗?只要可以将更改应用于主分支,为什么最初提交更改的顺序很重要?

如果您自己看不到历史记录的任何用处,那么就没有任何负面影响。事实上,许多开发人员在一个单独的分支(
feature/1234
)中创建新的功能,然后不是将其合并,而是将其重新基础/压缩到
develope
-分支上并删除该功能分支。原因是,通常,如果您实现了一个特性,您对以后的每个实现步骤都不感兴趣,而是对整个特性感兴趣。但是,您应该避免挤压没有任何共同点的提交,因为这只是为了保存提交。有很多提交也没有坏处。

如果您自己看不到历史记录的任何用处,那么也没有坏处。事实上,许多开发人员在一个单独的分支(
feature/1234
)中创建新的功能,然后不是将其合并,而是将其重新基础/压缩到
develope
-分支上并删除该功能分支。原因是,通常,如果您实现了一个特性,您对以后的每个实现步骤都不感兴趣,而是对整个特性感兴趣。但是,您应该避免挤压没有任何共同点的提交,因为这只是为了保存提交。有很多提交也没有坏处。

除了管理生产质量代码之外,您还可以将git视为整个产品的全局无限延展撤销。“未发表的历史”可以包括打字错误、没有成功的实验、你只是因为当时在那里而做的一些不相关的小修改,以后可能会分裂出去,等等。我从来都不理解那种对undo皱眉头的心态


将你的重写内容与你重写的内容进行比较。如果新版本能更好地满足您的需求,那就更好了。如果原始版本中的某些内容满足了新版本的需求,那么这就是一个缺点。特别是对于保留在您自己的回购协议中的未发布内容,您可以随意处理其中的内容。

除了管理生产质量代码之外,您还可以将git视为整个产品全球无限延展撤销。“未发表的历史”可以包括打字错误、没有成功的实验、你只是因为当时在那里而做的一些不相关的小修改,以后可能会分裂出去,等等。我从来都不理解那种对undo皱眉头的心态

将你的重写内容与你重写的内容进行比较。如果新版本能更好地满足您的需求,那就更好了。如果原始版本中的某些内容满足了新版本的需求,那么这就是一个缺点。特别是对于您自己的回购协议中未发布的内容,您可以随意处理其中的内容。

考虑以下几点:

* (master) Merge feature-branch into master
|\
| * (feature-branch) Fix a comment typo
| * Add comments
| * Add feature task 3
| * Consolidate feature tasks 1 and 2
| * Add feature task 2
| * Forgot a semi-colon
| * Add feature task 1
|/
* Older commit on master
与此相比:

* (master, feature-branch) Add feature
* Older commit on master
第一个是(--no ff)将
特征分支
合并到
主分支
,底部是将
特征分支
挤压/重基到
主分支
。第一个是非常详细的,这将使回归测试更加集中,但如果您有很多特性分支,这将变得混乱。第二种方法是,如果您有很多特性,但丢失了分支定义,那么阅读起来就更清晰了。您自己的方法将取决于项目的规模、团队的规模等

就我个人而言,我使用的是一种意志,任何其他人都会关心这个提交的经验法则。下游没有人在意,例如,我修正了评论中的一个拼写错误。在按下按钮之前,我通常会将第一个示例转换为如下内容(使用
rebase-I
):

* (master) Merge feature-branch into master
|\
| * (feature-branch) Add feature task 3
| * Add feature task 2
| * Add feature task 1
|/
* Older commit on master
分支历史的相关部分仍然很明显,其余部分被压扁了。

考虑一下:

* (master) Merge feature-branch into master
|\
| * (feature-branch) Fix a comment typo
| * Add comments
| * Add feature task 3
| * Consolidate feature tasks 1 and 2
| * Add feature task 2
| * Forgot a semi-colon
| * Add feature task 1
|/
* Older commit on master
与此相比:

* (master, feature-branch) Add feature
* Older commit on master
第一个是(--no ff)将
特征分支
合并到
主分支
,底部是将
特征分支
挤压/重基到
主分支
。第一个是非常详细的,这将使回归测试更加集中,但如果您有很多特性分支,这将变得混乱。第二种方法是,如果您有很多特性,但丢失了分支定义,那么阅读起来就更清晰了。您自己的方法将取决于项目的规模、团队的规模等

就我个人而言,我使用的是一种意志,任何其他人都会关心这个提交的经验法则。下游没有人在意,例如,我修正了评论中的一个拼写错误。在按下按钮之前,我通常会将第一个示例转换为如下内容(使用
rebase-I
):

* (master) Merge feature-branch into master
|\
| * (feature-branch) Add feature task 3
| * Add feature task 2
| * Add feature task 1
|/
* Older commit on master

分支历史的相关部分仍然很明显,其余部分被压扁。

考虑将您的问题改写为“重写未发布的历史”。重写人们可能已经基于分支等的事物有更多的缺点,在你的情况下似乎不相关。考虑把你的问题改写为“重写未出版的历史”。重写人们可能已经基于分支等的东西有更多的缺点,这似乎与您的情况无关。