一份Git的全总结

简介: 一份Git的全总结

励志

在这里插入图片描述
It's what I was meant to do. And nothing's gonna stop me.
这是我命中注定要做的,没什么能够阻止我。

一、Git学习路线

学习时长建议:3天

猴子漫画图解-在线学习

Linux笔记传送门

二、Git安装

windows安装
阿里镜像安装

ubuntu配置:apt-get install git
centos配置:yum install git


以Windos为例,成功安装后:
在这里插入图片描述
备注:

  • Git GUI:Git提供的图形界面工具
  • Git Bash:Git提供的命令行工具
> git config --global user.name "用户名"
> git config --global user.email "邮箱"
#检查信息是否写入成功
git config --list

拓展:为常用指令配置别名

有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。

  1. 打开用户目录,创建 .bashrc 文件

部分windows系统不允许用户创建点号开头的文件,可以打开gitBash,执行

touch ~/.bashrc
  1. 在 .bashrc 文件中输入如下内容:
#用于输出git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
alias ll='ls -al'
  1. 打开gitBash,执行

    source ~/.bashrc

解决GitBash乱码问题:

  1. 打开GitBash执行下面命令
git config --global core.quotepath false
  1. ${git_home}/etc/bash.bashrc 文件最后加入下面两行
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"

三、理论基础

(1)Git的发展

Git最初是由Linux开发者Linus用了仅仅两周时间纯C语言编写而成,在编写完成之后就立马上手接管Linux源代码,不过在此之前Linux是由BitMover公司开发的BitKeeper分布式版本控制系统所管理源代码,它是商业收费的分布式版本控制器,但BitMover公司看中Linux开源精神,免费授权给Linux社区使用,在2002年时,Linux开始使用BitKeeper分布式版本控制系统管理源代码,但好景不长,有一天Linux社区成员Andrew(samba(局域网共享文件c/s程序)的作者)试图破解BitKeeper共享给所有人使用,被BitMover公司发现并收回了免费使用的版权,随后Linus就用了两周时间开发出了git(两周时间包括测试),也就是目前为止最好用的==分布式版本控制系统==。

大名鼎鼎的github用的就是git系统来管理它们的网站,这里需要区分一下,==github和git是两个东西==,==github是一个社区==,==git是一个服务系统==,github只支持git分布式系统,所以故名成为github。

(2)Git 是什么?

Git是==分布式版本控制系统==!(每个人都拥有全部的代码)

主流的版本控制系统:

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

现在影响力最大且使用最广泛的是Git(没有中央服务器、工作不需要联网)与==SVN(集中式版本控制系统)==(版本库是集中放在中央服务器的、工作需要联网)

SVN:
在这里插入图片描述
GIT:
在这里插入图片描述

(3)三种状态

已提交(committed)、已修改(modified) 和 已暂存(staged)

  • 已修改表示修改了文件,但还没保存到数据库中。
  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 已提交表示数据已经安全地保存在本地数据库中。

这会让Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
在这里插入图片描述

  • 工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
  • 暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git的术语叫做“索引”,不过一般说法还是叫“暂存区”。
  • Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。

基本的 Git 工作流程如下:

  1. 在工作区中修改文件。
  2. 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
  3. 提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录

如果 Git 目录中保存着特定版本的文件,就属于 已提交 状态。 如果文件已修改并放入暂存区,就属于
已暂存 状态。 如果自上次检出后,作了修改但还没有放到暂存区域,就是 已修改 状态。

(4)Git 保证完整性

Git 中所有的数据在==存储前都计算校验和==,然后以==校验和来引用==。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。

Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

(5)Git工作流程图

在这里插入图片描述
命令如下:

  1. clone(克隆): 从远程仓库中克隆代码到本地仓库
  2. checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
  3. add(添加): 在提交前先将代码提交到暂存区
  4. commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
  5. fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
  6. pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于

fetch+merge

  1. push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库

(6)基础操作练习

#####################仓库初始化######################
# 创建目录(git_test01)并在目录下打开gitbash
略 #
初始化git仓库
git init
#####################创建文件并提交#####################
# 目录下创建文件 file01.txt
略 #
将修改加入暂存区
git add .
# 将修改提交到本地仓库,提交记录内容为:commit 001
git commit -m 'commit 001'
# 查看日志
git log
####################修改文件并提交######################
# 修改file01的内容为:count=1
略 #
将修改加入暂存区
git add .
# # 将修改提交到本地仓库,提交记录内容为:update file01
git commit --m 'update file01'
# 查看日志
git log
# 以精简的方式显示提交记录
git-log(需要改别名,请看前面)
####################将最后一次修改还原##################
# 查看提交记录
git-log
# 找到倒数第2次提交的commitID
略 #
版本回退
git reset commitID --hard

四、实战

在这里插入图片描述
常用名词解释:

  • msater:默认开发分支
  • origin:默认远程仓库版本库
  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库
Win系统下,请打开隐藏文件显示

1.新建代码库

# 在当前目录新建一个Git代码库
$ git init
 
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
 
# 克隆一个项目和它的整个代码历史
$ git clone [url]

2.配置

Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。

# 显示当前的Git配置
$ git config --list
 
# 编辑Git配置文件
$ git config -e [--global]
 
# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

3.增加/删除/修改文件

文件的四种状态:

  • Untracked: 未跟踪, 此文件==在文件夹中==, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Unmodify: 文件已经==入库, 未修改==, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改,而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
  • Modified: 文件==已修改==, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
  • Staged: ==暂存==状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致,文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
# 查看状态
$ git status

# 查看变更内容
$ git diff 

# 添加指定文件到暂存区
$ git add [file1] [file2] ...
 
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
 
# 添加当前目录的所有文件到暂存区
$ git add .
 
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p
 
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
 
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
 
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

注意:rm 命令删除的只是工作目录和暂存区域的文件(即取消跟踪,在下次提交时不纳入版本管理)

4.代码提交

忽略文件:

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

在主目录下建立".gitignore"文件,此文件有如下规则:

  1. 忽略文件中的空行或以井号 ==(#)开始== 的行将会被忽略。
  2. 可以使用Linux ==通配符==。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
  3. 如果名称的最前面有一个感叹号 ==(!)==,表示==例外规则==,将不被忽略。
  4. 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  5. 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt        #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt     #但lib.txt除外
/temp        #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/       #忽略build/目录下的所有文件
doc/*.txt    #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

# 提交暂存区到仓库区
$ git commit -m [message]
 
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
 
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
 
# 提交时显示所有diff信息
$ git commit -v
 
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
 
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

5.分支

在开发中,一般有如下分支使用原则与流程:

  • master (生产) 分支

线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;

  • develop(开发)分支

是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。

  • feature/xxxx分支

从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支。

  • hotfix/xxxx分支,

从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支。

  • 还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。
# 列出所有本地分支
$ git branch
 
# 列出所有远程分支
$ git branch -r

# 列出本地分支与远程分支的关联关系
$ git branch -vv
 
# 列出所有本地分支和远程分支
$ git branch -a
 
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
 
# **以远程分支为基础新建一个分支,并切换到该分支
$ git checkout -b [branch] origin/[remote-branch]
 
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
 
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
 
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
 
# 切换到上一个分支
$ git checkout -
 
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
 
# 合并指定分支到当前分支
$ git merge [branch]
 
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
 
# 删除分支
$ git branch -d [branch-name]

$ git branch -D [branch-name]  强制删除
 
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

6.标签

# 列出所有tag
$ git tag
 
# 新建一个tag在当前commit
$ git tag [tag]
 
# 新建一个tag在指定commit
$ git tag [tag] [commit]
 
# 删除本地tag
$ git tag -d [tag]
 
# 删除远程tag
$ git push origin :refs/tags/[tagName]
 
# 查看tag信息
$ git show [tag]
 
# 提交指定tag
$ git push [remote] [tag]
 
# 提交所有tag
$ git push [remote] --tags
 
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

7.查看信息

暂存区与工作树:

目的:对比版本之间有哪些不同

在已经存在的文件b.txt中添加内容:

$ git diff
diff --git a/b.txt b/b.txt
index 9ab39d5..4d37a8a 100644
--- a/b.txt
+++ b/b.txt
@@ -2,3 +2,4 @@
1212
123123123
234234234
+手动阀手动阀

现在来解释一下上面每一行的含义:

第一行:diff --git a/b.txt b/b.txt
表示对比的是存放在暂存区域和工作目录的b.txt

第二行:index 9ab39d5..4d37a8a 100644
表示对应文件的 ID 分别是 9ab39d5和 4d37a8a,左边暂存区域,后边当前目录。最后的 100644 是指定文件的类型和权限

第三行:--- a/b.txt
--- 表示该文件是旧文件(存放在暂存区域)

第四行:+++ b/b.txt
+++ 表示该文件是新文件(存放在工作区域)

第五行:@@ -2,3 +2,4 @@
以 @@ 开头和结束,中间的“-”表示旧文件,“+”表示新文件,后边的数字表示“开始行号,显示行数”

内容:+代表新增的行 -代表少了的行

直接执行 git diff 命令是比较暂存区域与工作目录的文件内容

# 显示有变更的文件
$ git status
 
# 显示当前分支的版本历史
$ git log
 
# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat
 
# 搜索提交历史,根据关键词
$ git log -S [keyword]
 
# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s
 
# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature
 
# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]
 
# 显示指定文件相关的每一次diff
$ git log -p [file]
 
# 显示过去5次提交
$ git log -5 --pretty --oneline
 
# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn
 
# 显示指定文件是什么人在什么时间修改过
$ git blame [file]
 
# 显示暂存区和工作区的差异
$ git diff
 
# 显示暂存区和上一个commit的差异
$ git diff --cached [file]
 
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
 
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
 
# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
 
# 显示某次提交的元数据和内容变化
$ git show [commit]
 
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
 
# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
 
# 显示当前分支的最近几次提交
$ git reflog

8.远程同步

# 下载远程仓库的所有变动(不合并)
$ git fetch [remote]
 
# 显示所有远程仓库
$ git remote -v
 
# 显示某个远程仓库的信息
$ git remote show [remote]
 
# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
 
# 取回远程仓库的变化,并与本地分支合并(fetch + merge)
$ git pull [remote] [branch]
 
# 上传本地指定分支到远程仓库
$ git push [remote] [branch]
 
# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
 
# 推送所有分支到远程仓库
$ git push [remote] --all

9.撤销

时光回退:

有关回退的命令有两个:reset 和 checkout

(1)回滚快照

注:快照即提交的版本,每个版本我们称之为一个快照。
head永远指向当前分支的当前快照
HEAD~ 表示 HEAD 的上一个快照,HEAD~~表示上上个快照 , 如果表示上10个快照,则可以用HEAD ~10

在这里插入图片描述

  • --hard : 回退版本库,暂存区,工作区。(因此我们修改过的代码就没了,需要谨慎使用)
  • reset 不仅移动 HEAD 的指向,将快照回滚动到暂存区域,它还将暂存区域的文件还原到工作目录。
  • --mixed: 回退版本库,暂存区。(--mixed为git reset的默认参数,即当任何参数都不加的时候的参数)
  • --soft: 回退版本库。就相当于只移动 HEAD 的指向,但并不会将快照回滚到暂存区域。相当于撤消了上一次的提交(commit)。

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

在这里插入图片描述
(2)回滚指定快照

reset 不仅可以回滚指定快照,还可以回滚个别文件。

命令格式:

git reset --hard c7c0e3bf6d64404e3e68632c24ca13eac38b02e2

唯一的一个前提条件是:你需要知道指定快照的 ID 号

git reflog

# 恢复暂存区的指定文件到工作区
$ git checkout [file]
 
# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
 
# 恢复暂存区的所有文件到工作区
$ git checkout .
 
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
 
# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
 
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
 
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
 
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
 
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]
 
# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

10.其他

# 生成一个可供发布的压缩包
$ git archive

11.解决冲突

当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:

  1. 处理文件中冲突的地方
  2. 将解决完冲突的文件加入暂存区(add)
  3. 提交到仓库(commit)

五、码云的使用

既然git是一个团队合作开发的工具,那本地的仓库肯定不能满足团队开发的需求!就必须要有一个远程仓库统一管理我们的代码。

在这里插入图片描述
Gitee传送门

作者的Gittee,开源Java学习全路线、全资料,让天下没有难学的Java!
传送门
在这里插入图片描述

0.名词解释

1、pull Request 开发者在本地对源代码进行修改之后,想仓库提交请求合并的功能
2、Wiki 该功能通常用作文档手册的编写当中
3、Issues:是将一个任务或问题分配给一个issue进行跟踪和管理,可以当做bug管理系统使用,每一个
功能的更正或修改都应该对应一个issue,只要看issues就能看到关于这个更改的所有信息
4、统计就是仓库各项数据的数据统计,devOPs是持续继承、持续交付的服务,服务:其他码云提供的
一些服务。
5、管理:对仓库的一些修改删除等操作

1.创建远程仓库

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

2.建立本地仓库

# 使用前先简单配置git(主要是使用者的name和email),用于代码提交时识别用户,以下两行命令最后的字符串写自己的
git config --global user.name '你的用户名'
git config --global user.email '你的邮箱'

# 创建gitee_learn文件夹,并进入
mkdir git-study
cd git-study

# 使用git命令初始化该文件夹,将其变为git可以进行版本管理的本地仓库
git init

# 创建文件123.txt,并写入数据"Hello world!"
echo 'Hello world!' > 123.txt

# 添加到仓库
git add 123.txt

# 提交到仓库
git commit -m 'first add a file'

# 查看仓库修改信息
git log

3.连接本地仓库和远程仓库进行程序上传和下载

# 本地仓库与gitee上的仓库关联起来
git remote add origin git@gitee.com:love666xh/git-study.git(SSH)
git remote add origin https://gitee.com/love666xh/git-study.git(HTTPS)

# 推送本地仓库到gitee
git push -u origin master
# 首次推送需要使用-u参数,以后推送就不需要该参数,直接推送
git push origin master

# 从gitee上拷贝仓库到本地
git clone git@gitee.com:love666xh/git-study.git

# 同步gitee远端仓库到本地
cd git-study
git pull
git fetch  // 合并本地

4.团队协作


HTTPS好还是SSH好?

git可以使用四种主要的协议来传输资料: ==本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 git协议==。其中,本地协议由于目前大都是进行远程开发和共享代码所以一般不常用,而git协议由于缺乏授权机制且较难架设所以也不常用。最常用的便是SSH和HTTP(S)协议。git关联远程仓库可以使用http协议或者ssh协议.

HTTPS优缺点:

  • 优点1: 相比 SSH 协议,可以使用==用户名/密码授权==是一个很大的优势,这样用户就不必须在使用Git 之前先在本地生成 SSH密钥对再把公钥上传到服务器。 对非资深的使用者,或者系统上缺少SSH 相关程序的使用者,HTTP 协议的可用性是主要的优势。 与 SSH协议类似,HTTP 协议也非常快和高效
  • 优点2: 企业防火墙一般会打开 80 和 443这两个常见的http和https协议的端口,使用http和https的协议在架设了防火墙的企业里面就可以==绕过安全限制==正常使用git,非常方便
  • 缺点: 使用http/https除了==速度慢==以外,还有个最大的麻烦是==每次推送都必须输入口令==. 但是现在操作系统或者其他git工具都提供了keychain 的功能,可以把你的账户密码记录在系统里,例如OSX 的 Keychain 或者 Windows的凭证管理器。所以也只需要输一次密码就搞定了。

SSH的优缺点:

  • 优点1: ==架设 Git 服务器==时常用 SSH 协议作为传输协议。 因为大多数环境下已经支持通过 SSH 访问——即时没有也比较很容易架设。 SSH 协议也是一个验证授权的网络协议;并且,因为其普遍性,架设和使用都很容易
  • 缺点1: SSH服务端一般使用==22端口==,企业防火墙可能==没有打开==这个端口。
  • 缺点2: SSH 协议的缺点在于你==不能通过它实现匿名访问==。 即便只要读取数据,使用者也要有通过SSH 访问你的主机的权限,这使得 SSH 协议不利于开源的项目。 如果你只在公司网络使用,SSH协议可能是你唯一要用到的协议。 如果你要同时提供匿名只读访问和 SSH 协议,那么你除了为自己推送架设 SSH 服务以外,还得架设一个可以让其他人访问的服务。

总结:

==HTTPS利于匿名访问==,适合开源项目可以方便==被别人克隆和读取==(但他没有push权限);毕竟为了克隆别人一个仓库学习一下你就要生成个ssh-key折腾一番还是比较麻烦,所以github除了支持ssh协议必然提供了https协议的支持。而==SSH协议使用公钥认证比较适合内部项目==。 当然了现在的代码管理平台例如github、gitliab,两种协议都是支持的,基本上看自己喜好和需求来选择就可以了。

关于Gittee SSH公钥问题:传送门

生成/添加SSH公钥:

Gitee 提供了基于SSH协议的Git服务,在使用SSH协议访问仓库仓库之前,需要先配置好账户/仓库的SSH公钥。

生成 sshkey:

ssh-keygen -t rsa -C "xxxxx@xxxxx.com"

## 或者这个
ssh-keygen -t rsa
这里的 xxxxx@xxxxx.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。

按照提示完成三次回车,即可生成 ssh key。

在这里插入图片描述
通过查看 ~/.ssh/id_rsa.pub 文件内容,获取到你的public key

cat ~/.ssh/id_rsa.pub

在这里插入图片描述
复制生成后的 ssh key,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,添加生成的public key 添加到仓库中。

在这里插入图片描述
在这里插入图片描述
添加后,在终端(Terminal)中输入

ssh -T git@gitee.com
首次使用需要确认并添加主机到本机SSH可信列表。若返回 Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access. 内容,则证明添加成功。

win下的公钥具体产生地址:
在这里插入图片描述
可能会遇到的问题:

The authenticity of host 'gitee.com (212.64.62.183)' can't be established.
在这里插入图片描述
原因:文件夹内缺少known_hosts文件

解决方案:输入yes回车,生成缺少的known_hosts文件

验证:

ssh -T git@gitee.com

在这里插入图片描述
使用SSH:
在这里插入图片描述

git init
git remote add origin xxxx
git push -u origin "master"

仓库公钥和可部署公钥

为了便于用户在==多个项目仓库下使用一套公钥==,免于重复部署和管理的繁琐,Gitee 推出了 ==「可部署公钥」== 功能,支持在一个仓库空间下使用当前账户名下/参与的另一个仓库空间的部署公钥,实现公钥共用。

部署公钥允许以只读的方式访问仓库,主要用于仓库在生产服务器的部署上,免去HTTP方式每次操作都要输入密码和普通SSH方式担心不小心修改仓库代码的麻烦。

部署公钥配置后的机器,==只支持clone与pull等只读操作==。如果您想要对仓库进行写操作,请 添加个人公钥

个人公钥的添加地址:
在这里插入图片描述

多人合作开发流程

在这里插入图片描述

  1. 首先项目经理初始化仓库建立好分支。一般会建立两个,一个master分支,一个develop分支。当然,也可能建立一个预发布版本的分支用于测试不如realse分支。
  2. 对个分支设置保护行为。
  3. 添加项目成员

小航的开发:

  1. 将项目克隆到本地。
  2. 切换至开发分支
  3. 在开发分支上新建一个单独的功能分支,进行开发。
  4. 开发完成,合并到开发分支,如果功能分支没用了,可以删除。
  5. 先拉取新代码(git pull),其实就是合并,发生冲突,解决冲突。
  6. 解决完冲突,将代码推送至代码托管平台。

1、代码审查设置

在这里插入图片描述

2、选择项目分支保护

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

3、添加开发者

在这里插入图片描述
以上涉及到的Git命令:

>>> git clone 仓库地址
>>> git checkout develop
# 切换到`develop`分支
>>> git checkout -b feature-discuss
# 分出一个功能性分支
>>> touch discuss.java
# 假装discuss.java就是我们要开发的功能
>>> git add .
>>> git commit -m 'finish discuss feature'
# 提交更改,多次测试以后
>>> git checkout develop
# 回到develop分支
>>> git merge feature-discuss
# 把做好的功能合并到develop中
>>> git branch -d feature-discuss
# 删除功能性分支
>>> git push origin develop
# 把develop提交到远程仓库中

跨团队合作开发

在这里插入图片描述
项目组成员的开发保持不变。

跨团队成员的合作方式:

  1. 将代码fork到自己的仓库,同样可以进行相关的配置。
  2. 项目克隆到本地。
  3. 可以担任开发也可以多人开发。
  4. 开发完成后合并到自己的仓库
  5. 发起pull request请求给源仓库管理员
  6. 源仓库管理员进行code review(重新检查代码,审核代码),测试审核,通过则进行合并。

源仓库的构建:
这一步通常由项目发起人(项目管理员)来操作,源仓库为op/Chanjet_Asset_Management,并初始化两个分支master和develop.

开发者fork仓库到自己的账户下,作为自己开发所用的仓库:

在这里插入图片描述
把自己开发者仓库clone到本地

 >>> git clone 地址

重点

不要随便动别人的代码,写代码和提交之前先拉去最新的代码!
不要随便动别人的代码,写代码和提交之前先拉去最新的代码!
不要随便动别人的代码,写代码和提交之前先拉去最新的代码!

  1. 切换分支前先提交本地的修改
  2. 代码及时提交,提交过了就不会丢

六、Idea使用Git

配置

在这里插入图片描述

Gitee插件

在这里插入图片描述

从远程仓库拉项目

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

控制台查看分支提交等信息

查看分支

在这里插入图片描述
创建分支
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


建议这样创建分支:

示例1:
在这里插入图片描述
示例2:
在这里插入图片描述

针对某个具体的进行创建分支


分支的第三种操作:
在这里插入图片描述

切换分支
在这里插入图片描述
合并分支

在这里插入图片描述
项目回滚

找到要回滚的项目:
在这里插入图片描述
在这里插入图片描述
得到快照的ID号:
bbdf1b8f430df543218d92568994bc6324338384
在这里插入图片描述
在这里插入图片描述

提交代码

在这里插入图片描述
commit→pull→push
在这里插入图片描述
注意:如果是第一次提交代码,直接push,否则先pull,再push

在这里插入图片描述

解决冲突

在这里插入图片描述
解决冲突完后,别忘了加入暂存区,然后提交到本地仓库,最后推送到远程仓库

可能会遇到的问题:


提交项目到gitee报错Push to origin/master was rejected的解决办法

在项目文件夹下依次输入以下命令:

git pull
git pull origin master
git pull origin master --allow-unrelated-histories

git push -u origin master -f

IDEA配置.gitignore不生效的问题

原因:.gitignore只能忽略未被track的文件,而git本地缓存。如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

解决:先把本地缓存删除(改变成未track状态),然后再提交

在项目中右键点击 Git Bash Here进行命令窗口输入

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

IDEA常用Git操作入口

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

IDEA集成GitBash作为Terminal

在这里插入图片描述

七、加速访问GitHub

绑定hosts绕过DNS解析

  1. 找到hosts文件(win: C:\Windows\System32\drivers\etc linux: /etc/hosts)
  2. 查询ip传送门

    获得 github.com 和 github.global.ssl.fastly.net 域名的ip地址。
    ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/e702a86a0c764b998f57ce13a8f979a3.png)
    ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/5a6ba90c27354eacbc4a9da5c3db7744.png)
    得到ip地址:    

    140.82.112.3
    199.232.69.194

  3. 添加hosts文件

140.82.112.3 github.com
199.232.69.194 github.global.ssl.fastly.net

4. 刷新DNS缓存。如windows下,在cmd窗口,执行 ipconfig/flushdns。
    ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/13d4db38e719460e97a4c70ee6fd64f2.png)
4. 重启浏览器,进入网页 `https://github.com/`

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/783f2b0527e644aca88929d6aec3fae5.png)
相关文章
|
开发工具 git
git简单总结
git简单总结
|
Shell 网络安全 开发工具
git使用问题总结
git使用问题总结
208 0
git使用问题总结
|
网络安全 开发工具 git
Git常用语法总结及分支冲突
Git常用语法总结及分支冲突
139 0
|
缓存 开发工具 git
Git常用命令总结
Git常用命令总结
127 0
|
开发工具 git
Git——常用命令的总结
Git——常用命令的总结
Git——常用命令的总结
|
机器学习/深度学习 缓存 开发工具
Git的学习总结
git的学习笔记
|
Linux 开发工具 git
14 Git 使用问题总结
问题分析 : could not lock config file %HOMEDRIVE%%HOMEPATH%/.gitconfig 的问题 在我的电脑上 HOME 的值是 %HOMEDRIVE%%HOMEPATH% 竟然不识别。已知 %homedrive% 指操作系统所在盘默认为C:,%HOMEPATH% 指的是用户所在目录,举例说明\Users\zhangsan。 所以手动改成 C:\Users\hp 即可。
406 0
14 Git 使用问题总结
|
开发工具 git
git使用手册(六)常用操作总结
git使用手册(六)常用操作总结
119 0
|
消息中间件 前端开发 JavaScript
开发人员必知的Git技能及Git工作流总结!(四)
大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
开发人员必知的Git技能及Git工作流总结!(四)
|
开发工具 git Windows
开发人员必知的Git技能及Git工作流总结!(三)
大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
开发人员必知的Git技能及Git工作流总结!(三)