git和github的基本使用(1)
简介
- svn是集中式版本控制,git是分布式版本控制
- 为什么需要版本控制?
- 版本控制,记录某个历史的状态,然后根据某个历史状态进行处理,比如回退某个版本;
- 团队协作时,可以使用版本控制来记录不同人对文件的操作
- 集中式版本控制:文件和版本信息是存储在服务端,如果服务端宕机的话会出现历史数据丢失的问题(即单点故障问题)
- 分布式版本控制:本地、服务器都可以记录版本历史,可以避免单点故障问题。
团队内部协作
- 项目经理在”代码托管中心”(比如:github)中创建一个仓库,然后将自己本机的仓库push过去
- 程序员就可以通过”代码托管中心”获取仓库中的代码、然后提交自己的代码(不过这个过程需要项目经理授权才可以操作)
- 项目经理和其他程序员可以通过”代码托管中心”获取仓库中的代码
跨团队协作
项目经理安排了一项内容给程序员A,但是程序员A不知道如何处理,想找程序员B帮忙,程序员B则需要先复制项目(fork)、然后下拉到本地(clone)、然后提交自己的代码(push)、然后通过“远程仓库”的pull request给项目经理的仓库,项目经理对提交的代码进行合并,然后项目经理程序员A就可以通过pull下拉代码。比如:linux系统开源,如果使用过程中遇到问题可以向项目提供修复的代码,然后等待项目审核人进行审核
git相关命令
本地库初始化
git init
- 生成
.git
目录,记录本地库的相关信息,不要动
本地库配置
作用:配置开发人员的身份信息,方便在后续向“代码管理中心”提交内容时记录谁去提交
局部配置
仅当前项目有效
配置用户名和email信息
git config user.name maomao1
git config user.email maomao1@qq.com
查看配置
# 方式1
cat .git/config
# 方式2:git config --get name值
git config --get user.name
全局配置
为本机进行配置
配置用户名和email信息
git config --global user.name maomao2
git config --global user.email maomao2@qq.com
查看配置
cat ~/.gitconfig
基本命令
- 查看工作区、暂存区状态
git status
- 将文件添加到暂存区
git add hello.txt
- 从暂存区撤销回到工作区
git rm --cached hello.txt
- 将文件从暂存区提交到本地仓库
# 进入vim编辑器进行提交文件说明
git commit hello.txt
# 不进入vim编辑器进行提交文件说明
git commit -m "add hello.txt"
- 查看版本历史记录
如果版本历史记录很多的话,可以按
空格
向下翻页;按b
向上翻页;按
q
退出
# 方式1
git log
# 方式2,简化显示版本历史记录、并使用长的hash值
git log --pretty=oneline
# 方式3,简化显示版本历史记录、并使用短的hash值
git log --oneline
# 方式4,HEAD@{移动到当前版本需要多少步}
git reflog
- 查看具体命令的使用
# 语法:git help 具体的命令
git help reset
git reset命令参数
git reset --soft 124de7c
- 使用
--soft
参数,本地库的指针发生变化,但是文件区和暂存区的指针不会发生变化 - 使用
--mixed
,文件的内容不会变化,但是暂存区和本地库会同时移动指针,而工作区不移动指针
比较文件
git diff aa.txt # 将工作区和暂存区中的文件内容差异,如果删除则使用`-`,如果新增则使用`+`
git diff HEAD aa.txt #和本地库中的HEAD进行比较。可以和本地库的某个版本进行比较
git diff HEAD #比较暂存区和本地库中有文件差异的内容
分支
- 默认创建的分支是master分支,在新增功能、修复bug等不想影响原有的master分支,所以我们需要另外创建一个新的分支来进行工作
- 一般分支名我们会起名为
feature_xx
;针对bug处理的分支,一般命名为hot_fix
- 分支的好处:可以进行多个功能的开发,相互独立,互不影响;
# 查看所有分支
git branch -v
# 创建分支
git branch hot_fix
# 切换分支
git checkout hot_fix
情景1:合并分支不产生冲突的情况下
创建hot_fix分支修复master分支中的bug
# 创建分支,并切换到对应的分支下
git branch hot_fix
git checkout hot_fix
# bug修复,并提交到本地库
vi hello.txt
git add hello.txt
git commit -m "fix hello.txt"
# 切换到master分支,将hot_fix分支的内容合并到当前分支
git checkout master
git merge hot_fix
情景2:合并分支产生冲突
什么情况下会产生冲突?当修改同一个文件的同一行时
# hot_fix分支上修改aa.txt第N行的内容
git branch hot_fix
vi aa.txt
git add aa.txt
git commit -m "update aa.txt by hot_fix"
# 切换到master分支修改aa.txt第N行的内容
git branch master
vi aa.txt
git add aa.txt
git commit -m "update aa.txt by master"
# 尝试合并分支
git checkout hot_fix
git merge master
# 冲突代码调整,然后重新提交到本地库
vim aa.txt
git add aa.txt
git commit -m "resolve confict" 注意:这里不能带有文件名
注意:
- 分支合并遇到报错时,命令行的分支名会变为”xx|yyy”这种形式
- 分支冲突后,冲突的文件会在冲突的地方会有标记,我们需要对冲突的地方进行代码的调整。因为git不知道怎么做处理
应用场景
工作区文件添加到本地仓库
git add hello.txt
git commit -m "add hello.txt"
版本回退或前进
版本控制是由
HEAD
指针进行控制
方式1:基于索引值操作【推荐】
# 语法:git reset --hard 索引值
git reset --hard 124de7c
注意:
-
git log --pretty=oneline
和git log --oneline
只会记录当前版本之前的历史版本记录(即只显示历史,不显示将来) -
git log
和git reflog
可以记录当前版本之前或者后的历史版本记录
方式2:使用^
符号,这种只能进行版本后退
# 回退到上一个版本
git reset --hard HEAD^
注意:HEAD
后面有多少个^,就回退多少个版本
方式3:使用~
符号,回退指定个数的版本
# 回退到前两个版本
git reset --hard HEAD~2
方式4:使用@{n}
来回退或者前进到某个版本
git reflog
git reset --hard HEAD@{5}
删除文件后找回
删除文件
git rm a.txt
-
如果已经提交到本地库,则使用
git reset --hard 指定的版本
回退删除文件前的一个版本。 -
如果还未提交到本地库,则使用
git reset --hard HEAD
更新当前工作区、暂存区、本地库的指针,这样本次修改则无效