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

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

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

8427 次点击
所在节点    程序员
43 条回复
xuzhzzz
2022-01-17 10:37:05 +08:00
一看就是 git add . 用多了 (我也是)
wangxn
2022-01-17 10:40:10 +08:00
git add -p 就需要这个状态。冲突状态应该也算是它的一个变种吧。
我的理解它就是一个可以让用户整理和准备一个 commit 的中间状态,已经想不起 SVN 这些没有这个状态的工作流程是啥了。
irobbin
2022-01-17 10:41:33 +08:00
想把 git 用的精细就需要暂存区
mrgeneral
2022-01-17 10:43:02 +08:00
避免无效 commit:本次改动还没写完,但是要临时切换分支去 fix bug 、处理问题等等,需要把本次工作内容暂时缓存下来。

当然你也可以直接先 commit 到分支,但是会导致 commit 记录就很乱,或者得再花其他精力去 rebase 之类的操作治理分支(不过随意 commit 的人也不会有这个意愿 /狗头)。
Xbluer
2022-01-17 10:46:53 +08:00
参考数据库设计,为了保证数据的一致性,需要一次修改多张表的字段,所以引入了事务这个概念。

同样的,修改代码很多时候也需要修改多个文件的。比如修改了一个方法名,那么其他文件中调用了这个方法的地方都需要同步修改掉。
gengchun
2022-01-17 11:02:08 +08:00
这个要和早期的 patch 这种工作流和内核那种大型项目联系起来。有的时候需要把一堆的 patch 文件切分成多个 commit ,必须要用 staging area 。

切分支什么的,反正可以后面 push 前再 rebase 。而且大部分切分支的情况还是本地的分支,所以并不是一定要用到暂存。

现代一点的工作流,或者不是很复杂的代码库,唯一常用的情况估计只有解决分支合并时的冲突这种。其它情况都不是必须。
GuuJiang
2022-01-17 11:09:10 +08:00
假设没有暂存区,就相当于 commit(file1, file2, file3, …);
而有了暂存区,就相当于
stage.add(file1);
stage.add(file2);
stage.add(file3);
commit(stage);

说白了就是提供一种对命令行下交互友好的“选择待提交文件的操作”
2i2Re2PLMaDnghL
2022-01-17 11:17:27 +08:00
@mrgeneral 我感觉 OP 说的是 stage ,你说的这是 stash
misaka19000
2022-01-17 11:22:43 +08:00
暂存区?是指 git add 之后的内容?中文怎么感觉这么别扭。。

这个很简单,因为 command 没有选中的功能,假设修改了两个文件 A 和 B ,不借助 add 命令不能做到只提交一个文件
gps949
2022-01-17 11:25:28 +08:00
封控区、管控区、防控区
fly2mars
2022-01-17 11:37:10 +08:00
暂存是真方便 甚至还单独设置了快捷键 经常开发中途要改 bug 那就先把手上的暂存了 去改 bug 改完又 pop 出来
fengci
2022-01-17 11:49:47 +08:00
暂存挺好的, 本来开发需求中,临时来了紧急需求,用暂存先保留之前的代码。切回原来代码开发提交后 。再找回暂存数据继续开发
godmiracle
2022-01-17 12:04:50 +08:00
防止突发需求啊。。你手头上的活一个功能没完,你总不能直接 git add 吧
uni
2022-01-17 13:06:43 +08:00
你说的是 stage 还是 stash

stash 很有用的,就是手上的事情做一半要去做其他事情,那就把手上的事情 stash ,其他事情做完了在 pop 原来的事情回来继续

至于 stage ,想起来当时刚接触 git 的时候也有疑问,后来用多了就逐渐忘记了……现在要我说的话,我觉得 stage 的作用就是给一个地方让你把你要提交的东西收集起来一起提交,不过实践中很多时间就直接 git commit -am 直接提交了……
lingdu666
2022-01-17 13:08:22 +08:00
@uni stage
clrss
2022-01-17 13:11:33 +08:00
应该就是上面说的方便命令行操作.

GUI 如 JetBrains IDE, cmd-K 然后打勾就行. 流程里确实没有 stage 的概念.
yuedashi
2022-01-17 13:17:16 +08:00
用过 git add -p 就知道为啥了。还有谁说命令行必须 git add 才能提交?可以直接 git commit file file2
einq7
2022-01-17 13:58:17 +08:00
到底是指 git add 的,还是 stash 的
gromit1337
2022-01-17 14:06:05 +08:00
楼主说的是 stage 贴里一半的人在说 stash
baiyi
2022-01-17 14:39:31 +08:00
推荐看看 《 Pro Git 》,里面有很好的解释。
Git 的每次 commit 其实是要求原子性的,就是说它应该是一个尽可能小量的不可切分的整体。但实际使用过程中,总会不可避免的修改到不需要在这个 commit 中存在的内容,此时就需要使用 git add 把需要的内容放在暂存区,git 内部称为“索引( index )”,这个索引指明了这次提交需改的内容,它能帮助我们挑选出本次 commit 要修改的内容,区分粒度也不是文件级的。

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

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

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

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

© 2021 V2EX