0%

Git 实战

版本控制系统

  • 集中式 : 版本库存放在中央服务器,先从中央服务器取得最新的版本,然后开始工作
  • 分布式 : 每个人电脑都是一个完整的版本库,安全性高,一台坏掉了也不要紧

初始化

1
2
$ git config --global user.name "×××"
$ git config --global user.email "×××@gmail.com"

会在~ 目录生成一个.gitconfig

如果你想不是global,则不带–global即可,会在本项目目录下创建.git/config

git init 初始化一个git project

git diff --cached 查看缓存区里有哪些文件被修改了。git diff会显示所有已做但是没有加到缓存区的修改

add 和commit操作不赘述,commit操作后-a将所有没有加到缓存区的修改也一起提交,不过不会提交新文件

git remote add origin https://github.com/myname/myproject.git

git push origin master

分支与合并

分支在多人协作开发用的多,比如你负责的一个功能需要一个月完成,就可以创建一个分支,只把功能代码提交到这个分支上,最后合并到master分支上

git branch experimental 创建分支

git branch 查看分支

结果:

1
2
* experimental 
master

git checkout experimental 切换到其他分支

1
2
# 将experimental分支合并到master
$ git merge -m 'merge experimental branch' experimental

如果有冲突,比如两个分支都修改了同一个文件,就会merge失败,这是在master分支修改对应文件再commit即可。

当我们完成分支,可以用git branch -d experimental 来删除(只能删除已经合并了的分支,强行删除用-D

如果你觉得合并错了,可以回到合并前的状态

git reset --hard HEAD^

Git 日志

git log

git log --stat 会显示哪些文件被修改

git log --pretty=oneline 会一行显示一条信息

git log --pretty=short 显示简短信息

git log --graph -pretty=oneline 画一个漂亮的历史

git diff

git diff不仅仅能查看两个文件的差别,也可以看两个branch的区别。

git diff anotherbranch + 表示本分支比anotherbranch分支多的,- 表示本分支少的

分布式工作流程

如果要经常操作远程分支,可以定义缩写

git remote add myrepo /tmp/myrepo

git pull 相当于两个操作:使用git fetch抓取最新的修改信息,然后git merge

为什么不需要指定远程仓库?

因为Git把远程地址存到了配置文件的remote.origin.url

git 也可以是服务器的地址:

git clone ssh://服务器/账号/仓库名称

git push ssh://服务器仓库地址 master:master

Git Tag

轻量级标签

git tag tagname 8c2940

git tag

标签对象

git tag -a stable-2 8c315325 -m "stable 2"

签名标签

签名标签可以让提交和标签更加完整可信

git ignore

.gitignore 来忽略不需要提交的文件

1
2
3
*.html
!foo.html #foo.html例外
*.[oa] #忽略所有.o .a

重置

git reset --hard HEAD^ 回到上次提交的状态

git checkout -- hello.rb 恢复一个文件

git revert HEAD 撤销最近的一次提交

建设私有仓库

ssh

可以导出一个裸仓库,然后用scp命令拷贝到服务器上

1
2
git clone --bare /home/user/myrepo/.git /tmp/myrepo.git
scp -r /tmp/myrepo.git myserver.com:/opt/git/myrepo.git

对于其他人来说,直接

git clone myserver:com:/opt/git/myrepo.git