Git学习笔记
文章目录
- Git学习笔记
-
- 前言
- Git简介
- Git安装
- 创建版本库
- 时光机穿梭
-
- 查看、上传修改的文件
- 版本回退
- 工作区和缓存区
- 管理修改
- 撤销修改
- 删除文件
- 远程仓库
- 分支管理
-
- 创建与合并分支
- 解决冲突
- 分支管理策略
- BUG分支
- 参考文档
前言
Git的强大早就有所耳闻,现在很多企业公司都用到了git做版本的控制,目前在云歌实习,云歌提交项目的方式是用git指令向coding提交自己负责的部分,目前已经提交过两个实习培训实操:数据的加密解密、模拟微信抢红包,由于之前没有用过git,都是锦荣帮我操作的,现在我需要开始学习git的基本指令,了解企业中是如何开发的,这次的笔记也是第一次使用typora工具记录markdown格式的笔记,以前都是用word去写笔记的,现在就踏出面向工作面向好的学习状态的第一步。这次看的教程是黄胤推给我的廖雪峰老师的教程。
Git简介
Git是目前世界上最先进的分布式版本控制系统,Git可以记录每次版本的改动,出现问题可以退回到原来的版本。
Git安装
这次是在windows下安装Git,之前在学习mmall的时候有在自己的电脑上安装过,安装还挺简单的,就是下载安装程序,然后安装一下,在自己电脑上右键弄出gitbash,在弹窗里面设置一些参数,比如你的git账户的名字呀、git使用的邮箱啊之类的。
其中有用到指令:
$ git config --global user.name "Your Name" $ git config --global user.email "[email protected]"
注意使用了 –global 之后,电脑上所有的Git仓库都会会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址,不加global就可以。
创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
windows下的操作方法:
- 创建一个专门用来存放仓库(文件)的文件夹;
- 在这个文件夹内点右键,点击Gitbash;
- 在客户端中输入git init,会在这个文件夹内自动生成一个.git的文件;
- 我们将我们要上传的文件放在这个目录下;
- 使用
或者git add .
,将需要上传的文件添加进git的本地仓库中;git add 文件名字.拓展名
- 使用
将git本地仓库的文件提交进版本仓库中;git commit -m 提交描述
为什么Git添加文件需要
add
,
commit
一共两步呢?因为
commit
可以一次提交很多文件,所以你可以多次
add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
时光机穿梭
查看、上传修改的文件
我们会经常修改库中的文件,如何向版本仓库更新我们的文件呢?
- 先修改文件;
- 运行
查看当前工作库的状态,并且会显示哪些文件被修改过了,一般这个时候会显示Changes not staged for commit:xxx,是因为文件没有用git status
保存进本地仓库;git add
- 如果我们要查看文件的修改内容,可以使用
指令来查看;git diff 文件名.拓展名
- 我们确认了修改内容后,使用
将修改的文件添加到本地仓库中;git add
- 再执行
查看一下当前本地仓库的状态,此时显示Changes to be committed:xxx,这里和步骤2不同的点在于步骤4已经使用了git status
;git add
- 使用
将本地仓库的文件提交到版本仓库;git commit
- 再使用
查看当前仓库的状态,如果显示nothing to commit, working tree clean就说明现在已经没有什么需要提交了;git status
版本回退
当我们不断的进行文件的更新、上传之后,git会自动保存每一次更改的版本记录,所以我们可能会用到以下指令:
-
来打印目前所有的版本信息,包括版本号、作者、时间;git log
-
指令来回到上一个版本,HEAD后面每一个代表往前的一个版本如HEAD^代表回到往前的两个版本;$ git reset --hard HEAD^
-
指令来回到对应的版本号,1094a是版本号$ git reset --hard 1094a
-
可以找到所有操作,操作里面可以看到你曾经对哪些版本做过操作,就不怕从1版本回到2版本后,由于git reflog
打印不出1版本的版本号,而无法再回到1版本了;git log
工作区和缓存区
工作区:我们创建的文件夹就是工作区
缓存区:缓存区是我们
git init
后**.git**文件里面的东西,用来存放变化
所以流程大概就是:
Created with Raphaël 2.2.0
开始
向工作区添加文件或者修改文件
用git add .将文件添加到缓存区中
用git commit -m将缓存区的文件上传至版本库中
End
管理修改
当我们修改文件上传时,会遇见这样的情况,我们第一次修改了文件,并且将它提交到缓存区,但是没有commit,这个时候,我们对文件做了第二次修改,第二次修改完之后,我们没有进行add操作,而是直接commit,我们会发现commit上去的只有第一次的修改,第二次是没有被修改的,这是缓存机制导致的,git管理的是修改,我们修改后一定要add进缓存区,再commit。
撤销修改
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
,这里分两种情况:git checkout -- file
- 一种是自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
,就回到了场景1,第二步按场景1操作。git reset HEAD <file>
- 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
我们有时候会将工作区的文件删除,删除后我们用
git status
指令去查看,会提示删除了文件,我们可能会有两种操作:
- 将版本库里的文件也一起删了,那就用命令
删掉,并且git rm
提交一下;git commit -m
- 我们是误删,那么我们要将版本库里的文件恢复到工作区,我们用
指令就好了;git checkout
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
远程仓库
现在已经了解到,我是有自己的本地仓库的,我猜测缓存区和本地仓库都保存在我的**.git**文件中,那么如何将本地仓库和远程仓库连接起来呢?
本地仓库和远程仓库进行铺路:
- 我们先创建自己的github账号,要记住注册用的用户名和邮箱;
- 在本地打开gitbash,输入
,创建对应邮箱的ssh公钥私钥,它默认位置保存在我的电脑->用户->.ssh文件中;$ ssh-keygen -t rsa -C "[email protected]"
- 我们将公钥复制,粘贴到github个人设置里的ssh属性中,注意不能将私钥填进去,私钥只能自己知道;
完成上面的操作,我们已经将本地仓库和远程仓库铺好路了!
将本地仓库的文件传到远程仓库上去:
- 先在github上创建一个项目,会生成项目的ssh链接地址;
- 在我们本地仓库运行gitbash;
- 输入
,注意origin后面的链接地址是我们项目的,而origin是可以改的,只是远程仓库的名字,这一步就是将我们的本地仓库和远程仓库连接起来;$ git remote add origin [email protected]:michaelliao/learngit.git
- 使用
指令,把本地库的内容推送到远程,用$ git push -u origin master
命令,实际上是把当前分支git push
推送到远程。master
由于这是我们第一次推送,远程库是空的,我们第一次推送
master
分支时,加上了
-u
参数,Git不但会把本地的
master
分支内容推送的远程新的
master
分支,还会把本地的
master
分支和远程的
master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
以后我们要再做推送,就直接输入
$ git push origin master
从远程仓库克隆文件到本地仓库
- 首先先在github上面创建一个有初始README文件的项目;
- 在电脑中创建一个文件夹用来做存储;
- 在这个文件夹内输入指令
;$ git clone [email protected]:715220395/gitskill.git
注意:在github上我们创建一个没有自带README文件的项目时,它的ssh链接会直接显示在上面,当我们创建有初始文件的项目或者去已经有文件的项目clone时,需要点击一下Clone or download按钮,Git支持多种协议,包括
https
,但通过
ssh
支持的原生
git
协议速度最快。
分支管理
啥是分支啊?我的理解,分支就是属于我自己的一条路,我走我自己的路,我走完了我的路程,我就可以合并到主路上去。
创建与合并分支
注意:由于这里分支非常重要,而廖老师的讲解非常详细,这里就直接搬过来了,一定要全部理解!
一开始的时候,
master
分支是一条线,Git用
master
指向最新的提交,再用
HEAD
指向
master
,就能确定当前分支,以及当前分支的提交点:

每次提交,
master
分支都会向前移动一步,这样,随着你不断提交,
master
分支的线也越来越长。
当我们创建新的分支,例如
dev
时,Git新建了一个指针叫
dev
,指向
master
相同的提交,再把
HEAD
指向
dev
,就表示当前分支在
dev
上:
你看,Git创建一个分支很快,因为除了增加一个
dev
指针,改改
HEAD
的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对
dev
分支了,比如新提交一次后,
dev
指针往前移动一步,而
master
指针不变:
假如我们在
dev
上的工作完成了,就可以把
dev
合并到
master
上。Git怎么合并呢?最简单的方法,就是直接把
master
指向
dev
的当前提交,就完成了合并:
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除
dev
分支。删除
dev
分支就是把
dev
指针给删掉,删掉后,我们就剩下了一条
master
分支:
步骤如下:
- 创建新分支dev
;$ git checkout -b dev
- 然后,用
命令查看当前分支,git branch
命令会列出所有分支,当前分支前面会标一个git branch
号。;*
- 我们再dev分支上进行修改,add,commit操作;
- 切换回master分支,
;$ git checkout master
- 把dev分支的工作成果合并到master分支上,
;$ git merge dev
- 合并完成后,就可以放心地删除
分支了,dev
;$ git branch -d dev
- 再重新查看一下分支,
;git branch
这里创建、切换分支的时候可以使用:
创建分支:
$ git switch -c dev
切换分支:
$ git switch master
解决冲突
冲突是这么发生的:
当我们创建新分支dev,在dev分支下对文件进行更改、add、提交后,切换回master分支,这时我们不着急将master分支与dev分支合并,而是在master分支下也对文件进行更改、add、提交,之后我们再将master分支与dev分支合并,会出现如图这种情况:
master分支和dev分支都有提交,并不是master分支落后于dev分支,这时就出现冲突了,因为两个分支都有改变,那么到底要用谁的呢?所以这时我们需要手动处理冲突,就是打开被修改的文件,根据git的提示去删除一些东西,保留我们需要的东西,这个时候再将文件add、commit;
分支管理策略
当我们合并分支时,一般默认是用Fast forward模式,这种模式很快,但是如果我们删除了分支,那么会丢失分支信息,所以我们要换一种模式进行合并——
--no-ff
,我们使用这种模式,Git会在merge的时候生成一个新的commit,这种模式的指令是:
$ git merge --no-ff -m "merge with no-ff" dev
,dev是分支名字,我们将master分支与dev分支合并,由于这种模式生成了一个新的commit,所以我们使用了-m “提交信息”,接下来我们可以使用指令
git log --graph --pretty=oneline --abbrev-commit
来查看分支历史。
BUG分支
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当我在分支上工作,忽然接到一个修复bug的请求,那么我要放下手中的工作,去创建分支并且修复bug,使用
git stash
可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
bug修复完成后,使用
git stash list
命令查看原来存储的工作现场,恢复工作现场有两个办法:
- 用
恢复,但是恢复后,stash内容并不删除,你需要用git stash apply
来删除;git stash drop
- 用
,恢复的同时把stash内容也删了git stash pop
在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。那怎么在dev分支上修复同样的bug?
在master分支上修复的bug,想要合并到当前dev分支,可以用
git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
参考文档
廖雪峰的Git教程