之前用的SVN,VSS很习惯,这两天学习了git的使用,基本操作和思路上都差不多,git的本地库强大很多。
学习资料使用的是廖雪峰的wiki网站~
这里留下网址,讲的很明白http://www.liaoxuefeng.com/
常用命令:查看两个版本间的差异 git diff commit号1(前7位) commit号2(前7位) --stat
Git是干啥的,Git是分布式版本控制系统,git的强大,谁用谁知道。Windows下的开发的话很可能在用SVN,VSS等,但git是版本控制的归宿。
安装命令:sudo apt-get install git
安装的最后一步就是给自己所在的机器订一个git的标签:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
建立git库
git init //建立出来的配置文件等都放在了./git这个文件夹下。
基本操作
1.添加文件
git add readme.txt
git commit -m "这里是提交的说明,本次提交所做的操作" //提交修改,只有提交修改后,添加的文件才真正的进入git的管理。
一次commit可以对应多个add操作。
2.修改文件
修改已有文件的操作和添加文件是一样的。
git add + git commit
查看git的状态命令:
git status 和 git diff
3.删除文件
git rm test.txt
git commit -m "remove test.txt"
4.版本切换
git log //先用git log查看所有版本。
HEAD表示当前版本,HEAD^表示上个版本HEAD^^表示上上版本。
git reset --hard HEAD^ //表示回退到上个版本。
git reflog //如果再想回退回来,用reflog查找命令记录,找到对应的想回退版本的git的commit号,使用git reset --hard commit_id(这个commit_id只输入前几位就行)。
5.管理修改
修改文件后先add一次,add之后对这个文件的修改需要再次add,之后再commit,Commit前的add会覆盖之前的所有add,也就是管理修改了。
6.撤销修改
git checkout --file //这里有两个-,意思是说把file这个文件回退到上次add或者commit的操作时,丢弃所有之后的操作。
如果之前已经add过了的话,就无法用checkout撤销修改了,需要用git reset HEAD file把文件从暂存区回退到本地,然后执行上面的git checkout - - file就可以了。
远程服务
上述内容是git的基本操作,下面讲如何使用远程服务。
为了使用github仓库,需要先有个帐号。
第1步:创建SSH Key
ssh-keygen -t rsa -C "XXX@example.com" 这里使用你的邮箱。
一路回车后,会在主目录下生成.ssh目录,生成id_rsa和id_rsa.pub两个文件。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面。
点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
点击add key,到这里就成功的在github上签到留名了。
下面把本地的git仓库同步到远程的github上,这样别人和自己都能访问修改
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库。
在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。
现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:
git remote add origin git@github.com:XXX/learngit.git 这里的XXX就是你的git帐号名。
下一步,就可以把本地库的所有内容推送到远程库上:
git push -u origin master
第一次推送master分支时,加上-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
之后的同步使用git push origin master就可以了。
这种先有本地的方式算是逆序,下面讲正常的顺序,库上先有内容,如何在本地克隆。
假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
首先,登陆GitHub,创建一个新的仓库,名字叫gitskills。
我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件。
现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:
git clone git@github.com:XXX/gitskills.git
如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。
分支管理
分支管理的目的在于,在开发过程中不影响上一版本代码的中间代码提交。
创建分支:git checkout -b dev
git checkout -b dev这条语句包含了两层意思。
1,git branch dev,建立分支。
2,git checkout dev,切换分支。
查看分支
git branch //git branch命令会列出所有分支,当前分支前面会标一个*号。
在分支上操作,修改文件,add,commit之后,回到master分支上看,文件的修改并没有影响到master主分支。
现在把dev分支的修改merge到主分支上。
git merge dev ->git merge命令用于合并指定分支到当前分支。
合并完成后,如果想的话,删除dev分支。
git branch -d dev
有分支就会有冲突,冲突的识别的方法就是,在执行merge的时候系统会在冲突文件中用<<<<<<<,=======,>>>>>>>标记出不同分支的冲突部分。
手动修改冲突后add,commit即可合并这两个冲突分支。
如果两个分支没有冲突,也可以用git merge --no-ff -m "merge with no-ff" dev来合并分支,这样历史记录里会记录有分支合并。
在实际开发中,master一般仅仅发版本用,平时不会在上面操作,而是在dev上操作,各个协作者应该都有属于自己的分支,然后都合并到dev上,发版本前再merge到master上即可。
存档当前分支
在项目中有时候工作进行到一半,就需要对应紧急bug,这时候需要把当前正在进行的工作封存一下。
git stash //可以把当前工作现场“储藏”起来。
之后就可以去别的分支工作,提交bug什么的,当紧急工作对应完毕,就可以切回来继续工作了。
切回git checkout dev后
git stash list //查看冰封的现场。
恢复现场有两种方法:
1.git stash apply 这个方法只恢复进度,但在stash里还保存着进度,删除进度信息需要用git stash drop。
2.git stash pop 这个不仅恢复了进度,同时也顺便把stash里的进度信息一并删除掉。
如果想强行丢弃一个还没有merge的分支,使用:
git branch -D <name>
查看远程库
git remote -v
git branch -a //查看所有的远程分支
git branch -vv//查看本地和远程分支的链接关系
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上。
git push origin master
git push origin dev
多人协作时,大家都会往master和dev分支上推送各自的修改,其他协作者创建dev分支时使用命令:
git checkout -b dev origin/dev.
git branch --set-upstream dev origin/dev 指定本地dev分支与远程origin/dev分支的链接。
git pull //把最新的代码从远程库拉取下来。
如果本地的分支同pull下来的有冲突,则需要在本地手动解决后再add commit push。
删除远程分支
git push origin --delete aaaaa
aaaaa为不想要的分支名称
把本地的库push到远程的库中:
$ git push origin test:master // 提交本地test分支作为远程的master分支
$ git push origin test:test // 提交本地test分支作为远程的test分支
标签的使用
虽然git的每次提交都有git号,但是一堆奇形怪状的数字字母组合没法满足人类的审美及体验。
git tag v1.0 ->默认的是在当前分支的最新提交的commit上打tag。
git tag v0.9 24313(commit号)这个是给之前的commit打tag用的。
git tag //查看tag。
git show v0.9 //查看标签对应的commit信息。
git tag -a v0.1 -m "version 0.1 released" 2455521 //还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字。
git tag -s v0.2 -m "signed version 0.2 released" fec145a //还可以通过-s用私钥签名一个标签,签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错。
git tag -d v0.1 //标签的删除。
git push origin <tagname>//推送某个标签到远程。
git push origin - -tags//一次性推送全部尚未推送到远程的本地标签。
git tag -d v0.9//如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除,然后,从远程删除。删除命令也是push,但是格式如下:
git push origin :refs/tags/v0.9
忽略特殊文件,假如工作路径下有些不想让git管理的文件,不推送,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
给Git配置好别名,就可以输入命令时偷个懒。
git config --global alias.st status 把status改成st。
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" 把查看log改的人性化。
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中