Git是目前世界上最先进的分布式版本控制系统。
网上看到一个做的比较好的教程https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
下载直接去官网下在对应系统的Git就好了。
创建版本库:
首先,选择一个合适的地方,创建一个空目录:
$ mkdir learngit //mkdir命令用于创建目录
$ cd learngit //cd命令用于切换到指定目录
$ pwd //pwd命令用于显示当前目录。
其次,通过git init
命令把这个目录变成Git可以管理的仓库:
$ git init
把文件添加到版本库:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
$ git add <file> //add将文件移入临时stage
$ git commit -m <message> //commit将stage内所有文件移入master
撤销修改:
$ git checkout -- <file> //直接丢弃工作区的修改,回到修改前
$ git reset HEAD <file> //若以将工作区的文件修改并add到暂存区,需要先使用此命令回到add前的状态,再使用上条命令。
查看状态:
$ git status //status命令用于查看当前状态
$ git diff //diff命令用于查看当前具体修改值
$ git log //log命令显示从最近到最远的提交日志
$ git reflog //reflog命令查看命令历史
$ cat <file> //cat命令查看仓库内文件内容
版本退回:
$ git reset --hard HEAD^ //上一个版本写HEAD^,上上一个版本写HEAD^^,往上100个版本写成HEAD~100。
$ git reset --hard commit_id //commit_id为使用log查看某一版本的commit值,只写前几位即可
删除文件:
先删除工作区内文件
$ rm <file>
再处理版本库里的文件
$ git rm <file> //确定需要删除,则将版本库内文件删除
$ git checkout -- <file> //若发现工作区内文件不需要删除,用版本库里的版本替换工作区的版本
远程仓库:
GitHub网站提供Git仓库托管服务,你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com" //在用户主目录里找到私钥id_rsa和公钥id_rsa.pub两个文件
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面。然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容。
第3步:创建一个新的仓库,登陆GitHub,在右上角点击“new repository”按钮。然后,在Repository name填入learngit
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。
第4步:目前,在GitHub上的这个learngit
仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
$ git remote add origin git@github.com:xxxx/learngit.git //具体按你们自己的来写
$ git push -u origin master //由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master
分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
以上过程容易出问题,可参考https://blog.youkuaiyun.com/jingtingfengguo/article/details/51892864
第5步:将仓库保存到本地,
$ git clone git@github.com:michaelliao/gitskills.git //填写自己的地址
分支管理:
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。
团队合作的分支看起来就像这样:
首先,我们创建dev
分支,然后切换到dev
分支:
$ git branch dev //创建分支:git branch <name>
$ git checkout dev //切换分支:git checkout <name>
$ git checkout -b dev //git checkout命令加上-b参数表示创建并切换,相当于以上两条命令
然后,用git branch
命令查看当前分支:
$ git branch
修改文件后,dev
分支的工作完成,我们就可以切换回master
分支:
$ git checkout master
现在,我们把dev
分支的工作成果合并到master
分支上:
$ git merge dev
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
合并的过程也可能会出现冲突,解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
$ git log --graph //用git log --graph命令可以看到分支合并图
保存现场:
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
Feature分支:
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
$ git checkout -b feature-vulcan
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
$ git branch -D feature-vulcan
多人协作的工作模式:
-
首先,可以试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
$ git remote -v //查看远程库信息
$ git push origin branch-name //从本地推送分支
$ git pull //抓取远程的新提交试图合并
$ git checkout -b branch-name origin/branch-name //在本地创建和远程分支对应的分支
$ git branch --set-upstream branch-name origin/branch-name //建立本地分支和远程分支的关联
rebase操作:
$ git rebase
rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。
标签管理:
创建标签
在Git中打标签非常简单,首先,切换到需要打标签的分支上,然后,敲命令git tag <name>
就可以打一个新标签:
$ git tag //命令git tag查看所有标签
$ git tag v1.0 //命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id
$ git tag -a v0.1 -m "version 0.1 released" 1094adb //可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git show <tagname> //标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息
操作标签
$ git tag -d v0.1 //删除本地标签
$ git push origin v1.0 //要推送某个标签到远程,使用命令git push origin <tagname>
$ git push origin --tags //一次性推送全部尚未推送到远程的本地标签
$ git push origin :refs/tags/<tagname> //删除一个远程标签