Git 新手指南

882 阅读4分钟

改变你的想法,你就改变了自己的世界。——文森特·皮尔

一. 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 初始化

  1. 创建项目文件夹
mkdir my-project && cd my-project
  1. 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本地仓库退回到与远程仓库版本一致

.gitnore配置文件仓库