1.安装git
从Git官网直接下载安装程序,
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功
设置一下帐号和邮箱
$ git config --global user.name trump
$ git config --global user.email [email protected]
–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置
2. 创建版本库
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
通过git init命令把这个目录变成Git可以管理的仓库
细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见
文件格式:
所有的版本控制系统,其实只能跟踪文本文件的改动,编码强烈建议使用标准的UTF-8编码
3.编写文本文件(带有版本控制系统)
- 在前面创建好版本库的目录下新建txt文件…编写内容
- git add readme.txt
- git commit -m “介绍”
4.如何进行版本控制
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改
git diff
这个命令可以让我们查看本地的txt文件里面的内容和上一次add&commit的txt文件里面的内容的差异
总结:
1,要随时掌握工作区的状态,使用git status命令。
2,如果git status告诉你有文件被修改过,用git diff可以查看修改内容
5.如何版本控制2
0.前提是add/commit过
1.git log查看版本控制系统变更的历史记录,git log命令显示从最近到最远的提交日志
升级版
$ git log --pretty=oneline
显示:从最近到之前的commit id(版本号)以及修改备注文字
2.回退到上一个版本
git reset --hard Head~
3.回退到指定版本
git reset --hard 版本号(commit id) 写出开头即可
4.穿越到以前了.找不到后面的操作记录了怎么办
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
git reflog
6.如何版本控制3 工作区 缓存区
定义
工作区Working Directory: 文件夹
版本库Repository: git的版本库
版本库包括
1)stage(index)暂存区
2)分支(master)
3)指针(Head)
git add命令实际上就是把要提交的所有修改放到暂存区(Stage),
然后,执行git commit就可以一次性把暂存区的所有修改提交到分支
执行commit以后
$ git status 查看工作区是否干净!
7.如何版本控制4 管理修改
结果是只提交第一次修改
正确的做法是
git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交
git diff HEAD -- readme.txt
查看工作区和版本库里面最新版本的区别
git diff
查看工作区和暂存区(stage)的区别
git diff : 对比工作区(未 git add)和暂存区(git add 之后)
git diff --cached: 对比暂存区(git add 之后)和版本库(git commit 之后)
git diff HEAD: 对比工作区(未 git add)和版本库(git commit 之后)
8.如何版本控制5 撤销修改
git checkout -- file
可以丢弃工作区的修改:
1,是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态
2,是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态
针对第二种情况,如果想恢复,则使用下方代码
git reset HEAD <file>
说明:可以把暂存区的修改撤销掉(unstage),重新放回工作区
然后,stage暂存区就干净了,工作区有修改
$ git checkout -- readme.txt
丢弃工作区的修改
git status
clean清静了
9.如何版本控制9 删除
删除文件方法1:直接手动删除
删除文件方法2:代码删除
$ rm test.txt
上面的代码删除了工作区的文件
接着
$ git status
查看版本库和工作区的差异
然后有两种选择:
选择一:从版本库删除文件
$ git rm test.txt
$ git commit -m "remove test.txt"
选择二:从版本上恢复工作区的文件
$ git checkout -- test.txt
10.远程仓库
Git是分布式版本控制系统
GitHub提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,设置如下:
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
情境1:github远程仓库创建
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库…在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库learngit
情景2:把本地的git库关联github远程仓库
$ git remote add origin [email protected]:lcd0815/learngit.git
情景3:第一次把本地库的所有内容推送到远程库上
$ git push -u origin master
git push 实际上是把当前分支master推送到远程
-u代表master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
情景4:第二次和之后把本地库的所有内容推送到远程库上
$ git push origin master
备注:当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告.yes即可
情景5:创建远程仓库
首先,登陆GitHub,创建一个新的仓库,名字叫gitskills
勾选Initialize this repository with a README
情景6:远程仓库克隆(拷贝)到本地仓库
$ git clone [email protected]:lcd0815/gitskills.git
注意的是:GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
11.分支管理
原理:
git checkout -b dev
相当于
$ git branch dev//创建分支
$ git checkout dev//切换分支
命令git branch
列出所有分支,当前分支前面加上*
这时候如果切换分支master
$ git checkout master
这时候工作区readme.txt的内容会回退一步
接着我们把dev分支的工作成果合并到master分支上(前提是切换到了Master):
$ git merge dev
然后删除dev分支
$ git branch -d dev
然后查看分支
git branch
就只剩下一个主分支了
总结:
12 分支管理的冲突解决
当两个分支对文本都有
修改…add…commit
合并的时候就不能快速合并,会提示冲突
必须手动修改文本以后,再次add/commit
git log --graph
查看分支的合并情况 图像模式
确认合并无误以后,然后删除分支
git branch -d f1
13分支管理
普通合并后的历史有分支,能看出来曾经做过合并
$ git merge --no-ff -m "merge with no-ff" dev
fast forward合并就看不出来曾经做过合并
$ git merge dev
分支策略:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
14Bug分支
第一步
在master分支创建
并且add&commit
这一步相当于是在master创建一个稳定版本1.0的
第二步
$git checkout -b dev
新建并且切换分支
然后修改文本
然后新建文本
然后add新的这个horse.txt
git add horse.txt
查看git status
这时候boss要求去修改1.0的bug(bug101),但是2.0还没有开发好…这时候用到git stash(前提是wow.txt之前add了,horse也被add了)
第三步
回到master的1.0版本,这时候工作区是这样的
然后创建临时分支bug101去修改bug
增加内容
add&commit(在bug101分支)
切换回主分支master,完成合并,删除分支
这时候文本是这样的:
第四步
切换回dev分支,继续开发2.0
这时候文本是这样的:
使用命令:git status 干净的
输入命令:
恢复有两种方法:
1,用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
2,用git stash pop,恢复的同时把stash内容也删了
我们用第二种
神奇的事情发生了.工作区变成这样了:
再次使用
没内容了.这下子就可以继续开发wow.txt和horse.txt的2.0版本了
如果开发好了.一起add添加&提交commit就可以了
第五步:最后修改工作区
全部搞定!!!
15.分支删除
当新建分支;add;commit以后
git checkout -b feature-vulcan
git add vulcan.py
git commit -m "add feature vulcan"
如果没有合并
则不能普通删除
$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
必须强行删除
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).
16.多人协作
查看本地对应的远程库
$ git remote
详细查看本地对应的远程库
$ git remote -v
修改远程仓库
git remote rm origin
git remote add origin [url]
本地分支推送到远程
$ git push origin master
$ git push origin dev
另外一台电脑上首先克隆这个repo
默认情况下,你的小伙伴只能看到本地的master分支
要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
如果两个人都对同一个远程push了
推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
远程分支到本地分支
$ git branch --set-upstream-to=origin/dev dev
$ git pull
手动解决
提交
push
17.Rebase变基
当你发现本地比远程快2个commit.想要push,却不行.因为有人提交了
你就要先pull,把远程的拖到本地,然后合并提交
git log查看,很乱
解决方案:
git rebase
再次使用git log查看
分支变成了直线,rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了
最后,通过push操作把本地分支推送到远程
别人的建议是
选择变基还是合并,看具体需求,你只是想要一个清晰,明了的历史,并不关系历史的具体来源,你可以首选变基,但是如果你想比较清楚地了解项目不同阶段的原始历史,你可以选择直接合并。
一个原则说到最后,还有一个不得不提的原则:永远不要对已经推到主干分支服务器或者团队其他成员的提交进行变基,我们选择变基还是合并的范围应该在自己当前工作范围内。
18标签管理
创建标签步骤:
1.git checkout master
2.git tag v1.0(默认标签打在最新的commit上的
找到历史提交的commit id的命令
$ git log --pretty=oneline --abbrev-commit
3.$ git tag v0.9 f52c633
给指定的commit打标签
4.$ git tag
查看标签
5.git show <tagname>
查看标签信息
6.$ git tag -a v0.1 -m "version 0.1 released" 1094adb
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
7.git show <tagname>
可以看到说明文字
8.$ git tag -d v0.1
删除标签
9.$ git push origin v1.0
推送某个标签到远程
10.$ git push origin --tags
一次性推送全部尚未推送到远程的本地标签
11.如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除$ git tag -d v0.9$ git tag -d v0.9
然后,从远程删除。删除命令也是push$ git push origin :refs/tags/v0.9
19 自定义git 忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
git status就看不到了
最后一步就是把.gitignore也提交到Git,就完成了!