简单Git使用入门
1. 基本信息
1.1. git官网
Git是林纳斯主持开发的一个免费的、开源的分布式版本控制系统
安装只需一直下一步即可
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(远程仓库)
若流程图不能显示,内容如下:
- git init
- 本地仓库(工作区)
- git add
- 暂存区
- git commit
- 本地仓库
- 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)
-
进入到其他团队的远端仓库(如https://gitee.com/someone/some_resp.git)
-
点击Fork,就会复制该仓库到自己的帐号下(和docker一样,实际上是拉了一个索引)
-
clone自己帐号下Fork到的项目
-
更新和提交及推送没有任何区别
-
申请跨团队代码合并需要先发起 pull request
-
审核成功后即可 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. 收藏项目
- 进入项目目录
- 点击 Star 仅收藏
- 点击 Watch 收藏同时监控
如果要使用别人的开源项目,应该选择 Watch ,以及时掌控相关消息,如别人提交的严重BUG
3.6. 无法提交的解决方案
###这个方法只解决因为两个仓库有不同的历史(共同祖先)造成的无法提交问题###
#拉取时允许历史不同步(分支不一定是master)
git pull origin master --allow-unrelated-histories
#推送时禁用检查(可能导致远程存储库丢失提交,请谨慎使用)(分支不一定是master)
git push -u origin master -f
来源:oschina
链接:https://my.oschina.net/u/4075062/blog/4503162