简单Git使用入门

对着背影说爱祢 提交于 2020-08-17 23:36:27

简单Git使用入门

1. 基本信息

1.1. git官网

Git是林纳斯主持开发的一个免费的、开源的分布式版本控制系统

网址: https://git-scm.com/

安装只需一直下一步即可

1.2. git版本控制流程结构

graph LR
A[git init] -->B(工作区)
    B --> C[git add]
    C --> D(暂存区)
    D --> E[git commit]
    E --> F(本地仓库)
    F --> G[git push]
    G --> h(远程仓库)

若流程图不能显示,内容如下:

  1. git init
    • 本地仓库(工作区)
  2. git add
    • 暂存区
  3. git commit
    • 本地仓库
  4. git push
    • 远程仓库

1.3. git远程仓库基本交互

本地文件夹: git clone => 克隆远程仓库并初始化git

本地: git push => 推送本地仓库到远程仓库

本地: git pull => 拉取远程仓库到本地

邀请成员加入开发团队

通常在项目远端仓库的Settings -> Manage access -> Invite a collaborator

可能需要被邀请者同意(内部Git Lab通常不需要)

2. 使用

2.1. 使用Git Bash

首先在你要建立仓库的文件夹中右键打开Git Bash

设置中文:右键 Git Bash界面->Options...->Text->Character set->选择UTF-8

请不要随意直接更改配置文件,这可能造成和IDEA的集成出问题

2.2. 初始化本地仓库或克隆远程仓库

#下面的命令执行其中一个后在当前文件夹下创建 .git 文件夹则表示初始化完成,该目录下文件请勿随意操作


#---------------初始化一个崭新的仓库---------------
#初始化一个git仓库
git init

#给远程仓库创建别名(通常都约定为origin)
git remote add origin 远程仓库地址(如https://github.com/someone/some_resp.git)

#查看远程仓库别名
git remote -v

#第一次推送(一般除了第一次都不推荐直接操作master分支)
#第一次推送通常会提示 * [new branch]  master -> master
git push origin master

#查看所有分支
git branch -a

#---------------克隆一个仓库,操作非常简单就clone就好了---------------
#或者克隆远程仓库(自动初始化并自动给远程仓库起别名[这个别名是仓库推送者建立的,通常为origin])
git clone 远程仓库地址(如https://gitee.com/someone/some_resp.git)


#---------------创建本地仓库后可能的操作---------------
#添加用户名和邮箱(push前必须设置,也可以添加--global以全局应用,但通常都是每个仓库单独设置)
git config user.name someone
git config user.email someone@somemail.com
#查看设置信息
git config --list

#创建一个自己的分支
git branch someone_b
#切换到自己的分支,以后所有的更新都应在自己的分支上操作
git checkout someone_b
#每次 push 前都应先pull以在本地解决可能的冲突,避免远端合并时冲突并被追责 (通常上班第一件事就是pull)
git pull
#将代码推送到远端自己的分支(没有会自动新建),再在WEB端创建一个 merge request 以请求代码合并
#通常不建议直接推送到master,即使有这个权限也不要这样,直接推送到master是不明智且具有风险的(出问题就会被直接追责,即使项目经理自己一般都不会直接推到master,而是在WEB端merge)
git push -u origin someone_b

#更新远程分支列表
git remote update origin --prune
#添加远程仓库(如添加一个ssh方式的提交(ssh的优势是免密(一个密钥多个远端都可使用,不用管理多个凭据)),别名为origin_ssh)
git remote add origin_ssh 远程仓库地址(如git@gitee.com:someone/some_resp.git)


#---------------WEB端merge(推荐)---------------
#傻瓜化操作,一键完成,除非有冲突则需要比对并重新push,否则都是WEB端操作
#diff等方式进行比对
#选择要保留的更新
#push

#---------------本地进行代码合并主分支(不推荐)---------------
#先切换到主分支
git checkout master
#拉取代码,查看是否冲突
git pull origin master
#推送代码到主分支
git push origin master

2.3. 常用命令

2.3.1. 帮助命令(help)

#帮助概览
git --help

#查看某个命令相关的帮助(会打开浏览器,但访问的是本地git安装目录下的html)
git 命令 --help

#查看add命令相关的帮助
git add --help

2.3.2. 将修改或添加的文件及目录添加至暂存区(add)

# 添加一个文件到暂存区(删除一个文件并加入版本控制也是add)
git add 文件路径
# 添加全部有改动的文件到暂存区
git add -A
#-------------------------------------
# 每次完整的修改都应添加到暂存区,以避免出现让自己追悔莫及的情况

2.3.3. 将暂存区提交至本地仓库(commit)

# 提交暂存区所有(或选定)文件到本地仓库,每次提交都应有完整有意义的注释
git commit -m '注释内容' [文件路径]

# 直接将工作区的改动(不包含新增文件)提交至本地仓库,当然也会同时提交暂存区的内容
git commit -a -m '注释内容(双引号或单引号都行)'

2.3.4. 查看状态(status)

#红色标识的是未纳入版本控制的文件
#绿色标识的是添加至暂存区中的文件
#每次提交前都应通过这个命令查看是否有遗漏
git status

2.3.5. 查看日志(log)

#查看全部日志
#一页无法显示的情况下会分页
#左下角会有一个冒号
#输入 空格 => 下一页
#输入 b => 上一页
#输入 q => 退出日志文件
#文档结尾用(END)表示
git log


#将一次日志同行展示
git log --pretty=onelint

#更常用的是oneline,他会将索引截取很少一部分展示
git --oneline

#涉及到可能回退时通常使用reflog命令查看距离HEAD指针的版本偏移,展示方式同oneline
git reflog

2.3.6. 回退版本或前进版本以及误删找回(reset)

#reset是直接操作HEAD指针,因此它可以回退add commit push三个命令的后果
#reset风险:push后会销毁他前面的所有版本,这可能造成无法挽回的后果,
#如果reset的版本涉及到已经merge之前的版本则要慎重

#首先查看要回退的版本索引(打头黄色的随机字符串),
#尤其要注意要回退的版本是否越过了merge
git reflog

#将当前HEAD指针转移到目标版本索引(即回退或者前进,同时也就具有误删找回的功能)
# --hard 表示重置指针的同时重置暂存区和工作区(即实际的代码)
# 通常我们都是使用hard参数
git reset --hard 版本索引

#其他参数(一般用不到或者永远用不到)
# --soft 表示仅仅重置指针(暂存区和工作区都不变)
# --mixed 表示重置指针时同时重置暂存区(工作区不变)
#还有一个命令 git revert
#但revert命令会让历史记录不干净(不销毁前面的版本数据),因此不常用,
#除非是你要回退已经被merge的代码(因为reset销毁数据,包括别人合并的)

2.3.7. 代码比对(diff)

# 比较单个文件在暂存区和工作区的不同之处
git diff 文件路径

# 比较全部文件
git diff

# 比较单个文件暂存区和本地仓库的不同之处
git diff 版本索引 文件名

#推荐使用 Git GUI 或者 git小乌龟 或者 IDEA的Git集成(最方便实用)进行代码比对

2.3.8. 推送到远端(push)

#通常不建议直接操作master
#一定要避免提交冲突代码,解决远端冲突是非常头疼的,
#有的公司会不论任何理由追责,不要给自己加任务量!!!

#首先创建并切换到本地分支(someone_branch为分支名称,
#通常以项目模块或者开发者自己的名称命名)
git checkout -b someone_branch

#一定要先拉取代码避免冲突
git pull
#再更新代码
#vim some_file...?
#一定要再拉取代码避免提交冲突代码
#(如有冲突可以利用IDEA的集成进行解决,非常方便)
git pull
#最后推送代码到远端自己的分支(没有会新建)
git git  push -u origin someone_branch
#在远端WEB页面新建一个 merge request 请求合并代码

3. 其他

3.1. IDEA集成Git

通常IDEA会自动集成,如没能自动集成,则

Settings -> Version Control -> Git : Path to Git executable

在文件(文件夹)或编辑区右键->Git内集成了Git大部分操作

常用的有

Git -> Commit Directory... Git -> Resposity -> push... / pull... / clone

IDEA的Git代码比对做的非常好,解决冲突通常都是通过IDEA完成

直接修改Git的配置文件(如修改字符集)可能导致IDEA中无法commit和push!

3.2. 避免冲突!

一定要避免提交冲突代码,解决远端冲突是非常头疼的,有的公司会不论任何理由追责,不要给自己加任务量!!!

每次操作都应在自己的分支操作

git checkout -b 自己的分支名称

每次更新代码和push到远端前都应先pull

git pull

每次推送都应推送到远端自己的分支,再申请合并

git git  push -u origin 自己的分支名称

3.3. 跨团队协作(Fork)

  1. 进入到其他团队的远端仓库(如https://gitee.com/someone/some_resp.git)

  2. 点击Fork,就会复制该仓库到自己的帐号下(和docker一样,实际上是拉了一个索引)

  3. clone自己帐号下Fork到的项目

  4. 更新和提交及推送没有任何区别

  5. 申请跨团队代码合并需要先发起 pull request

  6. 审核成功后即可 merge

3.4. ssh免密

#进入用户目录
cd ~
#生成密钥(someone@somemail.com可以当做是用户标识,不一定是邮箱)
#通常我们都不需要口令直接 enter三次 下一步到头即可
ssh-keygen -t -rsa -C someone@somemail.com
#查看生成物
ls
cd .ssh
cat id_rad.pub
#将内容复制到远端服务器
#通常在 Settings -> SSH and GPG keys -> New SSH key

#查看本地版本控制中远端别名,通常项目在第一次push的时候就给ssh方式push起了别名
git remote -v
#如果没有ssh提交方式的别名,给ssh的push方式起别名,如下
git remote add origin_ssh 远程仓库地址(如git@gitee.com:someone/some_resp.git)
#之后通过该别名push即可免密
git push origin_ssh 远端分支

3.5. 收藏项目

  1. 进入项目目录
  2. 点击 Star 仅收藏
  3. 点击 Watch 收藏同时监控

如果要使用别人的开源项目,应该选择 Watch ,以及时掌控相关消息,如别人提交的严重BUG

3.6. 无法提交的解决方案

###这个方法只解决因为两个仓库有不同的历史(共同祖先)造成的无法提交问题###
#拉取时允许历史不同步(分支不一定是master)
git pull origin master --allow-unrelated-histories
#推送时禁用检查(可能导致远程存储库丢失提交,请谨慎使用)(分支不一定是master)
git push -u origin master -f
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!