1. SVN 与Git 的区别

SVN

  • 集中式版本控制系统
  • 存储的是diff, 进行回退版本时,SVN 是一个commit 一个commit 的回溯,才能找到指定的commit.

Git

  • 分布式版本控制系统
  • 存储的是代码及资源的完整的快照,Git 是直接退到指定版本就可以。
  • Git 内容完整性要优于 SVN

    2.Git 工作流程介绍

  • 工作区 Workspace:就是 Git 管理的项目
  • 暂存区 Stage/Index:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引区(index)。
  • 本地版本库 Repository:工作区有一个隐藏目录.git,是 Git 的版本库。
  • 远端仓库 Remote Repository: 本地仓库推送到 Git 远端服务器, 就形成了远端仓库。

image.png

3. Git 常见操作

  1. // 初始化 git 仓库
  2. git init
  3. // 将当前目录所有的代码及资源提交到暂存区
  4. git add .
  5. // 暂存区回到工作区
  6. git rm --cached -r .
  7. // 提交到本地仓库
  8. git commit -m "test git"
  9. // 本地仓库推送到远端仓库
  10. git push
  11. // 更新本地仓库与远端仓库同步
  12. git fetch
  13. git fetch -p 拉取远端新分支
  14. // 从远端仓库拉取回来
  15. git pull = git fetch + git merge
  16. git pull --rebase = git fetch + git rebase

1. HEAD

  • HEAD: 指向当前分支最新commit对象
  • HEAD^: 指向当前分支最新commit的前1个commit
  • HEAD^^: 指向当前分支最新commit的前2个commit
  • HEAD~100: 指向当前分支最新commit的前100个版本
  • HEAD~1: 也可以这样,表示指向当前分支最新commit的前1个版本

    2.git config

    ```bash // 读取操作人信息 git config user.email git config user.name

// 当前目录生效:写入操作人信息 git config user.email “xxx@163.com” git config user.name “xxx”

// 全局生效:写入操作人信息 git config —global user.email “xxx@163.com” git config —global user.name “xxx”

<a name="BCGII"></a>
## 3. git clone & submodule
两个独立的项目有独立的git 管理,父项目关联子项目。下载源码的2种方法:

1. clone 父项目后,再安装子项目

git clone git@github.com:jjz/pod-project.git cd pod-project git submodule init git submodule update


2. 直接和父项目一起 clone

git clone git@github.com:jjz/pod-project.git —recursive

[参考文档](https://blog.csdn.net/qq_37788558/article/details/78668345)
<a name="qSK69"></a>
## git log 记录打印
```bash
// 查看 git 操作日志,不包含reset操作
git log
// 显示日志修改内容更加清晰的输出方式
git log --oneline --decorate --graph --stat

// 查看详细的操作日志,包含reset操作
git reflog

git reset 版本回退

git reset [--hard/``--soft/``--mixed] [commit id] / [HEAD^]

git reset —hard 提交对象:

  • 将重置回指定的commit,
  • 当前分支最新的commit 与目标commit 之间的差异代码会被清空
  • 如果有未提交的工作区及暂存区的内容,也会被清空

git reset —soft 提交对象:

  • 将重置回指定的commit,
  • 当前分支最新的commit 与目标commit 之间的差异代码会被放在暂存区
  • 如果有未提交的工作区及暂存区的内容,不会受到影响

git reset —mixed 提交对象:

  • (—mixed)参数为默认值
  • 将重置回指定的commit,
  • 当前分支最新的commit 与目标commit 之间的差异代码会被放在工作区
  • 如果有未提交的工作区内容,不会受到影响;未提交的暂存区的内容,会被放到工作区

【注意】:
远端的提交不建议使用 reset:如果已推到远端仓库commit A 、commit B、commit C,想要回退到 commit A ,使用** git reset **去做会发生这样的情况:本地回退了,只剩下commit A ,但是远端的commit B、commit C还在。
Git 比较当前分支本地与远端commit差异时,发现远端比本地多了2个提交,会提示有commit 需要拉取下来。 所以这样的回退版本是不推荐使用的。
建议使用 **git revert**

git checkout

  • 切换分支 ``` // 创建新分支 git branch branchName // 切换到新分支 git checkout branchName

// 创建并切换到新分支 git checkout -b branchName // 强行创建并切换到新分支,如果有同名分支则覆盖 git checkout -B branchName


- 回滚工作区,使用暂存区的全部或者指定文件覆盖工作区的文件

// 指定文件的工作区内容被暂存区内容覆盖,注意不要忘记中间的”—“,不写就成了检出分支了! git checkout — filepathname // 工作区内容被暂存区内容覆盖 git checkout .

<a name="TsfkY"></a>
## git lfs 大文件操作

// 安装 git lfs install

// 查看管理的文件 git lfs ls-files

// 拉取文件 git lfs pull

安装 lfs 后 `git clone` 可以直接把大文件下载下来,与` git lfs clone` 一样<br />[参考文档](https://gitee.com/help/articles/4235#article-header0)

<a name="QqWR6"></a>
## git diff 比较区别
```bash
git diff                                             比较工作区与暂存区区别
git diff <commit>                         比较工作区与指定commit区别
git diff <commit1> <commit2>  比较指定commit与指定commit区别
git diff --staged  <commit>  比较暂存区与指定commit区别
git diff --cached  <commit>  比较暂存区与指定commit区别