感想:以前学习了好几次Git,看了几个人的技术文档,可是总不会用,当然也有可能是因为我太笨,很多人把Git教程写的很高深,一堆代码看的我头晕,遇到简单的查查还能行,可是随着越来越深,积累的问题越来越多,最后学习总是中断,不得不从头来,来回折腾,真是恼火,恼怒自己的智商不够!
后来一个朋友向我推荐了廖老师的Git学习方法,我一学习,就停不下来了,在研期间任务多,利用空闲时间花了一个礼拜总算学完,认识也比较深刻,学习了廖老师的Git教程,总体感觉廖老师很走心,也很感谢朋友老葛送给我的硬货。
1 Git配置+初始化repository
下载Git,安装;
Git配置
初始化仓库
cd learngit (进入目录)
git init (初始化一个仓库;)
2 Git操作
Git添加文件
使用纯文本编辑,标准编码UTP-8;
将文件放到learngit文件夹下面或者子文件夹下面;
执行如下命令:
git add 文件名
git commit –m “文件更改说明”
git status (查看仓库的当前状态)
当前提示的修改状态表示文件被修改过了,但是文件修改状态还未被提交!需要再次执行git add 文件名
查看版本回退状态
查询历史快照,截取历史状态;要查询git日志
命令:git log
此命令显示最近到最远的提交日志状态
如果想要控制日志更好的显示
命令:git log –pretty=oneline
回退显示以前的历史数据
命令:git reset –hard HEAD^
显示当前版本内容
命令:cat first.txt
利用版本号返回到后面的某个版本
命令:git reset –hard23cc951
版本号可以不用写全,只需要前几位就可以了,系统会自动查找!
显示所有回退状态:
git reflog
工作区(WorkingDirectory)---就像learngit 文件夹就是一个工作区;
版本库(Repository)---比如说learngit下面的一个隐藏目录.git,里面存储了很多东西,如stage(暂存区),第一个分支(master),以及master的一个指针HEAD;
Git比其他版本控制系统设计的更加优秀,因为Git跟踪涉并管理的是修改,而非文件。
Git保存修改只是将暂存区里的记录,也就是指保存add命令后的版本,不能保存add前的内容;每次修改不把修改后的内容add到暂存区,即使执行了git commit命令,也不能保存这次修改,只能保存以前的修改;commit命令只能保存暂存区stage里面的版本;
撤销修改
1.在工作区做了部分修改,发现修改的地方是有病的,这时候需要撤销修改
命令:gitcheckout second.txt
撤销的是add命令之前的修改;也就是添加到stage暂存区之前在工作区内的修改;
2.在工作区做了修改,然后提交到暂存区了,想要撤销修改
命令:git resetHEAD second.txt
命令:gitcheckout second.txt
第一个命令是将文件从暂存区会退到工作区,第二个命令是将工作区的修改内容撤销掉;
3.如果修改部分从工作区添加到暂存区,又从暂存区保存到版本区(Repository),但是并未推送到远程;此时可通过回退版本来撤销修改!
命令:git reset –hardHEAD^
此命令是将HEAD指针指向前一个版本;
撤销删除
命令:rmsecond.txt
可以删除工作区的文件,但是版本区的仍然存在;
也可以直接在工作区点击删除文件;
两个选择:
1. 删除版本区的版本;
命令:git rmsecond.txt
2.通过版本区回复工作区误删的文件;
命令:gitcheckout second.txt
3 远程库Github
添加远程库
添加远程仓库推送本地进度,既可以使用ssh协议,也可以使用https协议,前者推送较快,后者推送相对较慢,一般使用ssh协议。
登录github账户:TerenceJing
进入桌面端master分支:cd learngit
使用https协议
本地仓库远程添加命令:gitremote add origin https://github name
可将本地仓库master分支下的仓库推送出去
orign:远程库
推送本地仓库:gitpush –u origin master
随后输入远程github账户名:Username for ‘https://github.com’:TerenceJing
输入远程github账户命令:Password for’https://[email protected]’:******
推送成功;
从现在起,只要本地做了提交,就可以通过命令:git push origin master 把本地master分支的最新修改推送至github。
此刻,我拥有了真正的分布式版本库,有点按耐不住的激动!
第一次使用clone或者push命令的时候,会认证指纹,并且添加到远程信任列表当中
退出masterBranches
使用ssh协议
在本地创建ssh key,然后在远程Github上面创建ssh key,生成识别指纹,这样在推动提交进度的时候,Github就可以识别出来这是你自己推送的内容,而非别人推送的。
使用命令:ssh –keygen–t rsa –C “[email protected]“
创建了ssh key,生成了fingerprint指纹.
此时,在硬盘上生成了如下文件包:
然后点击.ssh文件,进入看到两个文件:id_rsa和id_rsa.pub,
从后缀名就可以看出前者是私密的,后者是共有的。
本地创建仓库 try ,并进入仓库初始化仓库:
在本地创建文件,并提交进度:
连接远程TerenceJing/try.git仓库
上图首次推送命令执行效果表示建立连接成功,并添加到了信任列表当中。
随后再次推送本地进度:直接使用 git push origin master(注意本地当前仓库,只将本地当前仓库推送到相应的远程仓库)
分支管理
有时候自己的任务没有完成,但是需要提交任务进度,不提交就会有丢失进度的风险,提交任务了但是自己的任务没有完成,别人看到不完整的任务会给别人带来不便。
此时,可以通过建立一个其他的分支类型来隐藏自己提交的不完整内容,别人只能看到master主分支上的任务,看不到新的分支下面的内容,等到任务完成后,可以通过将新分支合并到master主分支上,然后删除新分支即可。
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
手动解决分支冲突
返回上级目录:cd ..
创建新的分支feature1,在master分支和feature各做修改,提交进度;
变成如下进度所示:
查看状态,告知我们有文件未合并
查看文件内容,会看到有两个分支都做了修改。
此时解决冲突的办法就是手动修改文本内容,替换为:
Creating a new branch is quick and simple.
然后重新提交,并删除featrure1分支;
查看分支合并图:gitlog --graph
合并现状:
分支管理策略
多分支管理,禁用Fast forward合并模式,不要将master主分支移动,或许存在多个分支,此时可以多分支在某一个时间点合并,然后将合并后的分支合并到主分支上,起到了多人并发工作的作用。
命令:git merge –no-ff–m “merge no ff” dev
禁用Fast forward模式,用普通模式合并,在主分支上重新添加一个修改进度名,并将dev分支合并到主分支master上。
禁用Fast forward模式;可以建立多个分支dev、feature1、featrue2……,多个员工使用多个分支,将自己的分支合并到dev分支上,完成一定任务时在合并到master主分支上,发布出去。
分支Bug
情景:主分支master,在利用次分支dev完成任务,需要两个小时才能完成这个模块,然后才能提交,但是主分支上有一个Bug需要修复(一般改动都是在建立的次分支上完成,然后合并到主分支),并且比较紧急,要立刻完成。此时dev分支上的任务并没有完成,如果想要返回到主分支master修复Bug,就需要保存dev的工作现场,等到修复完Bug后返回dev分支上,回复工作现场,接着工作完成任务。
在dev分支上保存工作现场命令:git stash
在dev上查看工作现场命令:git stash list
在dev上回复工作现场
命令1:git stash apply
回复后,stash内的内容并不删除用命令: git stash drop删除保存记录;
命令2:git stashpop
恢复工作现场的同时,删除了保存记录;
如果有多个工作现场,可以恢复指定工作现场
使用命令:git stash apply [email protected]{0}
然后,可以在dev分支上接着工作;
强行删除未合并分支
情景:在工作中,可能需要增加新的功能,但是又不希望增加新功能的实验性质代码打乱原有的代码,这时,就需要建立新的分支Feature1,但是准备合并的分支的时候这个功能突然不需要了,此时需要删除这个废弃的功能分支Feature1.
此时执行删除命令:git branch –d feature1;出现错误:提示有分支为合并,如果要删除分支,需要执行强制删除命令:git branch –D feature1;
多人协作模式branches
有时候不需要全部推送,只需要推送自己负责的分支上的修改任务,可以采用推送指定分支的方法完成;
查看远程分支:git remote
查看远程分支详细信息,可以看到能够被抓去的分支和推送的分支:git remote –v
推送分支命令:git push origin master/dev
针对上述命令,远程仓库默认名称是origin,所以使用 git pushorigin master推送主分支。
有时候因为自己的工作分支对应的远程分支有所更新,当自己想要推送的时候推送不成功,此时,需要将远程分支重新抓取下来,和本地分支合并,解决矛盾冲突,然后将本地分支推送到远程对应的分支;
多人协作模式:
1. 首先,可以试图用git push origin branch-name
推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
上述提示推送失败,是应为本地dev分支没有指定到远程origin仓库下的dev分支链接上,用如下命令设置链接:git branch –-set-upstreamdev origin/dev
在执行git pull,则执行成功:
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突或者解决掉冲突后,再用git push origin branch-name
推送就能成功!
在本地创建和远程分支对应的分支,分支名称最好一致,使用命令:
git branch –b branch-nameorigin/branch-name
4 标签
有时候需要发布特定的版本,因为提交的进度指针太多,需要制定一个特定的快照标签来标识它,就相当于指定到commit后的某个进度的指针,但是这个指针是不可移动的,是特定的;
打标签
切换到分支上打标签:
git checkout master
git tag v1.0
创建的标签指定到了当前分支的HEAD上了。
查看标签信息:git show tag-name
注意:标签是按照字母排序的,不是按照时间顺序排序的。
为标签加说明,使其易读性提高:git tag –a v0.1 –m ”说明内容”提交地址
用-s为私钥签名加上标签(PGP签名):
$ git tag –s v0.2 ”signed version 0.2 released ” 2b0126c
操作标签
标签推送:git pushv0.1
一次性推送全部标签: gitpush origin --tags
删除标签:git tag –dv0.5
删除的是本地的标签;
如果标签已经推送到远程,先要删除本地标签,然后删除远程标签;
删除远程标签的命令也是push,格式:git push origin :refs/tags/v0.5
5 自定义配置
自定义Git
有时候为了让个别地方更加醒目的显示,加大识别度,提高工作效率,我们会设置一些其他的配置项,比如设置颜色:git config –global color.ui true
忽略特殊文件
有的文件更改后不需要提交,但是系统会一直提示跟踪警告,如果不想让其提示,这时需要建立一个忽略目录,将不需要提交的文件的名称填写进入就可以了,Git就会忽略这些文件了。
忽略文件规则:
? 忽略操作系统自动生成的文件,比如缩略图等;
? 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
? 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
步骤:
需要现在根目录下生成.gitignore,用于存储需要忽略的文件的名称
1.点击版本库try,生成Git Bash命令窗口
创建.gitingore文件输入命令:touch .gitignore
2. 查看哪些未提交文件:git status
三个红色的文件:
其中.example.txt.swp文件是我前面对example.txt文件执行vi命令的时候成的文件,不能提交,但是一直会显示未提交;
.gitignore文件是刚刚生成用于存储忽略文件名的文件;
webConfig.txt文件是我建立的一个用于存储配置内容的文件;
这三个文件都需要忽略掉。
3. 然后用记事本打开.gitignore文件,在里面输入webConfig.txt和 .example.txt.swp,保存,此时再查看状态:
剩下自身没有忽略掉,试着输入本身名称,看能不能忽略掉:
查看状态:
由此可知,.gitignore对自身亦可忽略!
4. 将忽略文件推送到远程,远程仓库就可以获取相应的忽略配置;
特殊情况
第一种情况:
有时候,需要对忽略掉的文件提交:git add webConfig.txt
但是,此时提价不了,系统会提示 Use –f if you really want to add them.
此时,可以通过-f强制添加到Git
$: git add –f webConfig.txt
第二种情况:有时候,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用gitcheck-ignore命令检查
命令:gitcheck-ignore –v webConfig.txt
可以看到Git提示该文件在忽略文件.gitingore的第三行,因此可以凭借此找到该文件修改。
命令别名
给账户或者某个版本库下的命令根据自己的喜好设置别名,用起来更加方便,更加easy;
状态别名:gitconfig –gloabal alias.st status
切换别名:gitconfig –gloabal alias.co checkout
提交别名:gitconfig –gloabal alias.ci commit
分支别名:gitconfig –gloabal alias.br branch
撤销别名:gitconfig –gloabal alias.unstage ‘reset HEAD’
提交日志别名:gitconfig –gloabal alias.last ‘lag-1’ (显示最近一次的提交)
牛逼配置:
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"
注意:配置文件的时候加入gloabal,表示全局变量,对状态电脑上的这个用户所有版本库都起作用,如果不加,则只对当前版本库起作用。
查看当前版本下的配置命令:try仓库下执行:cat .git/config
查看用户的命令配置:在用户根目录下执行:cat .gitconfig
此时可以看到alias 后面的命令配置项。
这两个文件都是隐藏起来的,配置的时候也可以直接修改文件里面的内容,如果修改错误,可以删除配置文件,重新配置;
6 通过Github参与开源项目
Github一般叫做开源协作社区,大家都可以参与开源项目
关注某个名气较高,内容丰富的Github账户,如果想要参与一个项目,为这个项目贡献自己的代码,或者单单查看分析别人的项目,从这个项目代码中获取自己的经验,丰富自己。
那么需要你首先要进入别人的账户下的版本库,fork别人仓库里的代码,克隆到本地,分析修改,add & commit;
然后,通过本地仓库push到远程,如果想要贡献自己的代码,可以pull request name’s Github repository,如果主人心情好,觉得你的代码有价值,就会采纳合并到项目开分支上,如果心情不好,不想采纳,谁也没得办法!
关注别人的账户:follow一下
关注别人的仓库:start一下
克隆别人的仓库:fork一下