公司开发部门 GIT SVN 之争

2015-07-28 11:37:47 +08:00
 Navee
公司最开始决定是使用GIT作为版本控制 , 也都使用了4,5个月了 , 开发人员也都是20多岁年轻力壮的年轻人 , 每个组的组长也一直在做git使用的培训 , 即使是这样 , 还是遇到了非常大的阻碍 , 主要是如下几点 :
1.代码合并导致代码丢失
2.很多人对代码commit到本地后还要push到remote表示很不解
3.个别同事经常反馈commit的记录丢失
因为很多同事都遇到这3个问题 , 所以普偏反馈建议改为SVN作为版本控制 , 特别是接连好几次有同事反馈了第三个问题 , 我和运维都表示很吃惊 , 表示绝对不会出现丢失的情况 ; 但是公司的领导看到这样的反馈 , 还是建议采纳开发的建议 , 改为SVN , 然后运维就将GIT 改为了SVN

个人的一点看法:
对于第一点 , 我觉得完全是开发人员自己的问题造成的 , 如果开发人员不找到自己的原因 , SVN也会出现合并造成代码丢失的问题
第3点问题 , 当时有人说这样的问题 , 我表示也是非常的诧异的 , 我自己也是刚用git , 但是也觉得并不会出现这样的问题 , 之道有一次自己做了这样一个操作 , 在一个branch上checkout了一个commit,然后在这个commit的基础上做了一下修改,然后commit了,最后checkout 原有branch时发现 , 这个commit在branch的log上是不存在的 , 由此我猜测是不是当时那位遇到commit丢失的同事是否也是像我这样操作了 ;

总之用了一个多月的git , 觉得git在需要频繁修改bug的场景下 , 发挥巨大优势的branch比svn还是要好用很多的 ; 发表这个帖子并不是想说git 比svn好用 (LZ在一个公司使用过2年的Microsoft sourcesafe , 那种恶心的版本控制简直不想再提) , 而是提一下自己以及同事在使用git确实会遇到一些影响开发的问题 .
20591 次点击
所在节点    程序员
215 条回复
kxxoling
2015-07-28 12:24:58 +08:00
丢 commit 是 git log 都没有吗?还是说只是代码变动没出来?前者可能是谁误用了 reset、rebase,或者误删了未完全合并的分支(可能性比较小),后者可能是别人解决冲突的时候覆盖了找个图形化工具看看是哪次合并消失的。
PS:在这里冷嘲热讽真的没意义。
soli
2015-07-28 12:25:22 +08:00
如果是觉得 svn 好用而换到 svn ,没啥可说的。
如果是觉得新人搞不定 git 才换到 svn,这不是逃避问题么?这样的新人毫无挑战精神,连简单的工具都学不会,要来何用?
Jeremial
2015-07-28 12:26:47 +08:00
@Navee 是的
ttma1046
2015-07-28 12:26:55 +08:00
找一些好的培训材料培训

1。代码合并必须不能依靠git的自动合并,很多时候我都用kdiff3自己合并,kdiff3是我用过最好的合并工具没有之一。
2。对commit到本地不解这个只能说思想上的定式,没有开放包容一切的头脑,那基本就可以换一个职业了。。

3。这个跟2可能有点关系,我以前经常发生过某些白痴commit了,忘记push就回家了,因为他脑子里一直是commit就是push, 第二天来以为自己昨天已经都push了,就pull了一把,时间一久就从来没有把commit的东西push.
Navee
2015-07-28 12:29:49 +08:00
@Andiry
我这里写的a001 002 指的不是branch 而是commit之后的返回hash
我刚测试了一下
我checkout a001之后修改文件并commit , git 返回 HEAD detached at a003
我co master之后 a003 这次提交在master的log中并找不到

我指的commit 丢失并不是commit在物理上丢失了 , 我知道这次commit a003 一定在某个地方在 , 但是在master或者某个branch上并不能查看到这个commit
我从描述到现在没有说这是git 的问题或者是git 的缺陷 , 只是表示在这种操作场景下会造成commit找不到,会给开发人员造成困惑
那些推荐人手一本gitpro , 推荐阅读gitpro的我觉得也是没有必要的.
revlis7
2015-07-28 12:30:18 +08:00
你们需要一个老手好好带带你们,或者自己先静下心来补一补git的基础知识,把原有的svn的习惯全部抛在脑后。用惯了svn会把一些概念错误的套用在git上,checkout命令就是一个典型。
zts1993
2015-07-28 12:34:04 +08:00
我就是觉得团队使用svn好。打我啊。
ll0xff
2015-07-28 12:34:42 +08:00
我觉得加个gerrit之类的review工具才是当务之急。
bk201
2015-07-28 12:34:57 +08:00
工具而已,大多数人觉得svn顺手就svn,有那么纠结么,推广新工具可以做为培训,然后让他们私下里用用,等都觉得好用时再推不迟。
Andiry
2015-07-28 12:34:58 +08:00
@Navee 没错啊,git已经给出提示了
你checkout a001之后并不在任何一个branch上,当然也不在master上,处于detach状态
你提交了a003也没有任何意义,因为并没有任何一个branch让你提交
等你回到master上自然a003就不见了

我不认为这会造成任何困惑,因为git已经用那么多提示信息明明白白的告诉你了。
soli
2015-07-28 12:35:10 +08:00
@Andiry 这个问题不正是 git 的优势所在么?

如果 svn 服务器文件系统坏了。代码历史就真没了。

git 的话,如果一个 git 仓库所在的文件系统挂了,还可以用其他的仓库恢复,并且不丢历史。

正所谓,分布式版本控制。
yoa1q7y
2015-07-28 12:38:43 +08:00
@Navee 简直无法理解lz的做法,都跟你说了你的困惑、你的操作问题完全是没理解,为什么不去补习一下?
就好比你对别人说,我肚子有点饿,别人对你说,你需要吃点东西,结果你却说,我觉得吃东西是没有必要的。。。
newtonisaac
2015-07-28 12:39:24 +08:00
svn的公司领导不懂技术,我只能说到这了。
zongwan
2015-07-28 12:39:30 +08:00
IDE项目文件 git很麻烦啊
xcode默认git
项目view 2个人同时改了结构 提交就会冲突
一堆新加 文件 + 删除老文件 不同MD5在 xcode自己的配置文件里乱七八糟的

借地求问 如何解决?
涉及IDE内部自动生成文件(甚至可能有 二进制配置文件)
只能几个人分开时间段 pull了 再修改 push提交吗?
how2code
2015-07-28 12:42:02 +08:00
git reset --hard HEAD~3
git push -f
你执行下看看什么情况、(别在主分支上这样搞,会丢commit的)
commit丢失肯定是人为操作错误。
revlis7
2015-07-28 12:42:13 +08:00
@Navee

先不谈什么svn还是git,我们来说说LZ遇到的实际问题。印象中我平时使用git的checkout命令一般都是用于切换分支而已。

按LZ的描述“我checkout a001之后修改文件并commit”,首先checkout到一个commit hash这样的操作一般是不常用到的。因为在git里面这样做意味着使你的当前工作目录脱离了任何一个分支,所以你会看到类似detached的提示,也就导致了你后面的提交也不属于任何一个分支。那么“在master或者某个branch上并不能查看到这个commit”也就不足为奇了。

另外由于git存在本地和远程的概念,所以当本地和远程分支出现分歧时,会有比较复杂的情况需要处理,所以弄清本地和远程分支的概念也很重要。
zkd8907
2015-07-28 12:42:56 +08:00
又要开战了,围观中。
est
2015-07-28 12:43:00 +08:00
git checkout -f
git reset --hard
git push -f

老板,git 要丢数据,赶紧换svn。
chengzhoukun
2015-07-28 12:43:38 +08:00
@sortbylist 负能量真重,大家都觉得能提高效率的工具为什么不去学
chloerei
2015-07-28 12:43:43 +08:00
@zongwan 忽略 IDE 内部文件。

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

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

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

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

© 2021 V2EX