Day81.Git: 常用命令、分支、Gitee远程库、团队冲突、SSH公钥、IDEA集成Git

目录

Git概述

一、版本控制(Version Control)

版本控制系统

二、Git工作机制、安装

三、Git常用命令 ★

四、Git分支命令 | 分支冲突 ★

五、Git代码托管服务 (远程库) ★

Git远程工作机制 

六、Github/Gitee 步骤和命令

七、团队协作冲突

 如何避免冲突

八、跨团队协作 (Fork)

九、SSH免密登录

十、IDEA集成Git


Git概述

一、版本控制(Version Control)

版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。

版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本方便版本切换无论对于个人、团队开发,版本控制都很有必要。

这种原始的版本管理系统很显然有明显的缺陷:

  • 文件大量冗余,占用空间多。文件很大,但差异很小,问题更严重
  • 从文件名看不出各个版本的差异之处,不易找出某个需要的历史版本

为了有效的解决版本控制问题,版本控制系统应运而生

版本控制系统的作用

版本控制系统

1. 本地版本控制系统

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

缺点

  • 适合个人使用,不适合团队协同开发;
  • 版本库只有一份,容易出现单点故障,会丢失历史版本。

2. 集中版本控制系统 (SVN)

集中化的版本控制系统诸如 CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。

 

缺点

  • 版本库只有一份,单点故障问题没有解决
  • 必须联网才能工作,如果不连网或者服务器宕机,用户无法下载和提交代码,看不到历史版本等。 

3. 分布式版本控制系统 (Git)

除需一个版本控制服务器作为远程仓库存储历史版本记录外,服务器的所有版本信息全部同步到每个用户机器的本地库上,比如GIT、Mercurial、Bazaar、Darcs等。

这样就可以在本地查看所有版本历史,可以离线在本地提交,在连网时再提交到远程库中

优点:

  • 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
  • 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)

二、Git工作机制、安装

 Git是目前世界上最先进的分布式版本控制系统。Linus:Liunx的作者

Git本地工作机制 

1. Git代码托管中心 (远程库)

代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库

2. Git安装

官网:Git

下载地址:Git for Windows

 

Git Bash终端里输入git --version查看git版本,如图所示,说明Git安装成功。   

3. 工作区、版本库、暂存区概念

  1. 工作区(Working Directory):就是你电脑本地硬盘目录,一般是项目当前目录
  2. 暂存区(stage):一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
  3. 版本库(本地库Repository):工作区有个隐藏目录.git,它就是Git的本地版本库
  4. 分支(Branch):Git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD


三、Git常用命令 ★

命令名称

作用

git config user.name

查看设置的用户名

git config [--global user.name] 用户名

设置用户签名 (修改用户名)

git config [--global user.email] 邮箱

设置用户签名

git init

初始化本地库

git status  -s(更简洁)

查看工作区和暂存区状态

git add 文件名

添加到暂存区

git commit -m  "日志信息" 文件名

提交到本地库

git commit -am  "注释内容(日志)" 

add commit 同时进行操作同时同时进行

(新增文件不可以)

git reflog [文件名]

查看历史版本信息

(显示本地库操作历史记录 如 commit、reset、delete)

git log [文件名]  [--pretty=oneline]

查看版本详细信息

(只显示本地库commit的历史记录)

git log a.txt查看某个文件日志

git reset --hard 版本号

版本穿梭  (硬回退)

git reset --hard HEAD~*回退 * 个版本 0

分支命令↓

作用

git branch 分支名

创建分支

git branch -v

查看分支

git switch分支名

git checkout分支名 <=git2.22

切换分支

git merge 分支名

把指定的分支合并到当前分支

git branch -d 分支名

删除分支(内容已经完成合并)

git branch -D  分支名

强制删除分支(有没有合并的内容

Github/Gitee 命令

作用

git remote -v

查看当前所有远程地址别名

git remote add 别名 远程地址

起别名

git clone 远程地址 [文件夹名]

将远程仓库的内容克隆到本地

git push 别名 分支

推送本地分支上的内容到远程仓库

git pull 远程库地址别名 [远程分支名]

将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并

1、设置用户签名 (修改用户名)

git config user.name  查看用户名

git config --global user.name 用户名

git config --global user.email 邮箱

签名的作用是区分不同操作者身份,Git首次安装必须设置用户签名,否则无法提交代码。

--global 表示全局属性,所有的git项目都会共用属性

  • 查看配置信息:git config --list
  • 在当前登录的系统用户路径下,生成~/.gitconfig文件,里面可以看到刚刚设置的信息。如果不用命令设置,也可以直接打开文件进行设置。

※注意:这里设置用户签名和将来登录GitHub (或其他代码托管中心) 的账号没有任何关系。

2、初始化本地库 (git init)

结果查看:ll -a

 

提交Git本地版本库分两步执行

第一步 用“git add”把文件纳入Git管理,实际是把本地文件修改添加到暂存区

第二步 用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支,

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以commit就是往master分支上提交更改。

可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。一旦提交完后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。即:nothing to commit (working directory clean)。

3、查看本地库状态  (git status)

首次查看,无文件

新建文件,再次查看

git status –s 使输出信息更加简洁?? : 表示未跟踪状态

Git工作目录下的文件状态信息:

  • §Untracked 未跟踪(未被纳入版本控制)
  • §Tracked 已跟踪(被纳入版本控制)
  • §Unmodified 未修改状态
  • §Modified 已修改状态
  • §Staged 已暂存状态

这些文件的状态会随着我们执行Git的命令发生变化

  • 红色 表示新建文件或者新修改的文件,都在工作区,未添加到暂存区
  • 绿色 表示文件在暂存区

可以使用git status –s 使输出信息更加简洁。?? : 表示未跟踪状态

 4、添加(状态)到暂存区  (git add 文件名)

git add . 表示添加项目中所有文件到暂存区

5、提交本地库 (git commit -m "日志信息" 文件名)

commit 会生成一条版本记录,add只是添加暂存区,不会生成版本记录,建议多次add后,一次性commit,避免每次add都commit产生版本信息爆炸。

6、修改文件(hello.txt)

7、将修改的文件再次添加暂存区

git commit -am "注释内容"  简化,am表示 add 和 commit 操作同时同时进行(新增文件不可以!)

8、历史版本 (git reflog | git log)

status显示的是暂存区和工作区的状态、历史版本查看的是本地库的

git reflog [文件名] 查看版本信息显示本地库所有操作的历史记录,比如commit、reset

git log  查看版本详细信息只显示本地库commit的历史记录

  • git log   查看所有文件日志
  • git log a.txt 查看某个文件日志
  • git log --pretty=oneline 如果日志很多,可以在一行显示

9、版本穿梭 (git reset --hard)

git reset --hard 版本号

git reset --hard 版本号

git reset --hard HEAD^  一次回退一个版本,一个^代表一个版本

git reset --hard HEAD~2  同上,2表示回退2个版本

三种情况下的回退操作

未add,未commit (修改无效,回退到最后一次提交的数据)

git checkout-- a.txt 撤销修改(还原原来的文件)  <=Git 2.22

git restore -- a.txt 撤销修改(还原原来的文件)  >=Git2.23

注意:-- 可以省略 但不可以--a.txt  空格不可少

已add,未commit  软回退 (只是将文件的状态进行了回退)

git add a.txt

git reset a.txt 软回退:

git reset 软回退:

已add,已commit 硬回退 (回退到指定版本,内容变化)

git reset --hard 版本号

git reset --hard HEAD^ 一次回退一个版本,一个^代表一个版本

git reset --hard HEAD~n   回退n次操作

 

10、删除文件 (文件删除也可以回退)

  • 手动拷贝图片java.jpg到工作空间目录,并查看目录列表:ls -l
  • 添加:git add java.jpg
  • 提交:git commit -m "新建图片" java.jpg
  • 删除图片:rm java.jpg
  • 添加:git add java.jpg
  • 提交:git commit -m "删除图片"
  • 回退:git reset --hard HEAD^
  • 文件不是被删除了吗?怎么又回来啦!呵呵…
  • 处处留痕:git reflog

注意:rm java.jpg 的作用是删除工作区的文件,暂存区不知道;

git add java.jpg,将工作区对java.jpg的删除告诉暂存区。

git commit -m "删除图片" 将删除java.jpg告诉本地库

其中前两步可以简化为 git rm java.jpg ( 从工作区和暂存区删除文件Remove files from the working tree and from the index)  

或者后两步可以简化为 git commit -am "删除图片"

删除的图片回来了

四、Git分支命令 | 分支冲突 ★

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)

分支的好处

同时并行推进多个功能开发,提高开发效率

各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

命令名称

作用

git branch 分支名

创建分支

git branch -v

查看分支

git switch分支名

git checkout分支名 <=git2.22

切换分支

git merge 分支名

把指定的分支合并到当前分支

git branch -d 分支名

删除分支(内容已经完成合并)

git branch -D  分支名

强制删除分支(有没有合并的内容

git checkout 的核心功能包括两个方面,一个是分支的管理,一个是文件的恢复。对用户造成了很大的认知负担。这两个核心功能,git checkout 将逐渐退出历史舞台,未来将由 git switch 和 git restore 分别负责。

注意:如果没有代码没有提交,即保留在工作区(当前项目),切换到别的分支也能看到!

切换分之前一定先进行提交!!!

1、查看分支

2、创建分支

 

3、修改分支

4、冲突

注意:冲突中无法切换其他分支,必须先提交解决冲突

5、解决冲突:修改并提交

五、Git代码托管服务 (远程库) ★

前面我们已经知道了Git中存在两种类型的仓库,即本地仓库远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub码云GitLab等。

是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub

国内的一个代码托管平台,由于服务器在国内,所以相比GitHub,码云速度会更快

是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务

  • Gitee 简介

众所周知,GitHub服务器在国外,使用GitHub作为项目托管网站,如果网速不好的话,严重影响使用体验,甚至会出现登录不上的情况。针对这个情况,大家也可以使用国内的项目托管网站-码云。

码云是开源中国推出的基于Git的代码托管服务中心,网址是https://gitee.com/ ,使用方式跟GitHub一样,还是一个中文网站,如果你英文不是很好它是最好的选择。

官网:Gitee - 基于 Git 的代码托管和研发协作平台

Git远程工作机制 

第一次时使用clone,之后使用pull。 

  1. 仓库:
    1. 本地仓库:是在开发人员自己电脑上的Git仓库
    2. 远程仓库:是在远程服务器上的Git仓库
      1. 团队内协作
      2. 跨团队协作
  2. 操作:
    1. add:添加,就是将工作区代码添加到暂存区
    2. commit:提交,就是将本地暂存区代码上传到本地仓库中
    3. push:推送,就是将本地仓库代码上传到远程仓库
    4. clone:克隆,就是将远程仓库复制到本地  (第一次需要克隆)
    5. pull:拉取,就是将远程仓库代码下载到本地仓库

六、Github/Gitee 步骤和命令

命令名称

作用

git remote -v

查看当前所有远程地址别名

git remote add 别名 远程地址

起别名

git clone 远程地址

将远程仓库的内容克隆到本地

git push 别名 分支

推送本地分支上的内容到远程仓库

git pull 远程库地址别名 远程分支名

将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并

1、创建远程仓库别名

git remote -v    查看当前所有远程地址别名

git remote add [别名] [远程地址]  起别名

2、推送本地分支到远程仓库

3、另一个用户克隆远程仓库到本地

 4、修改内容并push到远程仓库

5、zhangsan 拉取远程库内容

 

七、团队协作冲突

在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。

1. 成员1修改文件,提交远程库

2. 成员2修改文件同一行,制造冲突。提交时:

有人提交了代码,需要先更新 (pull)。

更新时,出现了冲突

 

3. 经过协商,成员2 修改文件,解决冲突

 

 

4. 重新提交远程库

 

5. 成员1 下拉内容,更新代码

 如何避免冲突

容易冲突的操作方式

  1. 多个人同时操作了同一个文件
  2. 一个人一直写不提交
  3. 修改之前不更新最新代码 (第二天早上,拉取(poll)代码)
  4. 提交之前不更新最新代码   (下班,提交(push)代码)
  5. 擅自修改同事代码

减少冲突的操作方式

  1. 养成良好的操作习惯,先`pull`在修改,修改完立即`commit`和`push`
  2. 一定要确保自己正在修改的文件是最新版本的
  3. 各自开发各自的模块
  4. 如果要修改公共文件,一定要先确认有没有人正在修改
  5. 下班前一定要提交代码,上班第一件事拉取最新代码
  6. 一定不要擅自修改同事的代码

八、跨团队协作 (Fork)

流程:(zhangsan和lisi是一个团队的人,wangwu是另一个团队的人

第三方账号登录(wangwu),搜索某账号找到某项目(zhangsan),然后点击Fork按钮,这样就将该项目克隆一份到当前账号(wangwu)内,然后进行修改,提交pull request,告诉对方(zhangsan)已经修改了,请求合并;

1、Fork,复制一份到仓库 

2、完成功能后,发起Pull请求。

3、领导接收Pull request请求,测试审核

4、合并分支

九、SSH免密登录

我们可看到远程仓库中还有一个SSH的地址,因此我们也可以使用SSH进行访问。

使用https url克隆对初学者来说会比较方便,复制https url然后到git Bash里面直接用clone命令克隆到本地就好了,但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处。

1、任意文件夹下输入指令

ssh-keygen -t rsa -C a11104255@123.com

注意:这不是 git 的命令

 2、默认路径下生成了ssh文件夹,复制公钥内容

 

3、把公钥添加到个人公钥中

4、使用SSH链接克隆,完成免密登录

十、IDEA集成Git

1、配置Git忽略文件

a. 在用户家目录下,创建忽略规则文件xxxx.ignore(前缀名随便起,建议是git.ignore

# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

.classpath
.project
.settings
target
.idea
*.iml

b. 在.gitconfig文件中引用忽略配置文件(此文件在Windows的家目录中)

[user]

name = Layne

email = Layne@atguigu.com

[core]

excludesfile = C:/Users/asus/git.ignore

注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”

2、初始化本地库

 3、添加到暂存区

4、提交到本地库

 

 Perform code analysis:指的是提交前代码分析
Check TODO(Show ALL):如果代码有//TODO 注释,IDEA提交是会提示你是否有完成TODO里的内容。

5、切换版本

 6、创建分支

 7、切换分支

 8、合并分支

注意:如果没有代码没有提交,即保留在工作区(当前项目),切换到别的分支也能看到!

切换分之前一定要进行提交!!!

在master主分支,选择要合并的分支 

9、解决冲突 

10. 撤销Commit:Undo Commit,Revert Commit,Drop Commit区别

Idea使用 Undo Commit,Revert Commit,Drop Commit区别_会飞的鱼__的博客-CSDN博客_undocommit

Undo Commit
适用情况:代码修改完了,已经Commit了,但是还未push,然后发现还有地方需要修改,但是又不想增加一个新的Commit记录。这时可以进行Undo Commit,修改后再重新Commit。

如果已经进行了Push,线上的Commit记录还是会存在的;撤销了你Commit的这个动作。

Revert Commit
会新建一个 Revert “xxx Commit”的Commit记录,该记录进行的操作是将"xxx Commit"中对代码进行的修改全部撤销掉。

Drop Commit(慎用)
未push的Commit记录:会删除Commit记录,同时Commit中对代码进行的修改也会全部被删除

已push的Commit记录:区别在于线上的Commit记录不会被删除

11. 下拉pull项目后,冲突无法解决、回滚:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,你遇到了两个问题。第一个问题是关于gitee出现报错,错误信息为"git@gitee.com: Permission denied (public... fatal: Could not read from remote repository"。第二个问题是关于使用git remote add origin命令时出现的错误信息"fatal: not a git repository (or any of the parent directories): .git"。下面是对这两个问题的回答: 1. 关于gitee出现报错的问题,错误信息"git@gitee.com: Permission denied (public... fatal: Could not read from remote repository"通常是由于SSH密钥配置不正确或者没有正确设置访问权限导致的。解决这个问题的步骤如下: - 确保你已经生成了SSH密钥对,并将公钥添加到你的gitee账户中。你可以使用以下命令生成SSH密钥对: ```shell ssh-keygen -t rsa -b 4096 -C "[email protected]" ``` - 将生成的公钥(默认为~/.ssh/id_rsa.pub)添加到你的gitee账户中。你可以在gitee的设置页面中找到SSH公钥的选项。 - 确保你正在使用正确的SSH URL来克隆或推送代码。你可以在gitee上找到正确的SSH URL,它应该类似于"git@gitee.com:username/repository.git"。 - 如果你已经正确配置了SSH密钥并且仍然遇到问题,可能是由于访问权限不正确。你可以尝试使用以下命令更改文件和目录的权限: ```shell chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub ``` 2. 关于使用git remote add origin命令时出现的错误信息"fatal: not a git repository (or any of the parent directories): .git"。这个错误通常是因为你在执行该命令时不在一个git目录中。确保你在正确的目录下执行该命令,即包含.git文件夹的目录。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值