前言
最近要开始正式进行融入团队开发,对于 Git 的使用一直也不是特别清楚,基本的多人协作也比较模糊。所以照着廖雪峰老师的 Git 教程 系统的学习了一下,内容还是十分清晰有用的。这里做一些简单归纳,具体命令细节可以查看原文。
当然,大多数情况我们可能并不直接使用命令行操作 Git,之前用过一款图形化工具 SourceTree 推荐给大家,当然现在 VsCode 和 IDEA 也都提供可视化操作,也十分方便。
I. 安装Git
各个平台的下载安装应该较为简单,直接参考官网。
安装完git后,需要进行最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
# 查看是否设置成功
$ git config --list
因为 git 是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意
git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
具体仓库的设置可以进入具体仓库的 .git
文件夹所在目录下,命令行输入:
$ git config user.name "Your Name"
$ git config user.email "email@example.com"
或者直接修改 .git/config
文件:
[user]
name = Your Name
email = email@example.com
II. 相关概念
- 工作区:代码项目所在根目录下,除
.git
文件夹外 - 版本库/仓库:
.git
文件夹就是仓库(以前一直以为仓库是工作区+真正的仓库,这是错误的)- 暂存区:stage,工作区的改动经过 add 后就可以加入暂存区
- 分支:默认会创建出 master 分支
III. 相关操作
创建提交
# 进入项目根目录下,创建仓库
$ git init
# 添加文件到仓库命令:git add 文件相对路径,如果是文件夹那么递归add该文件夹下全部文件
# 例如在项目根目录下创建了doc文件夹,文件夹下创建start.md文件,则:
$ git add doc/start.md
# 查看文件改动
git diff # 所有文件改动
git diff 具体文件 # 详细展示具体文件改动
# 查看add的文件
$ git status
# 撤回add文件
$ git reset HEAD # 撤销所有add内容
$ git reset HEAD XXX/XXX/XXX.java # 对某个文件进行撤销
# 将文件提交到仓库命令:git commit -m "该次提交信息"
$ git commit -m "first commit"
# 查看历史提交记录
$ git log
版本回退
# 版本回退
$ git reset --hard HEAD^ # 上一个版本
$ git reset --hard HEAD^^ # 上上个版本
$ git reset --hard HEAD~10 # 上10个版本
# 回退完了再想回来(需要想退回来的那个版本的commitid)
# 命令格式: git reset --hard commitid前几位即可
$ git reflog # 记录每一次命令操作,用于查找对应版本的commitid
$ git reset --hard 219c9
撤销修改
# 当想要放弃工作区的某个文件的修改,命令:git checkout -- file
$ git checkout -- doc/start.md
# 上面命令意思是把start.md文件在工作区的修改全部撤销,这里有两种情况:
# 一种是start.md自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
# 一种是start.md已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
# 总之,就是让这个文件回到最近一次git commit或git add时的状态。
# 当想要放弃暂存区的某个修改
$ git reset HEAD file # unstage操作
# 然后就回到上面的状态了——放弃工作区的修改
删除文件
# rm代表要从仓库删除某个文件,然后commit
$ git rm /doc/start.md
$ git commit -m "xxx"
本地与远程仓库
# 本地仓库推送远程
$ git remote add origin git@github.com:xxxx/xxxx.git # 关联远程仓库
$ git push -u origin master # 推送本地仓库master分支
# 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
# 远程仓库拉取本地
$ git clone 远程仓库地址
# 拉取远程仓库分支,命令:git checkout -b 分支 远程分支
$ git checkout -b dev orgin/dev
# 拉取远程仓库分支最新提交
$ git pull
# 查看远程仓库信息
$ git remote
$ git remote -v
分支管理
# 从当前分支创建新分支并切换,命令:git checkout -b 分支
$ git checkout -b dev
# -b参数表示创建并切换,相当于 git branch dev 加上 git checkout dev
# 查看当前所在分支
$ git branch
# 在新分支上操作完,切回某一分支,命令:git checkout 分支名
$ git checkout master
# 切换回master会发现dev分支的操作没有了
# 目标分支合并到当前分支,命令:git merge 目标分支
$ git merge dev # 合并dev分支到当前master分支
# 删除某一分支,命令:git branch -d 分支
$ git branch -d dev # 合并完后的分支可以删除
$ git branch -D dev # 强制删除
解决冲突
# 当需要合并的两个分支有冲突时,原理就是再继续修改,时间线向前推进焦点
$ git merge feature1 # 当合并feature1到master,出现冲突
# 改完冲突,便可以add/commit了
$ git add doc/start.md
$ git commit -m "conflict fixed"
# 查看分支合并图
$ git log --graph
# 合并分支禁用Fast forward模式,Fast forward模式合并后删除分支会丢失分支信息,
# 看起来就是一条线,没有合并相交
# 命令:git merge --no-ff -m "comment" 分支
$ git merge --no-ff -m "your merge comment" dev
保存现场
# 场景示例:https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136
# 可以利用stash保存工作区现场,暂时清空工作区,最后进行恢复
$ git stash
# 恢复现场
$ git stash apply # 恢复后,stash内容并不删除,需要用git stash drop来删除
$ git stash pop # 恢复的同时把stash内容也删了
# 查看所有的stash
$ git stash list
标签管理
# git tag <name>就可以打一个新标签
$ git tag v1.0 # 对当前最新commitid打标签
$ git tag -a v1.0 -m "tag comment" # 当前标签的comment
$ git tag v0.9 f52c633 # 对指定的commitid进行打标签
# 查看所有标签
$ git tag
# 查看某一标签信息
$ git show v0.9
# 删除本地某一标签
$ git tag -d tagname
# 推送本地标签到远程
$ git push origin tagname
$ git push origin --tags # 一次性推送全部尚未推送到远程的本地标签
# 删除远程标签
$ git tag -d tagname # 先删除本地
$ git push origin :refs/tags/tagname # 再删除远程仓库
IV. IDEA可视化操作
- 这里贴一个文档:IDEA之Git分支以及Stash使用