简介

  • svn是集中式版本控制,git是分布式版本控制
  • 为什么需要版本控制?
    • 版本控制,记录某个历史的状态,然后根据某个历史状态进行处理,比如回退某个版本;
    • 团队协作时,可以使用版本控制来记录不同人对文件的操作
  • 集中式版本控制:文件和版本信息是存储在服务端,如果服务端宕机的话会出现历史数据丢失的问题(即单点故障问题)
  • 分布式版本控制:本地、服务器都可以记录版本历史,可以避免单点故障问题。

团队内部协作

  1. 项目经理在”代码托管中心”(比如:github)中创建一个仓库,然后将自己本机的仓库push过去
  2. 程序员就可以通过”代码托管中心”获取仓库中的代码、然后提交自己的代码(不过这个过程需要项目经理授权才可以操作)
  3. 项目经理和其他程序员可以通过”代码托管中心”获取仓库中的代码

跨团队协作

项目经理安排了一项内容给程序员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=onelinegit log --oneline只会记录当前版本之前的历史版本记录(即只显示历史,不显示将来)
  • git loggit 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更新当前工作区、暂存区、本地库的指针,这样本次修改则无效

版权声明:本文为it774274680原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/it774274680/p/15095314.html