软件开发过程使用的版本控制工具:
CVS VSS SVN GIT (问题:冲突)
GIT(Git是一款自由和开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。)
git与github
window开发环境下来模拟linux环境:cygwin、Bash
TortoiseGit是一个开放的,为的git版本控制系统的源客户端
添加用户和邮箱
git config --global user.name vince
git config --global user.email finally_m@qq.com
生成密钥
ssh-keygen -t rsa -C "finally_m@qq.com"
把生成的密钥:添加到github上:
打开 C:\cygwin64\home\vince\.ssh\id_rsa.pub 文件
复制到github的ssh keys里面
在.ssh\目录下创建一个config文件,内容如下:
Host github.com
User git
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443
测试是否通过
ssh -t git@github.com
或
ssh -T git@github.com
linux基本命令的使用:
1. ls命令
ls命令是列出目录内容(List Directory Contents)的意思。运行它就是列出文件夹里的内容,可能是文件也可能是文件夹。
“ls -l”命令以详情模式(long listing fashion)列出文件夹的内容。
"ls -a"命令会列出文件夹里的所有内容,包括以"."开头的隐藏文件。
d (代表了是目录).
rwxr-xr-x 是文件或者目录对所属用户,同一组用户和其它用户的权限。
上面例子中第一个ravisaive 代表了文件文件属于用户ravisaive
上面例子中的第二个ravisaive代表了文件文件属于用户组ravisaive
4096 代表了文件大小为4096字节.
May 8 01:06 代表了文件最后一次修改的日期和时间.
最后面的就是文件/文件夹的名字
2. history命令
“history”命令就是历史记录。它显示了在终端中所执行过的所有命令的历史。
3、mkdir命令
“mkdir”(Make directory)命令在命名路径下创建新的目录。然而如果目录已经存在了,那么它就会返回一个错误信息"不能创建文件夹,文件夹已经存在了
4. touch 命令
“touch”命令代表了将文件的访问和修改时间更新为当前时间。touch命令只会在文件不存在的时候才会创建它。如果文件已经存在了,它会更新时间戳,但是并不会改变文件的内容。
5. chmod 命令
“chmod”命令就是改变文件的模式位。chmod会根据要求的模式来改变每个所给的文件,文件夹,脚本等等的文件模式(权限)。
在文件(文件夹或者其它,为了简单起见,我们就使用文件)中存在3中类型的权限
Read (r)=4
Write(w)=2
Execute(x)=1
所以如果你想给文件只读权限,就设置为'4';只写权限,设置权限为'2';只执行权限,设置为1; 读写权限,就是4+2 = 6, 以此类推。
现在需要设置3种用户和用户组权限。第一个是拥有者,然后是用户所在的组,最后是其它用户。
root@tecmint:~# chmod 777 abc.sh
6. tar命令
“tar”命令是磁带归档(Tape Archive),对创建一些文件的的归档和它们的解压很有用。
root@tecmint:~# tar -zxvf abc.tar.gz (记住'z'代表了.tar.gz)
root@tecmint:~# tar -jxvf abc.tar.bz2 (记住'j'代表了.tar.bz2)
root@tecmint:~# tar -cvf archieve.tar.gz(.bz2) /path/to/folder/abc
注意: "tar.gz"代表了使用gzip归档,“bar.bz2”使用bzip压缩的,它压缩的更好但是也更慢。
7. date命令
“date”命令使用标准的输出打印当前的日期和时间,也可以深入设置。
root@tecmint:~# date
8. cat命令
“cat”代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容。
root@tecmint:~# cat a.txt b.txt c.txt d.txt abcd.txt
9. cp 命令
“copy”就是复制。它会从一个地方复制一个文件到另外一个地方。
root@tecmint:~# cp /home/user/Downloads abc.tar.gz /home/user/Desktop
注意: cp,在shell脚本中是最常用的一个命令,而且它可以使用通配符(在前面一块中有所描述),来定制所需的文件的复制。
10. mv 命令
“mv”命令将一个地方的文件移动到另外一个地方去。
root@tecmint:~# mv /home/user/Downloads abc.tar.gz /home/user/Desktop
11. pwd 命令
“pwd”(print working directory),在终端中显示当前工作目录的全路径。
12. cd 命令
最后,经常使用的“cd”命令代表了改变目录。它在终端中改变工作目录来执行,复制,移动,读,写等等操作。
root@tecmint:~# cd /home/user/Desktop
git基本命令使用:
1、从github上克隆项目:
$ git clone http://www.bitsun.com/git/gittutorcn.git
2、工作的开始 –创建Git仓库
$ git init
创建两个文件作为练习:
$ echo "Hello world" > hello
$ echo "git example" > example
3、植入内容跟踪信息:git-add
$ git add hello example
git add *.txt //添加所有txt文件
git add README //添加单个文件
git add . //添加所有文件包括子目录,但不包括空目录
更新index
$ git update-index hello example
4、看看版本库的状态
$ git status
4、提交内容到版本库:git-commit
$ git commit -m "Initial commit of gittutor reposistory"
5、查看当前的工作:git-diff
git-diff 命令将比较当前的工作目录和版本库数据库中的差异。现在我们编辑一些文件来体验一下 git 的跟踪功能。
$ echo "It's a new day for git" >> hello
$ git diff
此时,我们可以再次使用组合命令git update-index 和 git commit 将我们的工作提交到版本库中。
6、管理分支:git-branch
直至现在为止,我们的项目版本库一直都是只有一个分支master。在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支。
创建分支
下面的命令将创建我自己的工作分支,名叫 vince,并且将以后的工作转移到这个分支上开展。
$ git branch vince
$ git checkout vince
删除分支
要删除版本库中的某个分支,使用git branch -D 命令就可以了,例如:
$ git branch -D branch-name
查看分支
运行下面的命令可以得到你当前工作目录的分支列表:
$ git branch
如果你忘记了你现在工作在哪个分支上,运行下面的命令可以告诉你:
$ cat .git/HEAD
git-show-branch 命令可以使我们看到版本库中每个分支的世系发展状态,并且可以看到每次提交的内容是否已
进入每个分支。
$ git show-branch
7、合并两个分支:git-merge
既然我们为项目创建了不同的分支,那么我们就要经常地将自己或者是别人在一个分支上的工作合并到其他的分支上去。现在我们看看怎么将vince 分支上的工作合并到 master 分支中。现在转移我们当前的工作分支到master,并且将vince 分支上的工作合并进来。
$ git checkout master
$ git merge "Merge work in vince" HEAD vince
合并两个分支,还有一个更简便的方式,下面的命令和上面的命令是等价的。
$ git checkout master
$ git pull . vince
合并外部工作
通常的情况下,合并其他的人的工作的情况会比合并自己的分支的情况要多,这在 git 中是非常容易的事情,
和你运行git-merge 命令没有什么区别。事实上,远程合并的无非就是“抓取(fetch)一个远程的版本库中的工
作到一个临时的标签中”,然后再使用git-merge 命令。
可以通过下面的命令来抓取远程版本库:
$ git fetch <remote-repository>
根据不同的远程版本库所使用的通讯协议的路径来替代上面的remoted-repository 就可以了。
8、Git Stash
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
9、查看提交历史
git log 可以查看所有分支所有的提交历史信息
git log -p 会显示出每次提交做了哪些改动
git log -3 只列出最近三次的提交历史
git log 这时“j”向下浏览,“k”向上浏览,“q”退出 git log
10、git gc //垃圾回收,每隔一段时间例如一个月运行一次可以减少磁盘占用空间。
11、远程相关:
git clone git://github.com/schacon/grit.git //从现有仓库克隆
git clone git://github.com/schacon/grit.git mygrit //换名,唯一区别就是新建的目录成了mygrit,其他都一样
再次说明下,克隆操作会自动使用默认的 master 和 origin 名字
添加远程仓库:
git clone git@github.com:finally-vince/mly_test.git
git push origin
git remote add pb git://github.com/paulboone/ticgit.git
clone会默认添加origin仓库,如果原本用git init创建的版本库,后来又想提交到远程版本库,就可以用下边的办法
git remote add origin git@example.com:/xxxxxx
查看远程分支:
git remote -v //查看远程仓库,默认clone后,应该有一个origin仓库,-v显示对应的clone地址
git remote show origin //查看远程仓库信息
远程仓库重命名和删除:
git remote rename pb paul
12、把本地的版本库上传到远程的服务器(github)
在本地创建一个版本库:
git init
创建一个测试文件
echo "test hello" > hello.txt
把文件添加到本地版库的暂存区
git add hello.txt (或者:git add . )
提交修改到本地版本库
git commit -m "first add hello.txt file"
在github上创建版本库,如hello(http://github.com/finally-vince/hello)
注意:因为本地版本库与远程的版本库没有关系(相互独立),所以需要把远程版本库fetch到本地
git remote add hello git@github.com:finally-vince/hello.git (在本地版本库中创建一个与远程版本库的关系)
git pull hello master (获取远程版本库到本地的master分支)
git push hello master(把本地版本库上传到远程版本库)
13、回滚提交
查看记录所有HEAD的历史,也就是说当你做 reset,checkout等操作的时候,这些操作会被记录在reflog中。
git reflog
回滚
git reset --hard 98abc5a
搭建Git服务器
在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。
GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。
假设你已经有sudo权限的用户账号,下面,正式开始安装。
第一步,安装git:
$ sudo apt-get install git
第二步,创建一个git用户,用来运行git服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$ sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
第六步,克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。
管理权限
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。
这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。