当前位置:   article > 正文

学git?看这一篇就够了_git 有一篇就够了

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中尝试!删除电脑中全部文件!
  • 1

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"
  • 1
  • 2
  • 进入要管理的文件夹

    • 右键 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 '描述信息'
  • 1
  • 2
  • 3

第二阶段:提交远程仓库

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

第三阶段:撤回本地版本

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

分支 branch

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

紧急修复线上bug的思路

image.png

基于分支修复线上bug

查看分支

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

创建分支

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

切换分支

git checkout 分支名称
  • 1

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

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

删除分支

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

项目版本

当我们为项目开发到一定程度,假如想为它创建版本时,我们可以为它打上标签作为项目的一个版本编号,如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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

远程仓库 remote

image.png

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

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

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

image.png

给远程仓库起别名

git remote add origin 远程仓库地址
  • 1

向远程推送代码

git push -u origin 分支
  • 1

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

克隆远程仓库代码

git clone 远程仓库地址
  • 1

创建并切换分支

git branch 分支
git checkout 分支
  • 1
  • 2

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

切换到dev分支进行开发

git checkout dev
  • 1

把master分支合并到dev

git merge master
  • 1

提交代码

git add .
git commit -m "xxx"
git push origin dev
  • 1
  • 2
  • 3

开发完毕,要上线

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

git checkout master
git merge dev
git push origin master
  • 1
  • 2
  • 3

把dev分支也推送到远程

git checkout dev 
git merge master
git push origin dev
  • 1
  • 2
  • 3

约妹子忘记提交代码

拉代码

git pull origin dev
  • 1

提交代码

git add .
git commit -m "xxx"
  • 1
  • 2

没有提交到Github托管

回家继续写代码

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

git pull origin dev
  • 1

无奈,继续开发其他功能

把dev分支也推送到远程

git add .
git commit -m "xxx"
git push origin dev
  • 1
  • 2
  • 3

到公司继续写代码

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

git pull origin dev
  • 1

解决冲突,继续开发

把dev分支也推送到远程

git add .
git commit -m "xxx"
git push origin dev
  • 1
  • 2
  • 3

多人协同开发工作流

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

创建项目&邀请成员

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

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

成员开发

注册Github或Gitlab账号

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

代码审核 code review

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

  • 成员提交code review申请

  • 组长做 code review

提测上线(预发布)

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

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

git checkout dev 
git checkout -b release
  • 1
  • 2

2.测试等

3.合并到master

使用 pull request

本地将release合并到master分支
  • 1
  • 2
  • 3

4.在master分支打tag

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

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

git clone -b v2 地址
  • 1

给开源项目贡献代码

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

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

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

首次使用git配置

配置文件存放三个位置

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

查看配置信息

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
  • 1
  • 2
  • 3
  • 4
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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]
  • 1
  • 2
  • 3
  • 4

.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 查看上四个版本的修改
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/625207
推荐阅读
相关标签
  

闽ICP备14008679号