频道栏目
首页 > 资讯 > 其他 > 正文

Git&Github学习笔记

16-07-14        来源:[db:作者]  
收藏   我要投稿

感想:以前学习了好几次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://TerenceJing@github.com’:******

推送成功;

从现在起,只要本地做了提交,就可以通过命令:git push origin master 把本地master分支的最新修改推送至github。

此刻,我拥有了真正的分布式版本库,有点按耐不住的激动!

 

第一次使用clone或者push命令的时候,会认证指纹,并且添加到远程信任列表当中

退出masterBranches

 

使用ssh协议

在本地创建ssh key,然后在远程Github上面创建ssh key,生成识别指纹,这样在推动提交进度的时候,Github就可以识别出来这是你自己推送的内容,而非别人推送的。

使用命令:ssh –keygen–t rsa –C “Terence_Jing@163.com“

创建了ssh key,生成了fingerprint指纹.

此时,在硬盘上生成了如下文件包:

 

然后点击.ssh文件,进入看到两个文件:id_rsa和id_rsa.pub,

从后缀名就可以看出前者是私密的,后者是共有的。

本地创建仓库 try ,并进入仓库初始化仓库:

 

在本地创建文件,并提交进度:

连接远程TerenceJing/try.git仓库

 

上图首次推送命令执行效果表示建立连接成功,并添加到了信任列表当中。

随后再次推送本地进度:直接使用 git push origin master(注意本地当前仓库,只将本地当前仓库推送到相应的远程仓库)

 

 

分支管理

有时候自己的任务没有完成,但是需要提交任务进度,不提交就会有丢失进度的风险,提交任务了但是自己的任务没有完成,别人看到不完整的任务会给别人带来不便。

此时,可以通过建立一个其他的分支类型来隐藏自己提交的不完整内容,别人只能看到master主分支上的任务,看不到新的分支下面的内容,等到任务完成后,可以通过将新分支合并到master主分支上,然后删除新分支即可。

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch

切换分支:git checkout

创建+切换分支:git checkout -b

合并某分支到当前分支:git merge

删除分支:git branch -d

 

 

手动解决分支冲突

返回上级目录: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 stash@{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一下

 

 

相关TAG标签
上一篇:SSM框架整合(下篇)
下一篇:hdu 5139 Formula(离线处理)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站