git
CVS、SVN 底层采用的为增量式文件系统,当文件变动发生提交时,该文件系统存储的是文件的差异信息。
Git 底层文件系统存储的则为文件快照,即整个文件内容,并保存指向快照的索引,如果文件内容没有发生任何变化,该文件系统则不会重复保存文件,只是简单地保存文件的链接。
Git 分支本质上是一个指向索引对象的可变指针,而每一个索引对象又指向文件快照。这样一来,创建分支可以瞬间完成,几乎不需要花费太多代价。换句话说,Git 分支是廉价的、轻量级的。我们看看各种 CVS、SVN 项目,分支通常意味着源代码的完整拷贝,其代价是昂贵的、重量级的。
CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内效率还能接受,可如果在互联网上,遇到大文件就很吃力了。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。那多个人如何协作呢?比如你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,只需把各自的修改推送给对方,就可以互相看到对方的修改了。
在实际使用中,其实很少在两人之间的电脑上推送版本库的修改。通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
创建版本库
mkdir -p /data/git/testproject
cd /data/git/testproject
git config --global user.name "sun86yu"
git config --global user.email wuxuegang.123@163.com
git init
瞬间Git就把仓库建好了,这时候是一个空的仓库(empty Git repository),而且当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,千万不要手动修改这个目录里面的文件。
向缓冲区提交文件
git add f1.txt f2.txt
这里提到了”缓冲区”的概念。因为执行上述命令后并没有真正提交到服务器,而是提交到缓冲区。我们可以执行多次 add 命令,分批把多个新加或修改过的文件添加到缓冲区,然后一次性提交到版本库。
提交版本并注释,将缓冲区的文件提交
git commit -m 'add 2 files'
查看版本库状态
查看当前版本库里是否有文件未提交等.
git status
查看修改的内容
git diff
放弃变更
如果已经将文件提交到缓冲区,但想放弃,想后面再提交。可以通过该命令取消。
git reset -- f1.txt
如果不加文件参数表示撤销所有缓冲区里的内容。
查看某文件或者整个库的提交记录
git log [f1.txt]
图形查看提交记录
git log --graph --pretty=oneline --abbrev-commit
向前回滚 N 个版本
git reset -hard HEAD~1
查看操作记录
git reflog
可以看到之前的各个操作及版本号。版本号可以用来后面的回滚。
回滚到某个版本
git reset -hard 263972a
放弃工作区内的变更
相当于用版本库里的文件覆盖本地工作区内的文件
git checkout -- readme.txt
删除文件
git rm f2.txt
git commit
创建分支并切换到该分支
git checkout -b dev
这时候通过 git status
可以看出当前是在 dev 分支下
查看分支情况
git branch
列出所有分支(主干也是一个分支)。当前所在分支前用星号表示
切换到某分支
git checkout master
合并某分支到当前分支
git merge [--no-ff] -m 'mergh branch' dev
加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
删除分支
git branch -d dev
强行删除某分支
git branch -D dev
隐藏现场
如果有修改,但不想提交,可以先隐藏现场。或者本地对代码做了一些修改,但这时候需要远程更新代码。这种情况下如果直接更新,会提示无法进行操作。可以先隐藏,然后再更新,接着再恢复现场。
git stash
可以多次执行该动作。不同的现场会有不同编号。
恢复现场
git stash apply
恢复后,现场记录还存在。后面还可以再恢复。
恢复现场并删除现场记录
git stash pop
这时候现场内容已经删除。
恢复指定现场
git stash apply stash@{0}
把本地库和远程库关联
git remote add origin https://youserver/youproject.git
git remote add origin git@121.40.168.157:/home/git/mining_admin.git
origin 相当于是远程库的别名。我们可以给一个远程库建多个别名。如:
git remote add origin https://youserver/youproject.git
git remote add myremote https://youserver/youproject.git
后续我们往远程库推送版本或更新版本时都会用别名。
提交版本到远程库
git push [-u] origin master
从远程库更新
git pull git@github.com:sun86yu/remotetest.git
git pull origin master
如果是更新到同名的库,则只需要写远程库的分支名。如果分支不同,则需要指明。
从远程库 dev 更新文件到本地的 master.
git pull origin dev:master
和远程仓库解除绑定 —
git remote remove origin
在本地创建和远程分支对应的分支
git checkout -b branch-name origin/branch-name
将本地分支与远程库的关联
git branch --set-upstream branch-name origin/branch-name
查看远程库信息
git remote -v
给当前分支打标签
git tag v1.0
打标签可以方便我们快速的查询。通常在一些重要的发布节点可以进行标记。上面命令执行后会给当前版本最近的一次提交打上标签。我们也可以给之前的某一次提交打上标签。
git tag v0.9 6224937
后面的参数是提交的ID值.通过提交记录可以查到
查看所有标签
git tag
查看提交记录
git log --pretty=oneline --abbrev-commit
查看某标签的详细信息
git show v1.0
删除标签
git tag -d v1.0
将标签推到远程库
git push orgin v1.0
一次性推送所有的标签到远程
git push origin --tags
删除远程标签
删除远程标签时,先要删除本地标签,然后再 push 到远程
git push origin :refs/tags/v1.0
git命令别名
git config --global alias.st status
这样,如果想看 git 的状态,就不用写 git status 了,直接用 git st 再如:
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
搭建Git服务器
远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。
先选定一个目录作为Git仓库,假定是/data/sample.git
,在/data
目录下输入命令:
git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。
创建一个git用户,用来运行git服务:
groupadd git
useradd git -G git
更改版本库目录权限:
chown -R git:git sample.git
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可以的。如果团队有几百号人,这时,可以用Gitosis来管理公钥。
配置完毕后就可以远程下载库了:
git clone git@server:/data/sample.git
实践:
-
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
-
干活都在dev分支上,比如1.0版本发布时,再把dev分支合并到 master上,在master分支打标签,发布1.0版本。
-
小伙伴们每个人都在dev分支上干活,每个人都有自己的本地版本库,时不时地往dev分支上合并就可以了
-
每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
-
开发新功能也建一个临时分支,完成后合并到 dev,如果中途放弃,直接不合并,用
git branch -D
删除分支 -
重要的提交要打标签.先 commit,再打标签。
-
忽略文件,如 eclipse的配置文件。 建立 .gitignore /Application/Runtime/*
-
上线发布:本地切换到 master,把 dev 合并到 master,把 master push 到远程。删除之前的分支(–no-ff)。