Git你真的Get到了吗?

写在前面:

进入公司开发,学到的东西很多。各种各样的技术数不胜数,但作为一名“菜鸟”还是得把基础打好尽量往深了学,毕竟根深而枝叶茂呀。今天那就先来说说Git。原因大致可分为如下几点。

1.之前学校里自学过GIt,但困于理论没有实际项目中使用过…..

2.发现公司里很多干了好几年的前端和后端的前辈们对Git不是很熟悉,只知道常用的几个命令…

3.Git目前在大型团队软件开发中用的还是比较多的,各大公司招聘中要求应聘者须熟练掌握Git或SVN等版本控制工具的使用…

4.留作自己日后技术参考,时间长了回过头来看看具体是怎么实现的…

5.记录的过程就是成长的过程。若能帮助屏幕前的你,那就再好不过了…

[参考资料]

https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000

Ps:在大学空余时间就是跟着廖雪峰老师的文章一步步来学习git的,起初就抱着玩玩看看的心态在学,今天看个一节两节,时间长了就像追剧一样,停不下来了,而且廖老师写的不错,认真学习其实是不难的。建议初学者按照文章中的介绍对照着案例一步步在自己电脑上敲一敲,敲的多了,自然而然就熟悉了,到后面实际工作中,会发现用的比较多的也就那几个命令,但作为学习还是得按部就班系统完整的学习里面的知识。

[我的笔记]

链接:

https://pan.baidu.com/s/1GBHgz19jmQD4G8HMjgo8pA 提取码:3n2l

Ps: 这是我之前学习做的笔记(里面也有git的安装包哈需要的朋友可以下载),但那时候没有很好的规划排版,看上去有点乱,下面的内容都是经过排版整理发布的,看上去比较有序,如果看不懂对里面的内容不明白的,建议可以直接去廖老师的官网学习哦。如果您是初学者,建议您也能做个学习笔记哈。作为过来人,发现还是挺有效果的,虽然时间长了,有一些具体命令语法想不起来了,但只要回过头稍微在看看,便能马上知道,俗话说的好,好记性不如烂笔头,加油!

常用命令:

mkdir:        XX (创建一个空目录 XX指目录名)

pwd:         显示当前目录的路径。

git init          把当前的目录变成可以管理的git仓库,生成隐藏.git文件。

git add XX       把xx文件添加到暂存区去。

git commit –m “XX”  提交文件 –m 后面的是注释。

git status        查看仓库状态

git diff  XX      查看XX文件修改了哪些内容

git log          查看历史记录

git reset  --hard HEAD^ 或者 git reset  --hard HEAD~ 回退到上一个版本(如果想回退到100个版本,使用git reset –hard HEAD~100 )

cat XX         查看XX文件内容

git reflog       查看历史记录的版本号id

git checkout -- XX  把XX文件在工作区的修改全部撤销。

git rm XX          删除XX文件

git remote add origin https://github.com/tugenhua0707/testgit 关联一个远程库

git push –u(第一次用-u 以后不需要) origin master 把当前master分支推送到远程库

git clone https://github.com/tugenhua0707/testgit  从远程库中克隆

git checkout –b dev  创建dev分支并切换到dev分支上

git branch  查看当前所有的分支

git checkout master     切换回master分支

git merge dev        在当前的分支上合并dev分支

git branch –d dev     删除dev分支

git branch name      创建分支

git stash     把当前的工作隐藏起来 等以后恢复现场后继续工作

git stash list     查看所有被隐藏的文件列表

git stash apply     恢复被隐藏的文件,但是内容不删除

git stash drop     删除文件

git stash pop     恢复文件的同时 也删除文件

git remote     查看远程库的信息

git remote –v     查看远程库的详细信息

git push origin master  Git会把master分支推送到远程库对应的远程分支上

目录结构:

都是干货:      

一、定义

Git版本控制系统是一个分布式的系统,是用来保存工程源代码历史状态的命令行工具。

考点:SVN与GIT的最主要的区别?(面试时回答个大概就行 不用刻意背诵 重在理解)

答:①SVN是集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。①Git是分布式版本控制系统根本没有中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

和集中式版本控制系统相比,②分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而②集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

二、下载与安装

https://blog.csdn.net/huangqqdy/article/details/83032408

git config --global user.name

git config --global user.email

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

Ps:此用户名和邮箱是git提交代码时用来显示你身份和联系方式的,并不是github用户名和邮

1.创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

git init              把当前的目录变成可以管理的git仓库,生成隐藏.git文件。

l  第一步把文件添加到版本库

git add  XX           先把xx文件添加到暂存区。

l  第二步把文件提交到仓库:

git commit –m “XX”   提交文件 –m 后面的是注释。

2.常用的命令

 git status   可以让我们时刻掌握仓库当前的状态 

 git diff <file>                查看XX文件修改了哪些内容 

三、时光机穿梭

1.版本回退

 git log          显示从最近到最远的提交日志  

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数

git log --pretty=oneline  

 HEAD 在Git中,用HEAD表示当前版本                                        

上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

git reset --hard 版本号              回退到指定的版本  

 cat <file>                                 查看XX文件内容    

 git reflog                        查看历史记录的版本号id 

  • 小结

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本

2.工作区和暂存区

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

版本库:

git init               把当前的目录变成可以管理的git仓库,生成隐藏.git文件。

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

Ps:暂存区和版本库含义必须掌握理清楚 对理解后面的合并分支很有必

3.管理修改

为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。

我们前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

Ps:意思就是说,你修改东西后git add--->git commit才会把你修改的东西提交到分支上。你git add之后如果再去修改东西且修改完了没有git add这一步,那么git commit不会对你第二次修改的东西进行提交,提交的还是你第一次git add修改的内容。

git diff HEAD -- <file>命令    可以查看工作区和版本库里面最新版本的区别

4.撤销修改

git checkout -- <file> 丢弃工作区的修改

--很重要,没有--,就变成了“切换到另一个分支”的命令

把readme.txt文件在工作区的修改全部撤销:分两种情况

①自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态

②已经添加到暂存区后,又作了修改

git reset HEAD <file>       可以把暂存区的修改撤销掉(unstage),重新放回工作区

Ps: git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。

考点:git reset --hard 版本号 和 git reset Head <file>两者有啥不同?

答:git reset –hard 版本号 回退版本 git reset Head <file> 回退到工作区 丢弃暂存区的修改。

考点:git checkout -- <file>和git reset HEAD <file>有什么区别?

答:前者丢弃的是工作区的修改 后者是丢弃暂存区的修改回退到工作区

总结:

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>回退到工作区,就回到了场景1,第二步按场景1操作

5.删除文件

git rm <file>                                          删除XX文件

Ps: 从来没有被添加到版本库就被删除的文件,是无法恢复的!

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

①现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

现在,文件就从版本库中被删除了。

②删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

git checkout -- file丢弃工作区的修改 --很重要,没有--,就变成了“切换到另一个分支”的命令

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

四、远程仓库

1.实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

在继续阅读后续内容前,请自行注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

第1步:创建SSH Key。

ssh-keygen -t rsa -C "最早你设置的邮箱地址"           创建SSH Key

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

cd ~/.ssh 快捷键

$ pwd 就知道主目录的路径了

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

2.添加远程库

在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

git remote add origin 网址 关联一个远程库

SSH警告

当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.


RSA key fingerprint is xx.xx.xx.xx.xx.


Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

Warning: Permanently added 'github.com' (RSA) to thelistof known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。

3.推送

git push –u(第一次用-u 以后不需要) origin master 把当前master分支推送到远程库

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。关联后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

-u

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

4.克隆

git clone git@github.com:DayRed/gitskills.git     从远程库中克隆

考点:git clone时给出的地址https和ssh两种有什么区别?

答:默认的git://使用ssh, 使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

五、分支管理

1.创建与合并分支

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

首先,我们创建dev分支,然后切换到dev分支:

git checkout –b dev   创建dev分支 并切换到dev分支上

然后,用git branch                  命令查看当前分支     

git branch命令会列出所有分支,当前分支前面会标一个*号。

现在,dev分支的工作完成,我们就可以切换回master分支

git checkout 分支名 切换分支

因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

现在,我们把dev分支的工作成果合并到master分支上:

git merge dev     在当前的分支上合并dev分支

合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

合并完成后,就可以放心地删除dev分支了:

git branch –d dev 删除dev分支

2.解决冲突

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

master分支和feature1分支各自都分别有新的提交,变成了这样:

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:

git status也可以告诉我们冲突的文件:

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

用git log --graph命令可以看到分支合并图。

git log --graph --pretty=oneline --abbrev-commit 分支的合并情况

3.分支管理策略

Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

要强制禁用Fast forward模式,Git就要在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

--no-ff参数,表示禁用Fast forward模式

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

考点:git merge 和 git merge --no-ff –m”描述”有什么区别?

答:git merge --no-ff能看出来曾经做过合并,而git merge使用的是fast forward合并就看不出曾经合并过

4.Bug分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

git stash                  把当前的工作隐藏起来 等以后恢复现场后继续工作

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

回到dev分支继续干活了!

工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:

git stash list                  查看所有被隐藏的文件列表

工作现场还在,Git把stash内容在某个地方了,但是需要恢复一下,有两个办法:

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要 用git stash drop来删除;

git stash apply 恢复被隐藏的文件,但是内容不删除

git stash drop 删除文件

另一种方式是用git stash pop,恢复的同时把stash内容也删了:

git stash pop 恢复文件的同时 也删除文件

git stash apply stash@{0} 恢复指定的stash

Ps: 同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。

为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支。

git cherry-pick 4c805e2   复制一个特定的提交到当前分支

5.Feature分支

销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。

git branch –D feature-vulcan 强行删除

6.多人协作

远程仓库的默认名称是origin。

gir remote 查看远程库的信息

gir remote –v 显示更详细的信息

推送

git push origin master   git会把master分支推送到远程库对应的远程分支上

git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支

git branch--set-upstream-to<branch-name> origin/<branch-name> 建立本地分支和远程分支的关联

7.Rebase

Ps:写的很好 可以参照https://blog.csdn.net/laxian2009/article/details/50593898

让 git 的历史记录变得很繁琐,要如何做呢?可以使用 rebase !

比较下 merge 和 rebase 之后的状态图,我们可以发现 master的 fix 被接到 dev 的后面,并且没有多出一个 merge 信 息。这样 commit 信息是不是简洁了很多?

git rebase命令 把分叉的提交变成直线

考点:git merge 和 git rebase的区别?

答:merge结果能够体现出时间线 rebase看起来简

六、标签管理

tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起

考点:标签和分支的区别?

答:分支可以移动,标签不能移

1.创建标签

git tag <name> 就可以打一个新标签,默认标签是打在最新提交的commit上的。

git tag 查看所有标签

git tag <name> commit id 历史提交的commit id,然后打上就可以了

git show <tagName> 查看标签信息

git tag –a “标签名” –m”说明文字” 版本号 创建带有说明的标签,用-a指定标签名,-m指定说明文字:

2.操作标签

git tag –d <tagName> 删除标签

git push origin <tagname> 推送某个标签到远程

git push origin –tags 一次性推送全部尚未推送到远程的本地标签

git push origin :refs/tags/<tagname> 可以删除一个远程标签

七、使用GitHub

考点:git pull 和 git fetch的区别?

答:git fetch不会进行合并执行后需要手动执行git merge合并分支,而git pull拉取远程分之后直接与本地分支进行合并。git pull = git fetch + git merg

八、使用码云

git remote add 远程主机名 远程仓库地址           关联远程库

git remote rm 远程主机名               删除远程库

git remote –v                                查看远程库详情

九、自定义Git

1.忽略特殊文件

2.配置别名

3.搭建Git服务器

https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664

没了。。。

把那些个常用命令给整明白就OK了,不看注解一眼看过去就知道这个命令是干什么的就行了,重要的是实际操作,请关注下一篇文章《Git在Idea中的使用》

晚安。今晚的雨好大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值