Git 学习笔记

GIt简介

Git是最先进的分布式版本控制系统
像SVN等就是集中式版本控制系统,需要有网络才能工作。但是对于Git,每个电脑都有完整的版本库。在从远程仓库拉取代码或者推送本地仓库代码到远程仓库时才需要网络。
如下图所示。
在这里插入图片描述

Git安装

对于linux而言只需执行yum -y install git即可成功安装。
对于Windows而言可以安装官网提供的GitBash客户端(其中也包含了GitUI)。
安装后执行下面两句命令,--global表示这台机器上所有的Git仓库都会使用这个配置设置用户名和邮箱。

git config --global user.name "patrick.bigdata"
git config --global user.email "xxx@foxmail.com"

如下图所示我的git版本是 2.26.0。git checkout命令可以用其他命令替代。
在这里插入图片描述

Git命令操作

创建版本库

新建一个空目录test,然后进入到该目录下后执行git init即可将该目录变成git可以管理的仓库。默认会在该目录下生成一个.git的隐藏目录,该目录是Git来跟踪管理版本库的。
在这里插入图片描述

工作区和暂存区

工作区就是文件系统上的文件夹如上面的test文件夹。
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

如下图所示,git add就是将文件从工作区提交到暂存区stagegit commit就是将暂存区的所有文件一次提交到版本库里。
在这里插入图片描述
Git管理的是对文件的修改操作。这就是为什么Git比其他版本控制系统设计得优秀。

常用操作命令如下
# 指定目录为git管理的仓库
git init
# 查看当前仓库状态
git status
# 向暂存区添加文件
git add filename
# 提交暂存区文件到版本库, -m指定提交的信息(要有实际意义)
git commit -m "msg" filename
# 直接将文件提交到版本库 只对曾经add过的filename有效,包含git add过程
git commit -am "msg" filename 
# 比对工作区文件和暂存区文件
git diff filename
# 比对工作区文件和暂存区文件
git diff HEAD -- filename
# 查看提交历史记录
git log [--pretty=oneline]
# 回退到上一个版本
git reset --hard HEAD^
# 回退到上两个版本
git reset --hard HEAD^^
# 回退到上100个版本
git reset --hard HEAD~100
# 回退到指定commitid,可通过git log查看commitid
git reset --hard commitid
# 用来记录你的每一次命令
git reflog
# 丢弃工作区中的修改
git restore filename
# 丢弃暂存区中的修改
git restore --staged filename

远程仓库

我们以GitHub远程仓库为例。
运行ssh-keygen生成id_rsa.pub文件(一般在用户目录的.ssh隐藏目录下)将该文件的内容上传到github上Personal settings --> SSH and GPG keys
在这里插入图片描述
在这里插入图片描述

添加远程仓库

首先在GitHub上添加一个新的仓库test,现在远程仓库是空的。
在这里插入图片描述
在本地仓库test目录下创建一个README.md文件(内容随便),然后提交到版本库之后。采用git remote add命令添加远程仓库

# 添加远程仓库(采用ssh协议),并命名为origin(默认,看起来就是远程仓库的意思)
git remote add origin git@github.com:PatrickWangHadoop/test.git
# 查看远程仓库信息
git remote -v
# 推送本地仓库的master分支到远程仓库origin, -u第一次才需要,后面就可以省略该参数了
# 加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地
# 的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
git push -u origin master 

# 拉取远程仓库分支到本地不存在的分支
# 第一个命令是拉取远程仓库到本地, 第二个命令是在本地仓库建立dev并和远程仓库dev建立联系
git fetch origin dev
git switch -c dev origin/dev

# 在本地仓库和远程仓库建立联系后,拉取远程仓库的代码到本地仓库
git pull [origin dev]

# 查看本地仓库和远程仓库的联系,有以下三种命令可以查看
git branch -vv
git remote show origin
cat .git/config

在这里插入图片描述
在这里插入图片描述

克隆远程仓库
# 克隆远程仓库到本地
git clone git@github.com:PatrickWangHadoop/test.git

分支管理

常用命令
# 创建分支dev
git branch dev
# 查看所有分支
git branch -a
# 切换到分支dev上
git switch dev
# 创建分支feature1并切换到该分支上
git switch -c feature1
# 将dev分支和master分支进行合并(假如当前是在master分支上)
git merge dev
# 删除分支dev
git branch -d dev
# 查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
# 可以在发生冲突后放弃merge退回到原来的状态(前提是暂存区所有文件都已经提交)
git merge --abort
#发生冲突后需要解决冲突

# 合并分支dev时禁止使用Fast Forward模式并提交一个commit,这样就不会丢失分支信息。
# 如果是默认的Fast Forward,就会丢失分支(这样无法通过git log查看到分支信息)
git merge --no-ff -m "merge with no-ff" dev

# 保存现场
git stash
# 查看存在的现场列表
git stash list
# 恢复现场并删除原来的现场
git stash pop
# 合并某个commit到当前分支上
git cherry-pick 893f110

# 把本地未push的分叉提交历史整理成直线,慎用
git rebase
分支策略

在实际开发中,master分支应该是非常稳定的,仅用来发布新版本,平时不能在上面干活。
干活都在dev分支上,每个小伙伴都有自己的分支,然后合并到dev上。等到版本发布时再将dev分支合并到master分支上。

bug分支

首先在当前分支dev上使用git stash保存当前工作状态(注意所有的文件需要被track),然后使用git status查看当前工作区是干净的。
然后在master上创建分支issue-001来修复bug,在bug分支修复完bug后切换到master分支上然后进行合并git merge --no-ff -m "merged bug fix 101" issue-001
然后切换到dev分支上继续工作,首先就通过git stash pop恢复原先现场并删除掉stash。
需要把提交给master的commit也提交到dev上,找到对应的commitid然后在dev分支上执行git cherry-pick 893f110就能在dev上也修复同样的bug了。

feature分支

每个新的feature最好是新建分支,删除未合并的分支需要使用git branch -D feature-01

标签管理

# 在当前分支的最新commitid打标签,实际上一个tag对应一个commitid
git tag v1.0
# 查看所有tag
git tag
# 02ac724296d 根据某个commitid打tag
git tag v0.9
# 查看具体的tag信息
git show tagname
# 根据指定commitid打标签并提交新的commit, 故需要-m指定msg
git tag -a v0.1 -m "version 0.1 released" 1094adb
# 标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支
# 那么在这两个分支上都可以看到这个标签。

# 删除tag
git tag -d v1.0
# 推送本地的某个tag到远程
git push origin v1.0
# 一次性推送全部尚未推送到远程的tag
git push origin --tags
# 删除本地和远程的tag
# 若tag已经推送到远程,首先在本地删除,然后再执行git push origin :regs/tags/v0.0

其他技巧或命令

# 可以通过fork来克隆别人的仓库到自己的仓库

# .gitignore文件相关
# 可以在根目录添加.gitignore文件来忽略某些文件,当然该文件也是需要添加到版本控制里的
# 如果通过git add App.class命令无法添加文件则可以通过-f强制添加
# 查看某个文件是否符合.gitignore
git check-ignore -v App.class
# 强制添加
git add -f App.class

# 设置别名,后续就可以使用git lg命令查看日志
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

参考网址

廖雪峰老师的Git教程
查看本地仓库和远程仓库的联系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值