文章目录
1、概述
1.1、为什么学习git?
- 第一份和第二份工作的时候,公司主要使用的是svn,也没有详细去学习,接触的知识点也比较少,日常工作主要是在ide工具中配置svn插件,在ide中拉取,提交代码。
- 第三份工作公司使用git来做项目的版本控制,遇到的问题比较多,如下:
1、比如错误提交了新开发的功能到master分支上了,如何回退?
2、分支开发完成时,如何合并?
(一般的cd平台会进行合并,如果出现冲突,则需要手工合并)
3、如何创建新项目到gitlab上?
4、如何忽略某些文件?比如idea自动生成的文件,编译生成的target目录
如上这些问题,让我在工作中有种疲于奔命的感觉,面向搜索引擎解决问题,工作效率严重下降
1.2、怎么学习git?
对于怎么学习git,现在的我不太好说,因为现在我只是入门了git的基本操作,借用极客时间中王宝令老师的话,先纵观全局,在细致入微。
1、首先你需要了解git是什么,简单对比svn,了解它们的差异
2、在以一个helloworld案例入门,了解git的基本操作,并且对比到工作中的场景
3、熟悉入门案例相关的命令
4、构造各种工作中可能会遇到的场景,并进行解决和总结
5、了解git的实现原理
.....
另外我学习的git的资料:
1、掘金的git小册
2、廖雪峰的git文章
3、git的官方文档
1.3、git是什么?
1.4、为什么选择git,对比SVN?选择的考量点?
2、Git工作场景梳理
2.1、如何保存你的密码?
二种方式:
1、http方式
设置 git config --global credential.helper 'store'
2、SSH方式
在本地生成公钥,并将公钥在远程仓库上进行配置即可(具体可以百度)
2.1、创建新工程
以下2种方式都需要你先在运程仓库上创建新仓库(如果远程仓库已存在,则不需要操作)
2.1.1、本地创建新工程,push到远程仓库
1、在本地创建新工程
git init git-study
2、关联到远程仓库
git remote add origin https://gitee.com/zxwx/git-study.git/
使用git remote -v 查看远程仓库信息
3、提交代码到远程仓库
git add .
git commit -m 'init project'
git push
2.1.2、远程仓库新建工程,拉取远程仓库分支到本地
git的追踪存储模型
2.2、多人协作
当需要迭代一个版本的时候,大部分情况是多人协作开发,先是对照需求文档,进行设计和分工,当我们都对同一个分支进行拉取和提交代码时,就需要进行merge,当我们都对某个部分进行的修改提交,就会产生冲突,这时就会产生merge冲突,需要手工去解决冲突,再次提交
2.2.1、merge和冲突
对于merge,我现在想到2个工作中经常遇到的场景:
1、同一个分支去做pull的时候
1、git pull (git pull == git fetch + git merge)
2、当出现冲突时,
git status(查看冲突的文件)
3、进行手工解决冲突
4、执行git add . 、 git commit 、 git push
2、分支开发完成,merge到主master分支上
1、git checkout master
2、git merge test (test为我的分支名)
3、如果出现冲突,则手工解决冲突
4、git push (将merge后的内容提交到master分支上)
2.3、如何撤销
如下是我罗列的需要撤销的三种比较宽泛的情况:
1、从暂存区撤销
git reset HEAD 文件名
或者
git reset HEAD . (.表示所有文件)
2、从本地仓库撤销
当你在本地提交了一个commit,你想执行撤销,执行如下步骤
1、git log 查看commit提交日志
2、git reset --hard HEAD^ (HEAD^只HEAD指向的上一个commit,HEAD^^表示HEAD指向的上二个commit)
3、查看版本是否被回退
git log (查看提交日志是否少一个)
git status( 查看暂存区文件变化是否被清空)
cat 文件名 (查看文件内容是否被回退)
备注:git reset HEAD^ 有三个options,
1、--soft 表示回退到最后一次commit操作之前
2、--mixed 表示回退到最后一次add之前的状态
3、--hard 表示回退到倒数第二次commit之后的状态
3、从远程仓库撤销
目前我在网上学习到的都是先在本地一次回滚或者撤销操作后,在push到远程仓库
主要涉及到的命令为git reset 和 git revert 这两个命令
对于这两个命令的差别,可以参考博客:https://segmentfault.com/a/1190000019153248
比如当前存在commitA -> commitB -> commitC
git reset --hard commitB 会将版本回退到commitB,则commitC的修改则丢失。
git revert commitB 则只会将commitB这次提交的修改进行撤回,commitC依旧存在
备注:如果commitB和commitC都对A文件做了修改,那么执行git revert commitB是不是会出现冲突呢?
答案是:会,需要手动解决冲突