解释GIT和SVN之间的差异

时间:2014-09-16 16:22:52

标签: git svn version-control

我来自SVN背景,我很难掌握Git的哲学。特别是,我对以下内容感到困惑。

  1. 想象一下,我在工作目录上做了一些改变。如果我切换到另一个分支,从SVN的角度来看,更改仍然是,这是非常不寻常的。 这意味着未提交的更改在分支之间共享。 此外,"阶段属性"这些文件在分支之间也是共享:如果我在一个分支中调用git add *,那么所有文件都将被添加到所有分支中的下一个提交中。 看起来我的分支机构只有已经已提交文件才有所不同。

    因此,如果未提交的数据是共享,那么,无论我现在在哪个分支,我都会提交所有暂存的文件,即使它们已被添加到不同的分支!当我来自SVN背景时,这让我非常奇怪。

    我是对的,还是我只是困惑? 为什么Git以这种方式工作?

  2. 有时候,Git告诉我这样的事情:

      

    无法切换到另一个分支,因为您的更改将被删除。先做好准备。

    在SVN中,这不是问题:分支独立。为什么以及何时在Git中发生这种情况?

  3. Git处理文件夹的方式是什么?如果我创建一个新文件夹,它不会显示在Git的状态报告中。 Git根本不关心文件夹吗?

1 个答案:

答案 0 :(得分:0)

欢迎来到GIT :) 有一种Git方式,它与SVN方式不同

  1. 有三棵树:HEAD,工作副本和舞台(请参阅http://www.infoq.com/presentations/A-Tale-of-Three-Trees),您在工作副本上做的任何 uncommited 更改不会添加到任何分支,除非您提交它们。因此,在分支之间共享 > 这些未经修改的更改,实际上,未提交的更改在您提交之前不属于任何分支。当您提交更改时,您的更改将只转到一个分支(您可以使用额外的命令将相同的更改提交给不同的分支,但稍后会提交)
  2. 那是因为无法切换到另一个分支,因为您的更改将被删除,作为一般规则,您应该执行checkout(用于切换和可选地创建分支),pull,push,merge,rebase只有你提交了所有更改。当然,您也可以使用未经修改的更改来执行此操作,但不建议使用
  3. Git不是为处理文件夹而设计的,所以,如果你需要在你的仓库中有一个“空”文件夹,你需要在文件夹中创建一个隐藏文件(按照惯例,你可以命名为“.gitkeep”)
  4. 要点:

    • 在git上,有三种基本的操作:创建提交(使用git add,git commit),处理提交(git merge,git rebase,git checkout)和同步(git push,git fetch)
    • 处理提交(合并,转换等等)在提交的更改上要容易得多,合并未经修改的更改是git中的错误方法
    • 始终首先执行并确保在执行其他操作之前没有任何未经修改的更改(我的意思是,处理提取,例如拉,合并,rebase等等),如果还有未更改的更改在你的WC /舞台上,你不想提交它们,使用 git stash (如果你想稍后使用 git stash pop 再次检索更改)