合并到 master 时为什么要删除功能分支
why should I delete feature branches when merged to master
我见过的大多数 git 工作流程都建议在 branch
合并到 master 后删除它。例如,此 gitflow 建议如下:
# Incorporating a finished feature on develop
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
为什么要删除分支?我也很好奇后来发现该功能引入的错误时该怎么办 - 我是否应该再次创建具有相同名称的分支,在那里修复错误,合并到 master 并再次删除分支?
因为 myfeature
分支历史代表了为实现 myfeature
.
而完成的所有中间提交
该策略只在 master
中保留一次提交,而忽略了中间步骤,这对长期存在的分支很有意义,正如我在“Why does git fast-forward merges by default?”中解释的那样。
在 master
中完成(合并)的一个提交的提交消息应该清楚地表明它已完成以实现“myfeature
”。
如果需要修复,分支名称可以重复使用(因为之前被删除了)。
需要认识到的重要一点是 Git 分支只不过是指向提交的标签。 Git 中的分支实际上是分支。如果 feature
在 master
是提交 B.
时从 master
分支出来,这就是存储库的样子
A - B - C - F - H [master]
\
D - E - G - I[feature]
看到了吗?实际分支。当你 git merge feature
成为 master 时,你会得到这个。
A - B - C - F - H - J [master]
\ /
D - E - G - I [feature]
一旦你 git branch -d feature
分支历史就会保留!
A - B - C - F - H - J [master]
\ /
D - E - G - I
J 有 parents H 和 I。没有它们 J 就不可能存在,它融入了 Git 的工作原理。没有 G,我就无法存在。没有 E,G 就无法存在。等等。分支必须保留
J 是一个合并提交,通常包含要合并的分支的名称。它与任何其他提交一样,因此您甚至可以向其添加更多信息,例如 link 回到您的问题跟踪器。
git merge --no-ff
用于防止 Git 执行 "fast forward" 并丢失分支历史记录。如果自创建分支以来未在 master
上完成任何工作,就会发生这种情况。 fast-forward 看起来像这样。
A - B[master]- D - E - G - I [feature]
git checkout master
git merge feature
A - B - D - E - G - I [feature] [master]
由于 master
是 feature
的直接祖先,因此不需要合并。 Git 可以只移动 master
标签。你的分支历史丢失了,看起来 D、E、G 和 I 都是在 master 上作为单独的提交完成的。 git merge --no-ff
告诉 Git 永远不要这样做,总是执行合并。
将来,当发现 G 中引入了错误时,任何浏览存储库的人都可以看到它是作为分支的一部分完成的,向前查找合并提交,并从那里获取有关分支的信息.
既然如此,为什么要删除分支?两个原因。首先,它会用死分支弄乱你的分支列表。
其次,更重要的是,它会阻止您重复使用该分支。分支和合并很复杂。一次性使用、短暂的功能分支通过确保您只将分支合并回主分支来简化流程 一次。这消除了许多技术和管理问题。当你合并一个分支时,它是完成。如果您需要修复该分支中引入的问题,只需将其视为master中的错误并创建一个新分支来修复它。
不幸的是,git log
对用户说谎并呈现非线性历史的线性表示。要解决此问题,请使用 git log --graph --decorate
。这将像我上面的示例一样画线,并向您显示每次提交的任何分支和标签。您将对存储库有更真实的了解。
如果您使用的是 Mac,GitX will visualize the repository for you. gitk 是通用版本。
我见过的大多数 git 工作流程都建议在 branch
合并到 master 后删除它。例如,此 gitflow 建议如下:
# Incorporating a finished feature on develop
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
为什么要删除分支?我也很好奇后来发现该功能引入的错误时该怎么办 - 我是否应该再次创建具有相同名称的分支,在那里修复错误,合并到 master 并再次删除分支?
因为 myfeature
分支历史代表了为实现 myfeature
.
该策略只在 master
中保留一次提交,而忽略了中间步骤,这对长期存在的分支很有意义,正如我在“Why does git fast-forward merges by default?”中解释的那样。
在 master
中完成(合并)的一个提交的提交消息应该清楚地表明它已完成以实现“myfeature
”。
如果需要修复,分支名称可以重复使用(因为之前被删除了)。
需要认识到的重要一点是 Git 分支只不过是指向提交的标签。 Git 中的分支实际上是分支。如果 feature
在 master
是提交 B.
master
分支出来,这就是存储库的样子
A - B - C - F - H [master]
\
D - E - G - I[feature]
看到了吗?实际分支。当你 git merge feature
成为 master 时,你会得到这个。
A - B - C - F - H - J [master]
\ /
D - E - G - I [feature]
一旦你 git branch -d feature
分支历史就会保留!
A - B - C - F - H - J [master]
\ /
D - E - G - I
J 有 parents H 和 I。没有它们 J 就不可能存在,它融入了 Git 的工作原理。没有 G,我就无法存在。没有 E,G 就无法存在。等等。分支必须保留
J 是一个合并提交,通常包含要合并的分支的名称。它与任何其他提交一样,因此您甚至可以向其添加更多信息,例如 link 回到您的问题跟踪器。
git merge --no-ff
用于防止 Git 执行 "fast forward" 并丢失分支历史记录。如果自创建分支以来未在 master
上完成任何工作,就会发生这种情况。 fast-forward 看起来像这样。
A - B[master]- D - E - G - I [feature]
git checkout master
git merge feature
A - B - D - E - G - I [feature] [master]
由于 master
是 feature
的直接祖先,因此不需要合并。 Git 可以只移动 master
标签。你的分支历史丢失了,看起来 D、E、G 和 I 都是在 master 上作为单独的提交完成的。 git merge --no-ff
告诉 Git 永远不要这样做,总是执行合并。
将来,当发现 G 中引入了错误时,任何浏览存储库的人都可以看到它是作为分支的一部分完成的,向前查找合并提交,并从那里获取有关分支的信息.
既然如此,为什么要删除分支?两个原因。首先,它会用死分支弄乱你的分支列表。
其次,更重要的是,它会阻止您重复使用该分支。分支和合并很复杂。一次性使用、短暂的功能分支通过确保您只将分支合并回主分支来简化流程 一次。这消除了许多技术和管理问题。当你合并一个分支时,它是完成。如果您需要修复该分支中引入的问题,只需将其视为master中的错误并创建一个新分支来修复它。
不幸的是,git log
对用户说谎并呈现非线性历史的线性表示。要解决此问题,请使用 git log --graph --decorate
。这将像我上面的示例一样画线,并向您显示每次提交的任何分支和标签。您将对存储库有更真实的了解。
如果您使用的是 Mac,GitX will visualize the repository for you. gitk 是通用版本。