目录
基本概念
- 工作区:不包括.git在内的整个项目目录
- 暂存区:英⽂叫stage或index。存放在.git/index中,所以暂存区有时也叫作索引(index),
git add file
会file存入缓存区 - 本地仓库:Local Repo,储存暂存区中提交上来的文件,含各分支目录树,git commit提交到本地仓库
- 版本库:隐藏⽬录.git,这个不算⼯作区,⽽是Git的版本库,里面有暂存区和本地仓库
- HEAD:指向本地分支的指针,可以想象为当前分支的别名.分区本地和远程HEAD,本地在.git/HEAD,远程在.git/refs/remotes/origin/HEAD
常用命令:工作区、缓存区、本地仓库、远程仓库关系
- git checkout . 或者 "git checkout -- :会⽤暂存区全部或指定的⽂件替换⼯作区的⽂件。这个操作很危险,会清除⼯作区中未添加到暂存区的改动。
- git checkout HEAD . 或者 "git checkout HEAD :会⽤ HEAD 指向的分⽀中的全部或者部分⽂件替换暂存区和以及⼯作区中的⽂件。这个命令也是极具危险性的,因为不但会清除⼯作区中未提交的改动,也会清除暂存区中未提交的改动。
- git pull = git fetch + git merge
- git pull -r = git fetch + git rebase
- git commit --amend:修改最后一次提交(提交新缓存区)
reset head三种模式区别
-
--hard:直接将工作目录、 暂存区及本地仓库都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
-
--mixed(默认):只保留工作目录的內容,但会将暂存区和本地仓库的內容reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中
-
--soft:保留工作目录和暂存区的内容,只让本地仓库中的内容和reset目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入暂存区。所以效果看起来就是工作目录和暂存区的内容不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中
合并
a、批量处理冲突,在A分支合并B分支:
- git checkout --ours file: 有冲突地方,采用A分支内容
- git checkout --theirs file: 有冲突地方,采用B分支内容
b、merge、rebae区别:
rebase始终把当前分支最新的修改放到最前头,merge根据时间线穿插合并
- merge能够体现出时间线,但是rebase会打乱时间线
- rebase看起来简洁,但是merge看起来不太简洁
c、其他
- git merge XX --squash: 创建一个单独的提交而不是做一次合并
- git merge/rebase --abort:放弃当前正在进行的合并
回滚
- git revert commit(建议):回退到指定版本,保留原更改代码,且⽣成新的提交
- git reset --hard commit:回退到指定版本,不保留原更改代码