最近在看 git 就在思考一个事情,为什么需要暂存区?

2022-01-17 10:25:58 +08:00
lingdu666  lingdu666

学分布式的时候我就知道,如果 a 直接到 b ,那么中间加一层 c ,a 到 c ,c 到 b 这样就很灵活,我猜 git 中间加一层应该是有原因的

8427 次点击
所在节点   程序员  程序员
43 条回复
dddd1919
dddd1919
2022-01-17 14:54:01 +08:00
相当于商城里的购物车
Haixiang
Haixiang
2022-01-17 15:13:01 +08:00
具个例子:假如你此时在开发 Button 组件,但是开发着开发着发现 Navigation 组件有个特别小特别小的 Bug ,比如说写了个双等号,要改成三等号。
如果有没有中间的 Stage ,你就必须写完 Button 再改 Navigation ,或者先改 Navigation 再开发 Button 。
如果有中间态,那你可以两个都同时改了,提交的时候选 Button 的文件提交,再选 Navigation 的改动提交,变变成两次很清晰的提交,而不是像 git commit -a 无脑提交,别人 Review 代码的时候就会纳闷:你开发个 Button ,搞 Navigation 干嘛。
总的来说,git stage 可以让 git 操作更加精细,也就你说的灵活。当然这也只是 stage 的一个好处,还有在做 git diff 时也是很有帮助的。
leafre
leafre
2022-01-17 15:49:45 +08:00
预期的下一次提交
gadfly3173
gadfly3173
2022-01-17 17:44:28 +08:00
@clrss #16 打勾其实就是 stage 了
chenliangngng
chenliangngng
2022-01-17 20:20:48 +08:00
一个经常用的例子:
新建了一个文件
git add .
git stash

这样可以把新文件放到 stash 里面,如果没有暂存区,那是放不进的
maplerecall
maplerecall
2022-01-17 21:07:38 +08:00
简单的说,实践过程中很多时候不是所有的改动都需要 commit 的,例如偶尔本地写死一个值或者修改一个配置用于调试。所以 commit 的时候难免需要选择部分而不是全部改动,这些选出的就被放在 stage 这个暂存区里了。
18000rpm
18000rpm
2022-01-17 23:49:20 +08:00
https://softwareengineering.stackexchange.com/questions/119782/what-does-stage-mean-in-git#comment318087_119790
https://stackoverflow.com/questions/4878358/why-would-i-want-stage-before-committing-in-git#comment71149979_4878399
看过一些相关讨论,讨论重点无非是需要保证每个 commit 的完整和纯粹。但是这个需求其实根本不用中间加个 stage 区也能在提交时保证。

有一个有用的场景是:git 的这套流程能实现只 commit 半个文件。例如在 git add 一些文件后,又对这些文件做了修改,而这些改动可能不属于本次 commit 的范围,这时 git 靠这个 stage 区就能实现半个文件的提交。从而保证了 commit 的纯粹。
但问题是这样的场景很常见吗?
更有一个新问题:在这套操作下,stage 区已经有文件与工作区不一致了,而 stage 区的文件是在测试代码和语法检测器测试范围之外的。在这种情况下 commit 的操作值得提倡吗?
kidonng
kidonng
2022-01-18 00:24:35 +08:00
Staging is commit action without commit identity

把 stage 当作轻量、无负担的 commit 就行
AItsuki
AItsuki
2022-01-18 01:07:27 +08:00
以前还真没想过这种问题,大多数使用场景中确实是可以忽略暂存区的,特别是用 idea 开发的人估计都勾选了自动暂存这个功能。
不过暂存区确实也有好用的地方,比如我写好一段代码,可以先添加到暂存区,然后又对这段代码进行尝试性优化。优化有效果就重新添加到暂存区,否则我可以直接舍弃掉当前工作区的代码然后直接提交。
又或者你写了一大堆垃圾代码,你只想保留其中一两个文件,你可以先将它们添加到暂存区,然后直接 git clean……
还有一个很少用的功能就是,你对一个文件修改了多行代码,但你可以只添加其中一行到暂存区。
说白了就是暂存区能更灵活的控制提交的东西吧,你说这功能不是必要的话确实可能是不必要的,但我需要这功能,并且觉得很好用 XD
dangyuluo
dangyuluo
2022-01-18 03:15:56 +08:00
这就是设计哲学了,不懂
Rocketer
Rocketer
2022-01-18 03:23:43 +08:00
滥用 commit 的路过。

我从来都是原子提交,改完一个不可分割的小部分就提交一次,哪怕只改了一个备注,以便记录自己干了点啥。

如果需要临时切到别的分支,比如突然来了一个 bug 需要加急,那我也会提交一次,记录一下自己正在干什么,还有哪些准备做还没做的。因为我也不知道啥时候能回到这个分支,万一时间比较长,只是暂存的话就忘了该干啥了。

所以我不需要暂存区。
xiadong1994
xiadong1994
2022-01-18 04:44:59 +08:00
@Rocketer 如果是 fork+pr+squash merge 的话,开发分支的 commit 记录其实无所谓
msg7086
msg7086
2022-01-18 06:22:06 +08:00
@Rocketer 你是把 commit 当成 stage 了,所以其实你还是用了一个不是 stage 的 stage 。
msg7086
msg7086
2022-01-18 06:24:17 +08:00
我算是比较常用 Stage 的。经常会遇到一个文件里只需要提交其中几行代码的情况。用 Stage 就可以把其中的几行 Stage 起来然后提交,然后再把剩下的东西再做一次提交。
像楼上那样原子提交也是类似的效果,但是回头整理这些原子提交的时候一样要花时间。用 Stage 算是两者折中。
yuezk
yuezk
2022-01-18 09:08:46 +08:00
@misaka19000 #9
> 这个很简单,因为 command 没有选中的功能,假设修改了两个文件 A 和 B ,不借助 add 命令不能做到只提交一个文件

这个不太准确,git commit 后面加要提交的文件是可以做到只提交某个或者某些文件的
sagaxu
2022-01-18 09:13:29 +08:00
你买买买不还得有个购物车?
42is42is42
2022-01-18 10:28:28 +08:00
sutra
2022-01-18 11:12:21 +08:00
stage 是为了 commit 更加原子性,不要在一个 commit 里包含多个功能。
ink19
2022-01-18 11:19:30 +08:00
@yuezk 那这样太麻烦了。。。万一文件非常多,而且没什么规则呢
rqtq
2022-01-18 11:33:08 +08:00
手上有很多任务时候,切来切去的时候很有用的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/828673

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX