学git?看这一篇就够了

Git

最近有人问我git操作相关的知识,我直接拿出积累许久的git秘籍送给了这位骚年,骚年直称妙哉,最后戏虐的说道:写得真好,看完还不如自己学。想必是我写的太好,心生嫉妒,罢了罢了,在这里也分享给大家,同时git所有操作一篇文章肯定说不完,欢迎大伙提问补充。

常见的版本控制工具

主流的版本控制器有如下这些:

  • Git
  • SVN(Subversion)
  • CVS(Concurrent Versions System)
  • VSS(Micorosoft Visual SourceSafe)
  • TFS(Team Foundation Server)
  • Visual Studio Online

版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN

版本控制分类

1、本地版本控制 RCS

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。

1646144016107

2、集中版本控制 SVN

所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改。所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS

1646144112859

3、分布式版本控制 Git

每个人都拥有全部的代码!安全隐患!

所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。

不会因为服务器损坏或者网络问题,造成不能工作的情况!

Git与SVN的主要区别

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。

Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件!

安装及使用Git

Git地址:https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

常用的Linux命令

1)、cd : 改变目录。

2)、cd . . 回退到上一个目录,直接cd进入默认目录

3)、pwd : 显示当前所在的目录路径。

4)、ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。

5)、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。

6)、rm: 删除一个文件, rm index.js 就会把index.js文件删除。

7)、mkdir: 新建一个目录,就是新建一个文件夹。

8)、rm -r : 删除一个文件夹, rm -r src 删除src目录

rm -rf / 切勿在Linux中尝试!删除电脑中全部文件!

9)、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。

10)、reset 重新初始化终端/清屏。

11)、clear 清屏。

12)、history 查看命令历史。

13)、help 帮助。

14)、exit 退出。

15)、#表示注释

四个区域

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

在这里插入图片描述

  • Workspace:工作区,就是你平时存放项目代码的地方
  • Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

工作流程

git的工作流程一般是这样的:

1、在工作目录中添加、修改文件;

2、将需要进行版本管理的文件放入暂存区域;

3、将暂存区域的文件提交到git仓库。

因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

在这里插入图片描述

第一阶段:自己写代码

版本控制

  • 个人信息配置:用户名、邮箱

img

git config --global user.email "you@example.com"
git config --global user.name "Your Name"
  • 进入要管理的文件夹

    • 右键 Git Bash Here
  • 初始化,创建本地仓库

    • git init
  • 管理指定文件

    • git add index.html
    • git add . 目录下所有文件
  • 管理目录下的文件状态

    • git status
  • 提交到本地仓库,生成版本

    • git commit -m ‘描述信息’
  • 提交远程仓库

    • git push
  • 查看版本

    • git log 按时间先后顺序列出本地仓库的所有提交commit
      • -p 查看每次提交所引入的差异
      • -2 只显示最近两次的提交
git init
git add .  
git commit -m '描述信息'

第二阶段:提交远程仓库

git remote add origin git@github.com:VaeEmilia/file.git
git push -u origin master

第三阶段:撤回本地版本

  • 回滚至之前版本
git log 查看历史版本
git reset --hard 版本号
  • 回滚之后版本
git reflog
git reset --hard 版本号

分支 branch

分支可以给使用者提供多个环境,意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。

紧急修复线上bug的思路

image.png

基于分支修复线上bug

查看分支

git branch     列出所有本地分支
git branch -r  列出所有远程分支

创建分支

git branch 分支名字
git checkout -b 分支名字    新建一个分支并切换到该分支

切换分支

git checkout 分支名称

分支合并(可能产生冲突)

git merge 要合并的分支   合并指定分支到当前分支

删除分支

git branch -d 分支名称
# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]

项目版本

当我们为项目开发到一定程度,假如想为它创建版本时,我们可以为它打上标签作为项目的一个版本编号,如git tag v1.0.0

查看所有版本:$ git tag       
创建版本:$ git tag [name]
创建带注释的tag:$ git tag -a [name] -m 'yourMessage'
删除版本:$ git tag -d [name]
查看远程版本:$ git tag -r
创建远程版本(本地版本push到远程):$ git push origin [name]
删除远程版本:$ git push origin :refs/tags/[name]
合并远程仓库的tag到本地:$ git pull origin --tags
上传本地tag到远程仓库:$ git push origin --tags

当我们想要克隆的时候可以指定标签 git clone -b [tags标签] [git地址]

远程仓库 remote

image.png

为了更好的理解远程仓库的概念和使用,我们来看一个例子

第一天上班前在家上传代码

首先,需要注册github账号,并创建远程仓库,然后再执行如下命令,将代码上传到github。

image.png

给远程仓库起别名

git remote add origin 远程仓库地址

向远程推送代码

git push -u origin 分支

初次在公司新电脑下载代码

克隆远程仓库代码

git clone 远程仓库地址

创建并切换分支

git branch 分支
git checkout 分支

在公司下载完代码后,继续开发

切换到dev分支进行开发

git checkout dev

把master分支合并到dev

git merge master

提交代码

git add .
git commit -m "xxx"
git push origin dev

开发完毕,要上线

将dev分支合并到master,进行上线

git checkout master
git merge dev
git push origin master

把dev分支也推送到远程

git checkout dev 
git merge master
git push origin dev

约妹子忘记提交代码

拉代码

git pull origin dev

提交代码

git add .
git commit -m "xxx"

没有提交到Github托管

回家继续写代码

拉代码,发现并没有公司的代码

git pull origin dev

无奈,继续开发其他功能

把dev分支也推送到远程

git add .
git commit -m "xxx"
git push origin dev

到公司继续写代码

拉代码,把昨天的代码拉到本地(可能存在冲突)

git pull origin dev

解决冲突,继续开发

把dev分支也推送到远程

git add .
git commit -m "xxx"
git push origin dev

多人协同开发工作流

实际的工作中,我们肯定不止一个人开发一个项目,那么我们需要继续了解多人协作的开发方式

创建项目&邀请成员

协同开发时,需要所有成员都可以对同一个项目进行操作,需要邀请成员并赋予权限,否则无法开发。 github支持两种创建项目的方式(供多人协同开发)。

  • 1.合作者,将用户添加到仓库合作者中之后,该用户就可以向当前仓库提交代码。
  • 2.组织,将成员邀请进入组织,组织下可以创建多个仓库,组织成员可以向组织下仓库提交代码。

成员开发

注册Github或Gitlab账号

  • 邀请成员进入组织(默认对组织中的项目具有读权限)
  • 邀请成员成为某项目的合作者

代码审核 code review

  • 配置,代码review之后才能合并到dev分支

  • 成员提交code review申请

  • 组长做 code review

提测上线(预发布)

由专门团队或团队leader执行以下步骤

1.基于dev分值创建release分值

git checkout dev 
git checkout -b release

2.测试等

3.合并到master

使用 pull request

本地将release合并到master分支

4.在master分支打tag

git tag -a v2 -m '第二版 斗地主功能' 
git push origin --tags

5.运维人员就可以去下载代码做上线了

git clone -b v2 地址

给开源项目贡献代码

  • 1.fork源代码将别人源代码拷贝到我自己的远程仓库。

  • 2.在自己仓库进行修改代码

  • 3.给源代码的作者提交修复bug的申请(pull request)

首次使用git配置

配置文件存放三个位置

  • 项目配置文件:项目/.git/config
git config --local user.name 'juran'
git config --local user.email 'juran@xx.com
  • 全局配置文件:~/.gitconfig
git config --global user.name 'juran'
git config --global user.email 'juran@xx.com'
  • 系统配置文件:/etc/.gitconfig
git config --system user.name 'juran'
git config --system user.email 'juran@xx.com'
注意:需要有root权限

查看配置信息

git config --list

git config <key> : 来检查 Git 的某一项配置

连接远程仓库

1646384806702

Git与Github的连接与使用

  • URL中体现
原来的地址:https://github.com/juran/dbhot.git
修改的地址:https://用户名:密码@github.com/juran/dbhot.git
git remote add origin https://用户名:密码@github.com/juran/dbhot.git 
git push origin master
  • SSH实现
1.查找公钥和私钥(默认放在~/.ssh目录下,id_rsa.pub公钥、id_rsa私钥; C:\Users\l\.ssh)  
Git Bash: cat ~/.ssh/id_rsa.pub
没有的话输入ssh-keygen创建公钥和私钥

2.拷贝公钥的内容,并设置到github中。 

3.验证是否成功,在git bash里输入下面的命令
ssh -T git@github.com
ssh -T git@gitee.com
如果初次设置的话,会出现如下界面,输入yes同意即可

3.创建本地仓库git init,在本地中配置ssh地址
git remote add origin git@github.com:<github用户名>/<仓库名>.git    //关联一个远程库 github
- git remote add origin git@gitee.com:<github用户名>/<仓库名>.git	//gitee
> git remote add origin git@github.com:VaeEmilia/file.git 
git push -u origin "master"    //关联后,第一次推送master分支的所有内容命令,此后,每次本地提交后,就可以使用命令git push origin master推送最新修改

4.以后使用
git push origin master

github任务管理相关

  • issues,文档以及任务管理。
  • wiki,项目文档。

解决冲突

image-20220630140119512

1.保留本地数据

  1. git stash 将工作去恢复到上次提交的内容,同时,将当前的工作区内容保存到Git栈中
  2. git pull origin master 拉取仓库代码
  3. git stash pop 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。

通过上面三步操作,就可以将服务器上的代码拉取下来了,同时本地修改的代码还存在,可以对他们进行修改操作,保留最终的代码即可。

在这里插入图片描述

还有两个相关操作,在这里也介绍一下:

  1. git stash list:显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
  2. git stash clear:清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

2.丢弃本地修改

  1. git reset --hard 将本地的状态回复到上一个commit id

  2. git pull origin master 拉取远程仓库代码

遇到问题

克隆报错

$ git clone https://github.com/chizhu/KGQA_HLM.git
Cloning into ‘KGQA_HLM’…
fatal: unable to access ‘https://github.com/chizhu/KGQA_HLM.git/’: OpenSSL SSL_read: Connection was reset, errno 10054

将网址中的https改成git

$ git clone git://github.com/chizhu/KGQA_HLM.git
Cloning into ‘KGQA_HLM’…
remote: Enumerating objects: 372, done.
remote: Total 372 (delta 0), reused 0 (delta 0), pack-reused 372
Receiving objects: 100% (372/372), 5.13 MiB | 834.00 KiB/s, done.
Resolving deltas: 100% (89/89), done.

.gitignore

GIT基础篇,如何使用.gitignore忽略文件

https://github.com/github/gitignore

让Git不再管理当前目录下的某些文件。

*.h    
!a.h  
files/  
*.py[c|a|d]

.gitignore的格式规范

  1. 所有空行或者以 # 开头的行都会被 Git 忽略,即是注释
  2. 可以使用标准的 glob 模式匹配。
  3. 匹配模式可以以(/)开头防止递归。
  4. 匹配模式可以以(/)结尾指定目录。
  5. 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

什么是 glob 匹配模式?

  1. shell 所使用的简化了的正则表达式

  2. 星号(*)匹配零个或多个任意字符

  3. [abc] 匹配任何一个列在方括号中的字符

  4. (?)只匹配一个任意字符

  5. [?-?] 表示匹配两个字符范围内的字符,如[1-8]表示数字1-8都可以

  6. 使用两个星号(*) 表示匹配任意中间目录,a/**/b 可以匹配 a/b, a/c/ba/c/d/b

**注意:**如果你创建.gitignore文件之前就push了某一文件,那么即使你在.gitignore文件中写入过滤该文件的规则,该规则也不会起作用,git仍然会对该文件进行版本管理。可以使用git rm -r --cached .清除本地git所有缓存,重新git add xxx添加需要管理的文件

git status 查看文件状态 未提交前可以知道哪些文件添加到了版本控制

其他命令

git remote show origin 显示远程库origin里的资源
git remote rm origin  移除远程仓库

git checkout <file> 丢弃工作区的修改
git checkout -f 强制丢弃工作区和暂存区的修改
git checkout <HEAD> 切换本地仓库版本

git diff [HEAD] 显示差异,对比做了哪些修改 HEAD^ 每个^代表上一个版本
git diff HEAD~4 查看上四个版本的修改
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值