励志
It's what I was meant to do. And nothing's gonna stop me.
这是我命中注定要做的,没什么能够阻止我。
一、Git学习路线
学习时长建议:3天
二、Git安装
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
拓展:为常用指令配置别名
有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。
- 打开用户目录,创建 .bashrc 文件
部分windows系统不允许用户创建点号开头的文件,可以打开gitBash,执行
touch ~/.bashrc
- 在 .bashrc 文件中输入如下内容:
#用于输出git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
alias ll='ls -al'
打开gitBash,执行
source ~/.bashrc
解决GitBash乱码问题:
- 打开GitBash执行下面命令
git config --global core.quotepath false
- ${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 工作流程如下:
- 在工作区中修改文件。
- 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
- 提交更新,找到暂存区的文件,将快照永久性存储到 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工作流程图
命令如下:
- clone(克隆): 从远程仓库中克隆代码到本地仓库
- checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
- add(添加): 在提交前先将代码提交到暂存区
- commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
- fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
- pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于
fetch+merge
- 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"文件,此文件有如下规则:
- 忽略文件中的空行或以井号 ==(#)开始== 的行将会被忽略。
- 可以使用Linux ==通配符==。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
- 如果名称的最前面有一个感叹号 ==(!)==,表示==例外规则==,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.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.解决冲突
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:
- 处理文件中冲突的地方
- 将解决完冲突的文件加入暂存区(add)
- 提交到仓库(commit)
五、码云的使用
既然git是一个团队合作开发的工具,那本地的仓库肯定不能满足团队开发的需求!就必须要有一个远程仓库统一管理我们的代码。
作者的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等只读操作==。如果您想要对仓库进行写操作,请 添加个人公钥
个人公钥的添加地址:
多人合作开发流程
- 首先项目经理初始化仓库建立好分支。一般会建立两个,一个master分支,一个develop分支。当然,也可能建立一个预发布版本的分支用于测试不如realse分支。
- 对个分支设置保护行为。
- 添加项目成员
小航的开发:
- 将项目克隆到本地。
- 切换至开发分支
- 在开发分支上新建一个单独的功能分支,进行开发。
- 开发完成,合并到开发分支,如果功能分支没用了,可以删除。
- 先拉取新代码(git pull),其实就是合并,发生冲突,解决冲突。
- 解决完冲突,将代码推送至代码托管平台。
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提交到远程仓库中
跨团队合作开发
项目组成员的开发保持不变。
跨团队成员的合作方式:
- 将代码fork到自己的仓库,同样可以进行相关的配置。
- 项目克隆到本地。
- 可以担任开发也可以多人开发。
- 开发完成后合并到自己的仓库
- 发起pull request请求给源仓库管理员
- 源仓库管理员进行code review(重新检查代码,审核代码),测试审核,通过则进行合并。
源仓库的构建:
这一步通常由项目发起人(项目管理员)来操作,源仓库为op/Chanjet_Asset_Management,并初始化两个分支master和develop.
开发者fork仓库到自己的账户下,作为自己开发所用的仓库:
把自己开发者仓库clone到本地
>>> git clone 地址
重点
不要随便动别人的代码,写代码和提交之前先拉去最新的代码!
不要随便动别人的代码,写代码和提交之前先拉去最新的代码!
不要随便动别人的代码,写代码和提交之前先拉去最新的代码!
- 切换分支前先提交本地的修改
- 代码及时提交,提交过了就不会丢
六、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解析
- 找到hosts文件(win: C:\Windows\System32\drivers\etc linux: /etc/hosts)
获得 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添加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)