合并和推送到远程时,有什么方法可以忽略本地提交历史记录吗?
Is there any way to ignore local commit history when merging and pushing to remote?
我们希望在 git 上有 per-developer 分支 。换句话说,开发人员将从 "development" 分支分支出来并创建一个本地 "feature" 分支来继续工作。
当他们对自己的工作感到满意时,他们可以切换到 devel
,确保他们有最新的文件,然后合并到他们的 "feature" 分支,然后将结果推送到 origin处理任何冲突。
但是,有一个问题——这使得提交历史非常混乱。
如果你这样做 git log --graph
,"feature" 分支不会出现,这正是我们想要的。但是,开发人员所做的每一次提交 现在都显示在 devel
分支上。那太丑了。如果有 10 个开发人员,并且每个开发人员在他们全部合并到 devel 之前都对他们的功能分支进行了 30 次提交,则 devel 现在显示总共 6 个功能的 180 次提交的历史记录。如果历史记录只显示 6 次合并到 devel 的消息,那就更好了。
有什么方法可以避免在合并时创建历史"messy"并忽略本地分支的历史吗?或者这只是战斗git太多了?
我知道这听起来可能很奇怪,但他们非常不喜欢所有这些对象最终出现在远程存储库中的想法。
正如您的团队所观察到的,如果您养成将 first-draft 工作与其所有最初的错误和蹩脚的组织以及 almost-good-enough 实验和修复合并的习惯,您的历史将是一个邪恶的恐怖沼泽地。
不要那样做。
在您的本地存储库中执行 first-draft 工作¹。然后完全重写 publication 的 first-draft 历史记录,git rebase -i
是为此推荐的常用命令,但我发现 git reset --soft
后跟 git add --patch
s创建可回顾的历史记录更方便,适合 public 消费。然后完全返工,因为反馈会使任何不当之处变得明显,并且 publish/merge 干净的结果。
开发人员仓库本地的 first-draft 提交系列对其他人没有用处,只是读出他们的编辑器 undo-buffer 历史记录。事实上,这就是 first-draft Git 历史的本质:一个 project-wide 编辑器撤消缓冲区,带有注释以帮助解决下周不可避免的 "what was I thinking?" 问题。没有其他人需要看到那些。它们是你桌上的笔记,工作产品,出生时注定要扔进垃圾桶。
¹ 有一个沼泽回购很好,开发人员可以在其中推送他们的 WIP 内容以实现可见性和协作,重要的是不要将 WIP 历史视为可丢弃的笔记,无论谁有副本.你管理它们的方式与你管理任何已投入生产的东西的方式非常非常不同
If you do git log
, the "feature" branches don't show up, which is what we want. However, every single commit that developer made now shows up on the devel branch.
git log
,默认情况下,向您显示一个简单且错误的线性版本的历史。 Git 历史不是线性的。树枝真树枝。
而不是这个...
A - B - C - D - E - F - G - H [devel]
你的历史真的是这个样子
A ---------- E ----- H [devel]
\ / \ /
B - C - D F - G
您可以使用 git log --graph
或像 Gitup 这样的 Git 可视化工具来查看。
每个 "feature bubbles" 都是来自每个分支的提交。使用真实的历史记录,您可以看到哪些提交是作为一个功能的一部分开发的。虽然这看起来 "messy",但这对于理解代码很重要。它与 git blame
.
一起特别有用
Is there some way to avoid making the history "messy" and ignore the history of a local branch when merging? Or is this just fighting git too much?
我的建议是习惯它,并学习如何驾驭它。例如,git log --merges
将只显示合并提交。一个好的 Git 可视化工具会有很大帮助。
另一个是鼓励开发者在提交之前清理他们的分支。如果你有很多 "typo fix" 和 "oops" 和 "broke the tests" 的提交,那么这些提交就没有什么价值了。 They can use git commit --amend
to change the previous commit, and git rebase -i
"fixup" to merge existing commits together。这确保所有提交都具有一定的后果。
如果你真的想,你可以做一个"squash merge",git merge --squash
。这不是保留完整的提交历史,而是将分支中的所有更改和所有提交消息粉碎为一次提交。
虽然这会生成 "clean" 历史记录,但会丢失大量有关代码开发方式的详细信息。例如,如果分支中有 30 个提交,并且您执行 git blame
来理解一些代码,您将获得所有 30 个提交的提交消息,而无法知道哪个提交适用于该代码。
您所看到的 "messy" 是对 为什么 代码是这样编写的宝贵见解。这是 gold 对于任何使用代码的人来说。一旦砸碎就再也无法复原
Is there some way to avoid making the history "messy" and ignore the history of a local branch when merging? Or is this just fighting git too much?
当然。简单地说,不要合并任何东西。有一个 public 存储库,您可以在其中单独 cherry-pick 提交。一种方法是通过像 Gerrit 这样的审查系统。
Cherry-picking 将确保您拥有干净、线性的历史记录,而不会出现合并混乱。
但是,获取单个更改很重要:即,如果开发一项功能需要 15 次提交,则应记录 15 次提交。由于各种原因,这很重要。一个是多个较小的提交可以更容易地找到和隔离 git bisect
的错误。如果更改单行的小提交被暗示为回归的原因,那么比起具有三百个更改的提交被暗示为相同的回归更容易弄清楚。
应该鼓励开发人员在合并之前清理他们的功能分支。例如,不要提交只是修复琐碎的编译器错误 ("Forgot a semicolon in parse_descriptor
, oops!")。或者提交 "clean up" 代码,这些代码最初只是由于相同的功能开发而变得混乱。
还应不鼓励将 "off topic" 提交到功能分支。
一个好的规则是每次提交都应该构建;任何提交都不应破坏任何需要后续提交的内容。这样的提交应该被压缩在一起。
每个人都应该了解如何使用 git
的交互式变基来 re-order、压缩和更正提交。
我们希望在 git 上有 per-developer 分支 。换句话说,开发人员将从 "development" 分支分支出来并创建一个本地 "feature" 分支来继续工作。
当他们对自己的工作感到满意时,他们可以切换到 devel
,确保他们有最新的文件,然后合并到他们的 "feature" 分支,然后将结果推送到 origin处理任何冲突。
但是,有一个问题——这使得提交历史非常混乱。
如果你这样做 git log --graph
,"feature" 分支不会出现,这正是我们想要的。但是,开发人员所做的每一次提交 现在都显示在 devel
分支上。那太丑了。如果有 10 个开发人员,并且每个开发人员在他们全部合并到 devel 之前都对他们的功能分支进行了 30 次提交,则 devel 现在显示总共 6 个功能的 180 次提交的历史记录。如果历史记录只显示 6 次合并到 devel 的消息,那就更好了。
有什么方法可以避免在合并时创建历史"messy"并忽略本地分支的历史吗?或者这只是战斗git太多了?
我知道这听起来可能很奇怪,但他们非常不喜欢所有这些对象最终出现在远程存储库中的想法。
正如您的团队所观察到的,如果您养成将 first-draft 工作与其所有最初的错误和蹩脚的组织以及 almost-good-enough 实验和修复合并的习惯,您的历史将是一个邪恶的恐怖沼泽地。
不要那样做。
在您的本地存储库中执行 first-draft 工作¹。然后完全重写 publication 的 first-draft 历史记录,git rebase -i
是为此推荐的常用命令,但我发现 git reset --soft
后跟 git add --patch
s创建可回顾的历史记录更方便,适合 public 消费。然后完全返工,因为反馈会使任何不当之处变得明显,并且 publish/merge 干净的结果。
开发人员仓库本地的 first-draft 提交系列对其他人没有用处,只是读出他们的编辑器 undo-buffer 历史记录。事实上,这就是 first-draft Git 历史的本质:一个 project-wide 编辑器撤消缓冲区,带有注释以帮助解决下周不可避免的 "what was I thinking?" 问题。没有其他人需要看到那些。它们是你桌上的笔记,工作产品,出生时注定要扔进垃圾桶。
¹ 有一个沼泽回购很好,开发人员可以在其中推送他们的 WIP 内容以实现可见性和协作,重要的是不要将 WIP 历史视为可丢弃的笔记,无论谁有副本.你管理它们的方式与你管理任何已投入生产的东西的方式非常非常不同
If you do
git log
, the "feature" branches don't show up, which is what we want. However, every single commit that developer made now shows up on the devel branch.
git log
,默认情况下,向您显示一个简单且错误的线性版本的历史。 Git 历史不是线性的。树枝真树枝。
而不是这个...
A - B - C - D - E - F - G - H [devel]
你的历史真的是这个样子
A ---------- E ----- H [devel]
\ / \ /
B - C - D F - G
您可以使用 git log --graph
或像 Gitup 这样的 Git 可视化工具来查看。
每个 "feature bubbles" 都是来自每个分支的提交。使用真实的历史记录,您可以看到哪些提交是作为一个功能的一部分开发的。虽然这看起来 "messy",但这对于理解代码很重要。它与 git blame
.
Is there some way to avoid making the history "messy" and ignore the history of a local branch when merging? Or is this just fighting git too much?
我的建议是习惯它,并学习如何驾驭它。例如,git log --merges
将只显示合并提交。一个好的 Git 可视化工具会有很大帮助。
另一个是鼓励开发者在提交之前清理他们的分支。如果你有很多 "typo fix" 和 "oops" 和 "broke the tests" 的提交,那么这些提交就没有什么价值了。 They can use git commit --amend
to change the previous commit, and git rebase -i
"fixup" to merge existing commits together。这确保所有提交都具有一定的后果。
如果你真的想,你可以做一个"squash merge",git merge --squash
。这不是保留完整的提交历史,而是将分支中的所有更改和所有提交消息粉碎为一次提交。
虽然这会生成 "clean" 历史记录,但会丢失大量有关代码开发方式的详细信息。例如,如果分支中有 30 个提交,并且您执行 git blame
来理解一些代码,您将获得所有 30 个提交的提交消息,而无法知道哪个提交适用于该代码。
您所看到的 "messy" 是对 为什么 代码是这样编写的宝贵见解。这是 gold 对于任何使用代码的人来说。一旦砸碎就再也无法复原
Is there some way to avoid making the history "messy" and ignore the history of a local branch when merging? Or is this just fighting git too much?
当然。简单地说,不要合并任何东西。有一个 public 存储库,您可以在其中单独 cherry-pick 提交。一种方法是通过像 Gerrit 这样的审查系统。
Cherry-picking 将确保您拥有干净、线性的历史记录,而不会出现合并混乱。
但是,获取单个更改很重要:即,如果开发一项功能需要 15 次提交,则应记录 15 次提交。由于各种原因,这很重要。一个是多个较小的提交可以更容易地找到和隔离 git bisect
的错误。如果更改单行的小提交被暗示为回归的原因,那么比起具有三百个更改的提交被暗示为相同的回归更容易弄清楚。
应该鼓励开发人员在合并之前清理他们的功能分支。例如,不要提交只是修复琐碎的编译器错误 ("Forgot a semicolon in parse_descriptor
, oops!")。或者提交 "clean up" 代码,这些代码最初只是由于相同的功能开发而变得混乱。
还应不鼓励将 "off topic" 提交到功能分支。
一个好的规则是每次提交都应该构建;任何提交都不应破坏任何需要后续提交的内容。这样的提交应该被压缩在一起。
每个人都应该了解如何使用 git
的交互式变基来 re-order、压缩和更正提交。