视频地址
git init 初始化git仓库
初始化最直接的效果就是创建了.git这个隐藏目录(以点开头的都是隐藏目录,要用ls -la查看)
pwd 查看当前路径
ll .git/ 查看这个隐藏目录
设置签名
如果有项目级别又有系统用户级别,那么项目级别的生效,不会用用户级别
:set nu 这个指令可以显示行号,说明在vim编辑器里面
git add good.txt
git status
git rm –cached good.txt(退回去)
git status
git commit
git log
git log --pretty=oneline 只查看一行日志
git log --oneline hash值 只显示一部分
git reflog 显示了我们到某一版本需要几步,能看到左右版本
git管理历史记录的时候有一个指针,指针的名字叫HEAD
后退
git reflog 使用git 命令进行操作的日志 包括当前步骤所在哪个版本(一个commit 产生一个版本, 指定版本回退只能回退到该commit) 以及操作的具体内容,这个能看到所有版本
版本回退后,仍然可以看到所有的版本记录 方便查看每个操作步骤所在的版本,可以根据版本号自由前进后退
git reset --hard 索引值 这样就能跳转到当前版本
cat good.txt 看一下当前版本的内容
git reflog
向前走
git reset --hard hash索引值
使用^只能回退
git log --oneline 以一行的方式显示所有版本
git reset --hard HEAD^ 向回退一步
tail -n 3 good.txt 显示这个文件的最后3行(这个数字可以改,想看几行把数字改成几)
git log --oneline 只能显示当前所在版本和当前版本之前的版本
git reflog 能看到所有版本 当前版本,和当前之前的版本,和比当前版本新的版本都能显示,
git reset --hard HEAD^^^ 回到三个版本之前(向后退几个版本就写几个^)
git reset --hard HEAD~3 后退三个版本(后退几个版本数字上面填写几)
git help 后可以加一个具体的参数,表示帮助命令,例如下面的:
git help reset 查看git的文档,这个文档是本地的文档
reset命令的三个参数对比
–soft参数 仅仅在本地库移动HEAD指针
–mixed参数 在本地库移动HEAD指针,重置缓存区
–hard参数 在本地库移动HEAD指针,重置缓存区,重置工作区
git reset --soft hash索引值 移动到制定版本
git reflog
cat good.txt
git status 命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。
git reset --hard HEAD 表示回退到当前版本,HEAD指向当前版本。如果你修改了一些代码,想去除,就可以用git reset --hard HEAD一次性去除。
git reflog
vim aaa.txt
新建aaa.txt 里面随便添加一些内容内容 aaa bbb
git add aaa.txt
git commit -m “new aaa.txt” aaa.txt
git status
rm aaa.txt 删除这个文件
ll 查看不到这个文件了
git status
git add aaa.txt
git status
git commit -m “delete aaa.txt” aaa.txt
git status
ll
git reflog 查看所有版本
git reset --hard hash上个版本的hash编码值 这样就回到没有删除aaa.txt的版本了
ll 又出现aaa.txt
该节总结:用切换到上一个旧版本的方法找回,删掉的文件
vim apple.txt 新建一个文件 里面随便写一些内容,然后:wq
ll 可以看到我们的这个文件
git add apple.txt 添加到缓存区
git commit -m “new apple.txt” apple.txt 添加到本地库
git reflog
有的时候我们删除的操作是
rm apple.txt
ll 查看不到了apple.txt了
git add apple.txt
git status
git reset --hard HEAD (git reseet --hard表示我们的缓存区和工作区都会被重置,都会被刷新,根据什么刷新呢,后面加上个HEAD,现在我们拿这个HEAD指针指向的版本,我觉得这个应该是当前版本,在这个版本上,这个apple.txt这个文件是存在的)
ll apple.txt文件又回来了
说来说去还是–hard这个参数的意思,它的意思是在我们本地库里面去移动指针,在暂存区里面去刷新,对我们的工作区也会刷新,暂存区和工作区都会刷新为我们指针指向的这个位置(版本),所以说我们没有提交到本地库,用这个–hard一样能找回来
前提:删除前,文件存在时的状态提交到了本地库.操作 git reset --hard[指针位置]
ll
git status
vim apple.txt 修改文件
:set nu 把文件前面加上行号
:wq 修改其中一行信息后保存退出
git diff apple.txt 这时候文件有了修改,我们就可以使用这个命令,讲工作区的文件和暂存区的文件进行比较
里面显示中灰色代表没有变化的行,红色代表我们删除的行,绿色代表我们添加的行 ;其实我们并没有删除行,而是在行后面加了新的内容,但是对于git来说,它是以行为单位进行管理的,所以是相当于删除了原来的行,再新建了一行
git apple.txt 提交到缓存区
git diff apple.txt 再进行比较 发现没有区别
git diff HEAD apple.txt 用指针指向我们本地库的当前版本,这样我们就又看到区别了,这个时候就是和我们本地库的某一个版本就行比较
git diff HEAD^ apple.txt 和某一个历史版本进行比较,讲工作区中的文件和本地库历史记录比较
git diff 文件名
git diff 本地库中历史版本 文件名
不带文件名比较多个文件
ll
vim good.txt 修改文件
:set nu 把文件标记上行号 第七行增加内容
:qw
git diff 因为先在我们的apple.txt的文件没有,所有显示的只是good.txt更改前后的差异
git diff HEAD 两个文件的差异都显示出来了,good.txt文件修改签后的差异 和apple.txt修改签后的差异,也就是说不指定文件名的时候,就可以比较当前工作区中的所有的文件
分支就是在版本控制过程中,使用多条线同时推进多个任务
master 版本库初始化好之后,本身就会有一个master分支,也可以叫做主干
feature_blue (想做一个蓝色皮肤的分支)分支喜欢用feature开头,分支开始的时候和master内容一样
feature_game (想做一个小游戏的分支)各个分支之间彼此独立,如果不做合并的话,他们互相之间是没有任何影响的,如果分支失败了,直接删掉重来就好了,对于主干没有任何影响,方便我们去试错,有些复杂的功能进行开发的时候,就需要我们进行尝试
如果分支开发好了,合并到主干上master上,这时候也就是我们版本的升级(例如1.0到2.0),(在我们合并分支后)我们主干运行的时候也有可能出现bug,出现bug的话,就需要我们及时的进行修复,我们修复bug往往会创建一个hot_fix这样一个分支(热修复,修复时服务器不停;修复时候服务器停掉,就是冷修复.我们线互联网项目基本上是24小时不停的),修复完,再合并回我们的主分支
分支的好处
1.同时并行推进多个功能开发,提高开发效率
2.各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响.失败的分支删除重新开始即可.
git status 能看到我们在哪个分支上面 现在显示的是我们在master分支上
git branch -v 查看所有分支 ,并且能看到当前所在的分支
git branch 分支名 这个可以创建分支
git branch hot_fix 创建hot_fix这个分支
git branch -v 现在查看就发现有两个分支了 前面带星号* 并且名字是绿色的,代表当前所在的分支
git checkout hot_fix 切换到hot_fix 分支,名字可以用tab键补全,可以用这个切换任何分支
git branch -v 查看所有分支,也能看到当前我们所在的分支,带星号的 名字是绿色的代表我们现在所在的分支,最下面一行很长的是目录,代表当前所在分支的具体位置
分支操作 | 代码 |
---|---|
创建分支 | git branch [分支名] (想一下hot_fix分支的例子) |
查看分支 | git branch -v |
切换分支 | git checkout [分支名] (可以想一下主分支的例子) |
合并分支 | 1.git checkout [被合并分支名] 2.git merge [有新内容的分支] |
冲突的表现 | <<<是当前分支的内容 , >>>是另一分支的内容 |
解决冲突 | 1.编辑文件,删除特殊符号,2.把文件修改到满意的程度,保存退出 3.git add[文件名] 4.git commit -m “日志信息”;注意:此时 commit 一定不能带具体文件名 |
git branch -v
ll
vim apple.txt
:set nu
修改第五行内容
git add apple.txt 提交到缓存区
git commit -m “test branch hot_fix” apple.txt 提交到本地库(-m “” 写的式提交时的备注信息)
git branch -v 刚开始的时候master和hot_fix是同步的,现在hot_fix向前推进了一个版本
合并分支,我们必须站在接受修改的那个分支上
git branch -v 现在有两个分支hot_fix分支和master分支,现在我们在master分支上,分支冲突的意思是.我们两个分支都修改同一个文件时,合并的时候就不知道是谁合并谁了,因为上一节的时候 我们的master分支是没有变的,变得值是hot_fix分支,所以合并的时候是hot_fix合并到master分支上(这是我对冲突的理解).
vim good.txt 修改master分支里面的good.txt文件
:set nu 显示文件的行号
修改第九行 加上edit by master
:wq
git add good.txt 添加到缓存区
git commit -m “test conflict” good.txt 添加到本地库
git branch -v 查看所有分支,能看到我们当前分支在master上,现在我们的master就比我们的hot_fix向前先走一步
git checkout hot_fix 切换到hot_fix分支上
vim good.txt 修改hot_fix分支里的good.txt文件
:set nu
也改第九行 加上edit by host_fix
:wq
git add good.txt 添加到暂存区
git commit -m “test conflict hot_fix” good.txt 提交到本地库
git branch -v 查看所有分支,并查看当前所在分支,当前分支在hot_fix分支上,这两个分支都做了修改,是同一个文件的同一行,有不同的内容
git merge master 把master分支上的内容合并到hot_fix分支上,合并失败 (hot_fix|MERGING) hot_fix在合并中
ll 查看文件 并没有产生新的文件,还是只有两个文件,apple.txt和good.txt
vim good.txt
:set nu
:wq 当我们把这个文件修改好后,写入退出
git status 出现下图
git add good.txt 提交到暂存区
git status 出现下图
下面有两条语句,一条是后面加文件名的(失败),一个是后面没有加文件名的(成功)
git status
1.svn集中式管理工具:增量式的版本控制,可以看作是一组是基本文件和每个文件随时间逐步累积的差异,能够很好的节约我们服务器的存储空间
2.git的文件管理机制:快照流,保存一个快照的索引,重复的文件会有指针指向之前的文件
3.git文件管理机制细节
git log 可以看到所有的commit,每个commit后面会对应一个hash值
github注册链接
要先申请邮箱,最好不要用qq和163等邮箱,建议申请阿里的邮箱
cd … 返回上一层目录
mkdir huashan 创建新的目录
cd huashan/ 进入这个目录,进入目录的时候,目录后面要加斜杠
git init 初始化
vim huashanjianfa.txt 新建这个文件
写入内容 华山剑法天下第一
:wq 保存退出
git add huashanjianfa.txt 提交到缓存区
git commit -m “test github” huashanjianfa.txt 添加到本地库
先登陆到我们的github上
我们也可以用码云来来管理我们的代码,创建远程库,步骤都差不多
git push origin master 推送 origin表示的是推送的仓库别名 master代表推送的分支是master
ll
cd …
mkdir huashan_lhuc 创建这个目录
cd huashan_lhuc 进入这个目录
git clone 远程库的地址
ll 查看,本地有了huashan/这个目录
cd huashan/ 进入这个目录
ll 能看到有huashanjianfa.txt这个文件,这就是从远程库中下载来的
ls -a 我们还会看到.git/ 这个隐藏目录, .git/这个目录代表不需要我们自己对本地库初始化了,它已经替我们初始化好了
git remote -v 别名也已经创建好了
现在令狐冲在本地已经把远程库clone好了,现在在本做修改然后提交到本地库是可以的
vim huashanjianfa.txt
:wq
git add huashanjianfa.txt
git commit -m “test push” huashanjianfa.txt
git push origin master 因为用的是https协议,没有用ssh,所以每次提到远程库都要登陆
因为现在令狐冲还不是团队成员,所以没有办法提交到远程库,必须要岳不群邀请他加入团队才可以
下面是邀请步骤
复制邀请的链接后,发送给要邀请的那个人
点击接受以后就变成了我们这个团队的成员
现在岳不群要拉取远程的库
pwd 查看我们现在 在哪个分支上
cd …/…/huashan 退出来进入huashan这个目录
ll
cat huashanjianfa.txt
远程库里是有两行内容的
git fetch origin master 把远程库的内容抓取过来,读操作
cat huashanjianfa.txt 内容并没有变化
git checkout origin/master 这样就能看到fetch下来的新内容
cat huashanjianfa.txt
git checkout master
cat huashanjianfa.txt
git merge origin/master 把远程的master合并到本地的master
cat huashanjianfa.txt 合并之后本地就有新的内容了
cd …/huashan_lhuc/huashan/
vim huashanjianfa.txt 修改文件
git commit -m “test ybuq pull” huashanjianfa.txt
git push origin master
cd …/…/huashan
ll
vim huashanjianfa.txt 看到的还是原来的内容
:q
git pull origin master 这个是只读的操作不需要登陆
cat huashanjianfa.txt 看一下文件的内容 出现心的内容了
当我们的操作的数据修改的比较简单的时候,不太会产生冲突的话,使用pull就可以,比较简介
如果我们为了保险,慎重起见,先用fetch抓取下来看一看,如果没有什么问题我们再合并的话, 那我们就拆开使用fetch+merge的方式.
如果岳不群和令狐冲都是改同一个文件的同一个位置,就会发生冲突,只有先推送的那个人能推送到远程库里面,后推送的那个人就推送不上去,他必须先拉取下来,然后再推送,拉取的时候有岳不群的内容有令狐冲自己的内容,这个时候git就不能替我们做决定了,必须我们自己去决定,这个时候就是冲突,下面是冲突过程的演示
现在我们在岳不群这边,我们现在对文件做一些修改
vim huashanjianfa.txt
:set nu 把文件加上行号
:wq
git commit -m “edit by ybuq” huashanjianfa.txt 提交到本地库
git push origin master 以岳不群的身份推送上去
推送完成
推送上来了
cd …
cd huashan_lhuc/ 换成令狐冲去登陆
ll
cd huashan/
ll
cd huashan/
ll
vim huashanjianfa.txt
他也去改第二行
:set nu
:qw
git commit -m “test conflict” huashanjianfa.txt 提交到本地库,这里提交到各自的本地库是没有问题的,但是现在我们的令狐冲版本,已经比我们远程库落后一个版本了
这个时候github就不接受令狐冲的推送了,它认为发生了新的情况,而你还不知道,你必须在这个最新的情况下再做出修改才可以,接下来我们推送一下
git push origin master
git pull origin master 先拿到这个远程的修改
我们现在就处于这个冲突的情况
vim huashanjianfa.txt 进入这个文件里面
:set nu
git add huashanjianfa.txt 添加到暂存区
git commit -m “resolve conflict” 解决冲突后的提交,后面是不能加文件名的
git status
git push origin master 推送到远程,到此推送就完成了
到页面上确认一下
以东方不败的省份gork一下
cd …
ll
cd …
ll
mkdir huashan_east
cd huahsan_east/
ll
git clone 东方不败的远程地址
ls -la 克隆下来了
cd huashan/ 进入这个目录里面
ls -la 可以看到,本地库也已经初始化好了
vim huashanjianfa.txt 东方不败添加新的内容
:set nu
:wq
git commit -m “kuihua” huashanjianfa.txt 提交到本地库
git push origin master 做推送(好像远程库内容修改了就要登陆账号,推送到远程库中就需要登陆账号)
已经推送上来了
上面的那些步骤是本地修改,然后推送到远程
现在我们要做Pull Request
可以隔空对话
点击Merge pull request 合并代码
填写日志信息,然后confirm merge 合并成功
cd …
pwd 查看当前在哪个分支上
cd…
cd huashan
ll
cat huashanjianfa.txt 这是岳不群这,还没有葵花宝典相关的内容
git pull origin master 拉取到本地,结束我们这个跨团队协作的过程
cat huashanjianfa.txt
cd ~ 先进入到用户的家目录
rm -r .ssh/ 把以前创建过的ssh目录删掉(没创建不用做这步)
ssh-keygen -t rsa -C 邮箱账号直接回车表示使用默认值
这样就生成了一个.ssh目录
cd .ssh/ 我们进入这个目录里面
ll 可以看到,里面有两个文件
cat id_rsa.pub 查看这个文件,并复制这个文件内容
测试一下
cd /d/workspaces/GitSpaceVideo/huashan 回到我们的工作区,作测试
vim huashanjianfa.txt 随便给我们这个文件做一下修改
git commit -m “test ssh login” huashanjianfa.txt
我们现在先不push
tig remote -v 现在我们这个push origin还是https这样的地址
git remote add origin_ssh ssh的地址 我们要新建一个远程地址的别名
ssh 这个别名创建好了
git push origin_ssh master
韩顺平Linux