入门训练圆的面积_入门

入门训练圆的面积

对于不熟悉免费和开源版本控制系统(VCS)的任何人,Subversion都已成为标准的非商业VCS,取代了旧版的并发版本系统(CVS)。 CVS对于有限的使用仍然是很好的选择,但是Subversion的魅力在于它只需要在Web服务器上进行一点点设置,而无需过多设置。 Subversion确实有一些问题,我将在这里讨论,但是在大多数情况下,它只是有效。

那么,为什么我们需要另一个呢? Git(大写的“ G”; git是命令行工具)在许多方面都设计得比Subversion更好。 它是许多分布式 VCS之一。 我自己的第一次体验是在Arch / tla以及Mercurial,Bazaar,darcs和其他一些人中。 由于许多原因,我将在相关的范围内进行讨论,因此Git变得流行起来,通常与Subversion一起被视为个人或公司VCS的两个主要选择。

如果您是Subversion用户,则对Git感兴趣有两个重要原因。

  • 您之所以要迁移到Git,是因为Subversion在某种程度上限制了您。
  • 您对Git感到好奇,并想了解它与Subversion的比较。

好吧,也许还有第三个原因:Git是一种相对热门的技术,您希望将其包含在简历中。 我希望这不是您的主要目标; 了解Git是开发人员可以做的最有意义的事情之一。 即使您现在不使用Git,随着该行业范围和地理分布的巨大变化,此分布式VCS中包含的概念和工作流程肯定会在未来10年中成为IT行业大多数细分领域的关键知识。

最后,尽管您不是Linux内核开发人员,这可能不是一个令人信服的理由,但内核和许多其他重要项目都是使用Git维护的,因此,如果您打算做出贡献,则需要对其进行熟悉。

本文适用于初级到中级的Subversion用户。 它需要Subversion的初学者级知识和版本控制系统的一些常识。 这里的信息主要面向类似UNIX®(Linux®和Mac OS X)系统的用户,为Windows®用户提供了一些信息。

本系列的第2部分将讨论Git的更高级用法:合并分支,生成diff和其他常见任务。

Subversion和Git基础

此后,我将“ Subversion”缩写为“ SVN”,以节省U,B,E,R,S,I和O键上的磨损。

那么,SVN有什么用呢? 您可能已经知道这一点,但是VCS与文件无关。 这是关于变化的。 运行在中央服务器上的SVN将更改添加到其数据存储库中,并且可以在每次更改后为您提供快照。 该快照具有修订号; 版本号对于SVN和使用它的人非常重要。 如果您的更改是在我的之后进行的,则可以保证您具有更高的修订号。

Git具有类似的目标-跟踪更改-但没有集中式服务器。 这种差异至关重要。 在SVN集中的地方,Git是分布式的; 因此,Git无法提供增加的修订版本号,因为没有“最新修订”。 它仍然具有唯一的修订ID。 它们本身不像SVN版本号那样有用。

对于Git,关键的动作不再是提交 ; 这是合并 。 任何人都可以克隆存储库并提交到克隆。 存储库的所有者可以选择合并更改。 另外,开发人员可以将更改推回存储库。 我将仅探讨后一种授权推送模型。

将目录保留在SVN下

让我们从一个简单的常见示例开始:使用SVN跟踪目录的内容。 您将需要一个SVN服务器,并且显然需要一个文件目录,以及该服务器上具有至少一条路径的提交权限的帐户。 通过添加和提交目录开始:

清单1.在SVN下设置目录
% svn co http://svnserver/...some path here.../top
% cd top
% cp -r ~/my_directory .
% svn add my_directory
% svn commit -m 'added directory'

这让你做什么? 现在,您可以获取此目录下提交的任何文件的最新版本,删除文件,重命名它们,创建新文件或目录,将更改提交到现有文件等等:

清单2. SVN下的基本文件操作
# get latest
% svn up
# what's the status?
% svn st
# delete files
% svn delete
# rename files (really a delete + add that keeps history)
% svn rename
# make directory
% svn mkdir
# add file
% svn add
# commit changes (everything above, plus any content changes)
% svn commit

在这里,我不会详细检查这些命令,但请记住它们。 要获得有关这些命令的svn help COMMAND ,只需键入svn help COMMAND ,Subversion将为您显示一些基本的帮助。 有关更多信息,请参见手册。

在Git下保存目录

我将遵循与SVN示例相同的方法。 和以前一样,我假设您已经有一个充满数据的目录。

对于远程服务器,我将使用免费的github.com服务,但是,当然,您可以根据需要设置自己的服务器。 GitHub是一种使用远程Git存储库的简单方法。 在撰写本文时,对于一个免费帐户,您只能使用300MB的数据,并且您的存储库必须是公开的。 我以用户“ tzz”的身份注册,并创建了一个名为“ datatest”的公共存储库; 随意使用它。 我给了我的公共SSH密钥; 如果您还没有一个,则应该生成一个。 您可能还想尝试Gitorious服务器或repo.or.cz。 你会发现的Git的托管服务在git.or.cz维基一个长长的清单(见相关信息中的链接)。

关于GitHub的一件好事是它的友好性。 它确切地告诉您设置Git和初始化存储库所需的命令。 我会和你一起经历这些。

首先,您需要安装每个平台都不同的Git,然后对其进行初始化。 Git下载页面(请参阅参考资料 )列出了许多选项,具体取决于平台。 (在Mac OS X上,我使用了port install git-core命令,但是您需要首先设置MacPorts。从Git下载页面链接的还有一个独立的MacOS X Git安装程序;对于大多数人来说,它可能会更好地工作。)

安装后,这是我用于基本设置的命令(自然选择您自己的用户名和电子邮件地址):

清单3.基本的Git设置
% git config --global user.name "Ted Zlatanov"
% git config --global user.email "tzz@bu.edu"

您可能已经发现与SVN有所不同; 在那里,您的用户身份在服务器端,而您是服务器说的那个人。 在Git中,如果愿意的话,您可以成为维特根斯坦的奇妙猴子 (我抵抗了诱惑)。

接下来,我设置数据文件并使用它们初始化我的存储库。 (GitHub还将从公共SVN存储库导入,这可能会有所帮助。)

清单4.目录设置和第一次提交
# grab some files
% cp -rp ~/.gdbinit gdbinit
% mkdir fortunes
% cp -rp ~/.fortunes.db fortunes/data.txt
# initialize
% git init
# "Initialized empty Git repository in /Users/tzz/datatest/.git/"
# add the file and the directory
% git add gdbinit fortunes
% git commit -m 'initializing'
#[master (root-commit) b238ddc] initializing
# 2 files changed, 2371 insertions(+), 0 deletions(-)
# create mode 100644 fortunes/data.txt
# create mode 100644 gdbinit

在上面的输出中,Git向我们介绍了文件模式。 100644是指这些文件上的权限位的八进制版本。 您无需担心,但是2371 insertions令人费解。 它只更改了两个文件,对不对? 该数字实际上是指插入的行数。 当然,我们没有删除任何内容。

如何将我们的新更改推送到GitHub服务器? 该文档告诉我们如何添加一个名为“ origin”的远程服务器(您可以使用任何名称)。 我在这里应该提到,如果您想了解更多有关Git命令的信息,例如git remote ,则可以输入git remote --helpgit help remote 。 这是命令行工具的典型功能,SVN的功能非常相似。

清单5.将更改推送到远程
# remember the remote repository is called "datatest"?
% git remote add origin git@github.com:tzz/datatest.git
# push the changes
% git push origin master
#Warning: Permanently added 'github.com,65.74.177.129' (RSA) to the list of known hosts.
#Counting objects: 5, done.
#Delta compression using 2 threads.
#Compressing objects: 100% (4/4), done.
#Writing objects: 100% (5/5), 29.88 KiB, done.
#Total 5 (delta 0), reused 0 (delta 0)
#To git@github.com:tzz/datatest.git
# * [new branch]      master -> master

该警告来自OpenSSH,因为github.com以前不是已知主机。 完全不用担心。

我们可以说,Git消息是彻底的 。 与SVN的消息易于理解不同,Git是为mentat编写的。 如果您来自弗兰克·赫伯特(Frank Herbert)的《 沙丘》世界,并且经过了人机培训,那么您可能已经写了自己的Git版本,只是因为可以。 对于我们其余的人来说,增量压缩和它所使用的线程数并不是很相关(它们使我们的头受伤)。

推送是通过SSH完成的,但是您可以使用其他协议,例如HTTP,HTTPS,rsync和file。 参见git push --help

这是SVN和Git之间最关键,最重要的基本区别。 SVN的提交说“将其推送到中央服务器”。 在提交SVN之前,您所做的更改都是空洞的。 使用Git,您的提交是local ,无论远程端发生什么,您都有一个本地存储库。 您可以撤消更改,分支,提交到分支等等,而无需与远程服务器进行任何交互。 使用Git推送实际上是将存储库状态与远程服务器同步。

好吧,所以最后让我们看一下发生了什么的Git日志:

清单6. Git日志
% git log
#commit b238ddca99ee582e1a184658405e2a825f0815da
#Author: Ted Zlatanov <tzz@lifelogs.com>
#Date:   ...commit date here...
#
#    initializing

日志中仅包含提交(请注意,长且随机的提交ID与SVN修订版号相反)。 没有提到通过git push进行同步。

通过Git合作

到目前为止,我们一直在使用Git替代SVN。 当然,要使其有趣,我们必须涉及多个用户和变更集。 我将检出存储库到另一台计算机(在这种情况下,运行Ubuntu GNU / Linux;您需要安装git-core而不是git ):

清单7.设置另一个Git身份并签出存储库
% git config --global user.name "The Other Ted"
% git config --global user.email "tzz@bu.edu"
% git clone git@github.com:tzz/datatest.git
#Initialized empty Git repository in /home/tzz/datatest/.git/
#Warning: Permanently added 'github.com,65.74.177.129' (RSA) to the list of known hosts.
#remote: Counting objects: 5, done.
#remote: Compressing objects: 100% (4/4), done.
#Indexing 5 objects...
#remote: Total 5 (delta 0), reused 0 (delta 0)
# 100% (5/5) done
% ls datatest
#fortunes  gdbinit
% ls -a datatest/.git
# .  ..  branches  config  description  HEAD  hooks  index  info  logs  objects  refs
% ls -a datatest/.git/hooks
# .  ..  applypatch-msg  commit-msg  post-commit  post-receive post-update
#  pre-applypatch  pre-commit  pre-rebase  update

同样,请注意OpenSSH警告,指示我们之前从未通过此机器通过SSH与GitHub开展业务。 git clone命令就像SVN检出一样,但是您没有获得内容的综合版本(特定版本或最新版本的快照),而是获得了整个存储库。

我包括了datatest / .git目录及其下的hooks子目录的内容,以表明您确实获得了所有内容。 与SVN不同,Git默认情况下不保留任何秘密,而SVN默认情况下将存储库保持私有,仅允许访问快照。

顺便说一句,如果您想在Git存储库上执行某些规则,无论是在每次提交时还是在其他时间,都应使用钩子。 它们是外壳程序脚本,与SVN挂钩非常相似,并且具有相同的“为成功返回零,为失败返回其他任何东西”标准UNIX约定。 我不会在这里详细介绍钩子,但是如果您的目标是在团队中使用Git,则一定要仔细阅读它们。

好的,因此“另一个Ted”很生气,想要在master分支中添加一个新文件(大致等效于SVN的TRUNK),并且还要对gdbinit文件进行一些更改来创建一个新分支。

清单8.添加文件并创建一个新分支
# get a file to add...
% cp ~/bin/encode.pl .
% git add encode.pl
% git commit -m 'adding encode.pl'
#Created commit 6750342: adding encode.pl
# 1 files changed, 1 insertions(+), 0 deletions(-)
# create mode 100644 encode.pl
% git log
#commit 675034202629e5497ed10b319a9ba42fc72b33e9
#Author: The Other Ted <tzz@bu.edu>
#Date:   ...commit date here...
#
#    adding encode.pl
#
#commit b238ddca99ee582e1a184658405e2a825f0815da
#Author: Ted Zlatanov <tzz@lifelogs.com>
#Date:   ...commit date here...
#
#    initializing
% git branch empty-gdbinit
% git branch
#  empty-gdbinit
#* master
% git checkout empty-gdbinit
#Switched to branch "empty-gdbinit"
% git branch
#* empty-gdbinit
#  master
% git add gdbinit
% git commit -m 'empty gdbinit'
#Created commit 5512d0a: empty gdbinit
# 1 files changed, 0 insertions(+), 1005 deletions(-)
% git push
#updating 'refs/heads/master'
#  from b238ddca99ee582e1a184658405e2a825f0815da
#  to   675034202629e5497ed10b319a9ba42fc72b33e9
#Generating pack...
#Done counting 4 objects.
#Result has 3 objects.
#Deltifying 3 objects...
# 100% (3/3) done
#Writing 3 objects...
# 100% (3/3) done
#Total 3 (delta 0), reused 0 (delta 0)

那是一个很长的例子,我希望你不要入睡。 如果您这样做了,那么我希望您梦见Git存储库在无穷无尽的变更集中进行同步。 (哦,您将拥有那些梦想,不用担心。)

首先,我添加了一个文件(encode.pl,仅一行)并提交了它。 提交后,GitHub上的远程存储库不知道我进行了更改。 然后,我创建了一个名为empty-gdbinit的新分支并切换到该分支(我也可以使用git checkout -b empty-gdbinit来完成此操作)。 在该分支中,我清空了gdbinit文件并提交了更改。 最后,我推送到远程服务器。

如果切换到master分支,则在日志中不会看到空的gdbinit。 因此,每个分支都有其自己的日志,这很有意义。

清单9.查看分支之间的日志
# we are still in the empty-gdbinit branch
% git log
#commit 5512d0a4327416c499dcb5f72c3f4f6a257d209f
#Author: The Other Ted <tzz@bu.edu>
#Date:   ...commit date here...
#
#    empty gdbinit
#
#commit 675034202629e5497ed10b319a9ba42fc72b33e9
#Author: The Other Ted <tzz@bu.edu>
#Date:   ...commit date here...
#
#    adding encode.pl
#
#commit b238ddca99ee582e1a184658405e2a825f0815da
#Author: Ted Zlatanov <tzz@lifelogs.com>
#Date:   ...commit date here...
#
#    initializing
% git checkout master
#Switched to branch "master"
% git log
#commit 675034202629e5497ed10b319a9ba42fc72b33e9
#Author: The Other Ted <tzz@bu.edu>
#Date:   ...commit date here...
#
#    adding encode.pl
#
#commit b238ddca99ee582e1a184658405e2a825f0815da
#Author: Ted Zlatanov <tzz@lifelogs.com>
#Date:   ...commit date here...
#
#    initializing

当我进行推送时,Git说:“嘿,看看,在GitHub的服务器上有一个名为encode.pl的新文件。”

GitHub的Web界面现在将显示encode.pl。 但是GitHub上仍然只有一个分支。 为什么empty-gdbinit分支未同步? 这是因为Git默认情况下不假设您要推送分支及其更改。 为此,您需要推动一切:

清单10.全部推送
% git push -a
#updating 'refs/heads/empty-gdbinit'
#  from 0000000000000000000000000000000000000000
#  to   5512d0a4327416c499dcb5f72c3f4f6a257d209f
#updating 'refs/remotes/origin/HEAD'
#  from 0000000000000000000000000000000000000000
#  to   b238ddca99ee582e1a184658405e2a825f0815da
#updating 'refs/remotes/origin/master'
#  from 0000000000000000000000000000000000000000
#  to   b238ddca99ee582e1a184658405e2a825f0815da
#Generating pack...
#Done counting 5 objects.
#Result has 3 objects.
#Deltifying 3 objects...
# 100% (3/3) done
#Writing 3 objects...
# 100% (3/3) done
#Total 3 (delta 1), reused 0 (delta 0)

同样,mentat界面在这里充满荣耀。 但是我们可以弄清楚,对吗? 我们可能不是思想家,但至少我们有常识可以断定0000000000000000000000000000000000000000是某种特殊的初始标签。 我们还可以从清单9的日志中看到,标记5512d0a4327416c499dcb5f72c3f4f6a257d209fempty-gdbinit分支中的最后一个(也是唯一的)提交。 对于大多数用户而言,其余的可能还是在Aramaic中。 他们只是不在乎。 GitHub现在将显示新分支及其更改。

您可以使用git mvgit rm来管理文件,分别重命名和删除它们。

结论

在本文中,我解释了基本的Git概念,并使用Gi​​t将简单目录的内容保留在版本控制下,并在此过程中将Git与Subversion进行了比较。 我用一个简单的例子解释了分支。

在第2部分中,我将探讨合并,生成差异和其他一些Git命令。 我强烈建议您阅读非常容易理解的Git手册,或者至少阅读本教程。 可以从Git主页访问所有内容,因此请花一些时间进行探索。 (请参阅相关主题下面的链接。)从SVN用户的角度来看,你没有更多的需要。

另一方面,Git是非常丰富的DVCS。 了解有关其功能的更多信息几乎肯定会导致使用它们来简化和改善您的VCS工作流程。 另外,您甚至可能对Git存储库有一个或两个梦想。


翻译自: https://www.ibm.com/developerworks/opensource/library/l-git-subversion-1/index.html

入门训练圆的面积

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值