您的位置:首页 > 产品设计 > UI/UE

git guide

2015-07-31 17:04 411 查看
一直想记下俩git的操作,有时候总是忘记,前面写过一点点,这次有忘记了,决定写个详细点儿的,有的是自己亲手试过,有的是网络经验:)

在学校的时候,为了防止本机磁盘坏了或者不同人之间共享一份代码(版本管理),使用SVN,搭建SVN服务器,创建repository,

本机使用命令行或者eclipse(大部分时候我是写java)的SVN插件,一般也不用多个branch或者tag的时候,把repository里面的code check out 出来,

本地修改之后commit就提交到repo中,要拉到最新版本的时候就update to HEAD就可以了,使用起来比较清楚明白,本地没有“Repo”的概念,属于集中

式的版本控制与管理,而git是分布式的(也可以集中式的方式),在mark link中有讲解,同时也有git和svn的区别,这里分布式指的是每个使用者本地也有repo的概念,commit的时候,是先commit到本地,然后push到remote的repo中,拉取代码的时候,也是先pull,然后执行本地的merge(或者rebase)。因此使用svn的

时候我们知道,一旦连不上remote repo就无法使用了,而git大部分的操作都可以在本地完成(可以使用命令行,或者eclipse 配egit,挺容易明白的)。

BTW, git 既然是分布式的,我们平时使用git的时候也需要从一个“集中式”的地方拉code,然后push上去,为什么呢,这样做是为了方便,实际上,使用git时,

每个人的本地都是完整的代码库,两个人之间可以传递修改的文件,但是很多人一起协作一个大项目又不在一个局域网的时候,建立一个“服务节点”更加方便而已。

其实个人觉得,也不能把集中式的说的一无是处,从理解起来而言,集中式更容易理解,本人用过IBM的RTC,其实觉得挺好用的,基本自己就能摸索明白,

也挺人性化的。:)

如果使用过github的话,github网站可以看成一个“服务节点”,托管很多的项目,我们也可以把自己的项目放在上面,如果是公开的话不要钱,但是是私有项目,

则需要交钱,由于public的项目其他人也可以看见,为了不让其他人提交code把我们的库弄乱了,注册github账户之后,需要在自己的账户中配置ssh key(

在自己平时的开发机上,生成rsa的key,将public的key传到github上)

以下内容均学习自mark link并经过试验后记录:

安装好git之后,一般做个设置标明操作者的身份:

git config --global user.name xxx

git config --global user.email xxx

如果要创建自己的git库,选择一个目录比如 "/home/xxx/mygit", 进入目录执行git init即可,要添加一个文件readme.txt, 执行

1. git add readme.txt即可(readme.txt要放到mygit目录下,add操作将readme.txt放到仓库中),这只是放到仓库中,和“提交到”仓库不一样,提交需要执行:

2. git commit -m 'commnet', git是一次性将add进来的文件都提交,add可以分批执行。

git add是将工作区(mygit)的文件加到版本库中的“暂存区”,git commit则是将“暂存区”的文件加到“具体分支”,一般git init之后默认创建master branch。

需要指出的是,git commit只会“暂存区”的东西合并到具体分支,不会将工作区的内容合并,因此,git add之后,再次修改文件,此时执行git commit的话,

只会将第一次git add的变化合并到分支

使用git commit -a 表示将所有的改动commit, --amend表示将上次commit的结果修改掉(使用git log看的时候,上次commit被替换掉)

3. 修改文件readme.txt, 使用git status, 可以发现readme.txt modified了

4. git diff readme.txt, 查看具体的修改

5. 修改后需要再次执行git add 和git commit,然后git status查看没有新的变化“nothing to commit”

6. 使用git log查看commit的历史记录(commit时候的 -m 参数的作用就出来了,告诉你这次提交进行了什么事情)

7. 要回退到某个版本,使用git  reset  --hard head^ (上上个版本是head^^, 更多的是head~number), 实际上,git 的head是一个指针,每一次commit都有一个

commit id,git reset --hard commit-id即可以到执行的版本,往回退或者前进,来回滑动,如果退到很早的版本,又想回到未来的某个版本,

使用git reflog查看reset的记录都在,执行git reset --hard xxx即可

8. 使用git status查看到“暂存区”有了新的文件时,可以使用git reset HEAD test.txt,将test.txt从“暂存区”移除出去

9. 如果修改了一个工作区中的文件,想要丢弃修改怎么办呢? git checkout -- test.txt,丢弃修改,或者我之前简略的文章中有提到使用git checkout . 丢弃所有修改,

对文件而言,git checkout -- xxx或者git checkout. 是将“版本库”中的文件替换工作区的文件

10. 使用git rm test.txt,之后git commit -m xxx ,真正的从版本库中删除文件,可以和git add的过程对应

11. 如果已经有一个远程的git库(比如在github上),将本地(刚才使用git init创建的)git库和远程的(空的情况下)关联起来,使用:

关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git, 关联之后第一次提交使用git push -u origin master,


此后提交只要git push origin master即可


12. 如果先有本地的库,之后想放到远程的托管,使用11中的关联比较方便的,但如果现有的远程库,比如openstack中,想从远端拉下code进行开发,就使用

git clone将代码拉下来即可

前面的操作都是针对master分支,git在分支管理上也十分强大,通过改变HEAD的指针,在不同的branch之间切换,速度很快:

1. 创建一个新的分支, git checkout -b dev, (相当于执行git branch dev先创建分支, 再执行git checkout dev,切换分支)

2 . 使用git branch查看分支情况,在ubuntu下,当前分支会标记星号

3.在branch上开发之后,可以通过git merge合并分支(比如当前在master分支下,执行git merge dev, dev分支的内容则会合并到master分支中),之后可以

通过 git branch -d dev(删除dev分支)

4.如果3中进行merge时候,返现冲突,两个branch都对内容产生了影响,此时在master在再次对冲突文件执行git add 和git commit,冲突解决,想看冲突的情况可以使用

“git log --graph --pretty=oneline --abbrev-commit“查看形象的冲突合并过程。

5. fast forward 和非fast forward: 所谓使用fast forward是指master分支和dev分支合并后,删除dev分支,则dev分支的信息也将丢失, 而非fast forward则会

保留dev的分支信息(具体参见mark link的图),命令为:git merge --no-ff -m "no-ff merge" dev; master分支一般是发布版本,平时候都是在别的branch上开发,

比如openstack里面,我们在kilo和juno的分支上开发,但到了具体的时间点会merge到master上发布。

6.在openstack中,要有人提交bug,我们要修复bug的时候,使用git checkout -b bug-xxx ,创建bug分支,然后修改,git add, git commit, 之后使用git merge --no-ff

合并分支;如果在修bug之前,自己工作区修改了一部分,又不想丢弃,怎么办呢,使用git stash保存工作区,bug完成后继续工作,查看stash内容:

git stash list, 可以看到”stash@{0}: WIP on master: 7d25773 modify test“,
4000

这时使用git stash apply stash@{0},回复工作区即可,删除stash 则用git stash drop完成,或者回复时候使用git stash pop即可

7.前面说了merge之后,删除dev分支,使用git branch -d dev即可,不过对于还没有merge的分支,使用git branch -D dev即可

8.使用git remote -v 查看远程分支内容, 要想对远程的某一个分支进行开发,先在本地创建和远程对应的分支:

git checkout -b branch-name origin/branch-name,将本地分支和远程关联起来:
git branch --set-upstream branch-name origin/branch-name


9.tag, 可以理解为一个快照,和HEAD不同的是,tag是不可以移动的,使用git tag name,创建一个标签,默认是对HEAD创建,要想对某次commit之后的

状态创建标签[code]git tag -a <tagname> -m "xxx"
commit_id, 可以用PGP的私钥签名一个标签(安装gpg):
git tag -s <tagname> -m "xxx"
commit_id.

10.至于git的删除以及remote端的删除,我基本上用不上,在mark link中有讲解

11. 如果要建立自己的分支,在github上fork一个项目,然后这个项目就在自己的repo下面,我们可以进行修改,而直接给github上的项目(比如openstack的)

上传自己的修改是不行的,除非你有权限

12. 搭建自己的git server, mark link中也有讲解

mark link:
http://blog.csdn.net/huacuilaifa/article/details/19124635 http://www.cnblogs.com/qinfengxiaoyue/p/3450194.html
git 教程
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/ http://www.cnblogs.com/lwzz/archive/2013/02/23/2921426.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: