Git 新手指南
改变你的想法,你就改变了自己的世界。——文森特·皮尔
一. Git 简介
Git 是目前比较流行的分布式版本控制系统,与采用 SVN 进行管理的项目相比较更加灵活。
二. Git 组成
- 工作区
- 暂存区
- 本地仓库
三. Git 安装
3.1 Linux系统
3.2 Mac OS系统
- 在 App Store下载 Xcode
- git官网下载 Mac 版 Git
brew install git
3.3 Windows系统
- git官网下载 Windows 版 Git
四. Git 初始化
- 创建项目文件夹
mkdir my-project && cd my-project
- Git Init
git init
五. Git 提交
5.1 提交工作区
Git 项目文件修改后,修改内容被自动添加到工作区
5.2 工作区~暂存区
git add <filename|.>
- 将修改提交到暂存区
# 1. 创建文件 index.txt,并写入 Hello World
touch index.txt && echo 'Hello World' >> index.txt
# 2. 提交修改文件到暂存区
git add index.txt
# or 将所有被修改文件提交到暂存区
git add .
5.3 暂存区~本地仓库
git commit -m <description>
- 将暂存区内容提交到本地仓库并对本次提交做简要描述
git commit -m "这是一次测试提交"
# 修改最新commit的description信息
git commit --amend [-m "对最新commit的description修改"]
git commit --amend
- 将暂存区内容提交到本地仓库并对本次提交做简要描述
# 修改最近提交的 commit 描述信息
git commit --amend
# or
git commit --amend -m "update commit"
5.4 本地仓库~远程仓库
git push <远程主机名><本地分支名>:<远程分支名>
- 将本地分支修改条提交到远程分支上
# 将本地 master 分支的修改提交到远程 master 分支上
git push origin master:master
git remote -v
- 查看远程读写分支的 URL
origin https://github.com/xxx/xxx (fetch)
origin https://github.com/xxx/xxx (push)
六. Git 撤销
6.1 本地仓库~暂存区
git reset <mode> <commit>
- --mixed HEAD^:将 HEAD 重置为上一个版本,暂存区返回上个版本,工作区文件内容保持不变。
- --soft HEAD^:将 HEAD 重置为上一个版本,保留工作区和暂存区的内容
- --hard HEAD^:将 HEAD 重置为上一个版本,暂存区和工作区内容返回上一个版本
HEAD
为版本最新版本的指针- ^ 代表上一个版本
git reset --soft HEAD^
6.2 暂存区~工作区
git reset HEAD <filename>
- 将指定文件从暂存区返回工作区
git reset HEAD test.txt
git rm –cached <filename>
- 将文件从暂存区缓存里删除退回工作区
git rm --cached test.txt
6.3 撤销工作区
git checkout --f [<filename>]
- 将工作区所有修改撤销/将工作区指定文件修改撤销
# 所有
git checkout --f
# 指定文件
git checkout -- test.txt
# or
git checkout --f test.txt
七. 差异比较
git diff
- 默认:比较工作区与暂存区的内容
- HEAD:比较工作区与本地仓库 HEAD
- --cached:比较暂存区与本地仓库 HEAD
- commitId1 commidId2:比较两个commit之间的内容
git diff
git diff HEAD
git diff --cached
git diff 2a8a604 2a8a605
八. 本地仓库与远程仓库建立连接
8.1 创建私钥
# 查看 .ssh 目录
$ ls -l ~/.ssh
# 创建SSH key(如果第一步里的.ssh存在,那么请忽略这步)
$ ssh-keygen -t rsa -C "youreamil@example.com"
# 复制id_rsa.pub里文件内容
$ cat ~/.ssh/id_rsa.pub
8.2 添加SSH到GitHub
8.3 创建远程仓库并与本地仓库相关联
git remote add <远程仓库名> <rep_url>
- 让本地仓库员与远程仓库建立联系
# 与远程test仓库建立联系
$ git remote add origin git@github.com:SmithJson/test.git
# 将本地仓库推到test远程仓库master分支上
# -u只需要在第一次提交的时候添加
$ git push -u origin master
8.4 克隆远程仓库
git clone <rep_url>
- 克隆指定仓库
$ git clone git@github.com:SmithJson/test.git
TODO:后期修改
九. 分支管理
9.1 创建分支
git branch <name>:创建分支 git checkout <name>:切换分支
# 1. 创建dev分支
$ git branch dev
# 2. 切换到dev分支
$ git checkout dev
# ================ 以下补充 ================
# 创建并切换到dev分支
$ git branch -b dev
# 本地创建于远程仓库对应的分支
$ git checkout -b dev origin/dev
# 查看分支列表
$ git branch
二. 合并分支
git merge <origin> <name>:合并分支
# 1. 合并本地dev分支(在master分支上)
$ git merge dev
# ================ 以下补充 ================
# 合并远程master分支
$ git merge origin master
# 使用普通模式合并分支
# 普通模式会创建一个合并commit,用于查看合并记录,Fast forward模式无法查看合并记录
# --no-off:禁用Fast forward模式
$ git merge --no-off -m "本次合并commit描述" dev
三. 删除分支
git branch -d <name>:删除本地分支 git branch -D <name>:强制删除本地分支 git push -d origin <name>:删除远程分支
# 1. 切换回master分支
$ git checkout master
# 2. 删除本地dev分支
$ git branch -d dev
# 3. 删除远程仓库dev分支
$ git push -d origin dev
四. 分支冻结
使用场景:需要去其他分支处理BUG,但当前分支还存在未提交的代码时使用
git stash:将当前的分支的修改冻结
,使当前分支工作区,暂存区没有内容
git stash list:查看冻结
列表
git stash pop:解冻修改
git cherry-pick commit ID:将某个分支的commit合并
# 1. 切换到dev分支
$ git checkout dev
# 2. 修改里面的 testA.txt 文件
$ vim testA.txt
# 3. 冻结当前修改(如果分支存在修改,那么无法切换到其他分支)
$ git stash
# 4. 丢弃某个 stash stack 里栈顶的内容
$ git stash drop stash@{0}
# 4. 现在能切换到其他分支了
$ git checkout master
# ========================================
# 将os-12分支的的commit修改赋值在dev分支上
$ git cherry-pick 7a18e07
五. 多人协作
git fetch origin <name>:获取远程指定分支修改 git pull origin <name>:⇔\Leftrightarrow⇔ git fetch + git merge
# 1. 获取远程dev分支修改(每天开发前先fetch,避免后期冲突过多)
$ git fetch origin dev
# 2. 合并远程dev仓库
$ git merge origin dev
# 3. 解决冲突
# 4. 提交到远程dev分支
git push origin dev
# ========================================
# 获取远程dev分支修改,同时与当前分支进行合并
git pull origin dev
标签管理
一. 创建Tag
git tag <name>:创建tag
# 为当期Commit创建tag
$ git tag v1.0
# 为指定Commit创建tag
$ git tag v0.9 59f03c7
# 为tag添加描述语言
$ git tag -a v0.1 -m "创建一个带有描述的tag" 59f03c7
# 查看所有tag
$ git tag
# 查看v1.0 tag对应的commit
$ git show v1.0
二. 删除Tag
git tag -d <name>:删除本地tag git tag push origin :refs/tags/<name>:删除远程tag git push origin tag <name>:推送本地tag到远程仓库 git push origin --tags:推送所有未推送的本地tag到远程仓库
# 1. 将多个tag推送到远程仓库
$ git push origin --tags
# 2. 删除本地tag v0.9
$ git tag -d v0.9
# 3. 删除远程仓库的tag v0.9
$ git push origin :refs/tags/v0.9
git status:查看文件状态 (红色:文件在工作区;绿色:文件在暂存区;显示nothing no commit, working tree clean
说明文件已添加到本地仓库)
其他git指令
指令 | 操作 |
---|---|
git remote rm origin | 删除远程关联仓库 |
git config --list | 查看git配置项 |
git config --global <key> <value> | 设置git配置项,key属性名,value属性值 |
git config --list | 查看git配置项 |
git reset --hard origin/master | 本地仓库退回到与远程仓库版本一致 |
转载自:https://juejin.cn/post/6844903958033481742