1. SVN 与Git 的区别
SVN:
- 集中式版本控制系统
- 存储的是diff, 进行回退版本时,SVN 是一个commit 一个commit 的回溯,才能找到指定的commit.
Git:
- 工作区 Workspace:就是 Git 管理的项目
- 暂存区 Stage/Index:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引区(index)。
- 本地版本库 Repository:工作区有一个隐藏目录.git,是 Git 的版本库。
- 远端仓库 Remote Repository: 本地仓库推送到 Git 远端服务器, 就形成了远端仓库。
3. Git 常见操作
// 初始化 git 仓库git init// 将当前目录所有的代码及资源提交到暂存区git add .// 暂存区回到工作区git rm --cached -r .// 提交到本地仓库git commit -m "test git"// 本地仓库推送到远端仓库git push// 更新本地仓库与远端仓库同步git fetchgit fetch -p 拉取远端新分支// 从远端仓库拉取回来git pull = git fetch + git mergegit 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区别
