1. 分支简述
当commit时, git存储的时提交的对象, 其中包含了指向暂存区快照的指针; 提交对象也包括姓名, 邮箱, 提交信息, 夫提交指针; 初始提交没有父提交, 非初始提交都有一个父提交对象,; 对于两个和多个分支的合并, 存在多个父提交; git提交到仓库的文件被称作blob对象;
在commit提交的时候, git会先给每个子目录计算校验和, 然后把这些树对象保存在git仓库中; 然后git再创建提交对象, 其中包括元数据以及指向项目根目录树对象的指针;
Git分支不过是一个指向某次提交的轻量级的可移动的指针 ; Git分支实际上就是一个简单的文件, 其中只包含提交时的40字符的SHA-1校验和以及一个换行符; git初始化仓库是创建的分支是master, 但是这个分支名可以自定义: https://www.yuque.com/pogusanqian/ulh9rx/kd29n0#MK2Tk
HEAD表示的是当前所在的分支
1.1 创建分支
git branch test 创建test分支
git checkout test 切换到test分支
git checkout -b test 创建并切换到test分支
# 创建远程分支
git push --set-upstream origin test 先再本地创建test分支, 然后再推送到远程(其实就是跟踪分支)
1.2 查看分支
git branch 显示本地所有的分支
git branch -v 显示提交的版本信息, 会显示版本差别(ahead, behind)
git branch -a 显示本地与远程的所有分支
git branch -vv 显示对应的远程分支(跟踪分支)
git branch --merge 查看已经合并(所在分支, 相对的)的分支
git branch --no-merge 查看还没有合并(所在分支, 相对的)的分支
git remote prune origin 清理一下本地分支的记录(有时候远程分支删除后, 我们依然可以使用-a命令查看到)
1.3 删除分支
git branch -d test 删除test分支
git branch -D test 强制删除test分支(此时test分支有一部分内容没有合并到master)
git push origin -d test 删除远程的test分支
git remote prune origin 清理一下本地分支的记录(有时候远程分支删除后, 我们依然可以使用-a命令查看到)
# 删除掉已经合并到本地master上的所有分支(只能再bash中执行, cmd中不行)
git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d
# 删除掉再远程已经被合并到master上的分支
git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin
git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin
1.4 分支重命名
git branch -m oldName newName 本地分支重命名
# 远程分支重命名
git push origin -d oldName 删除远程分支
git push origin newName 推送到远程
git br -u newName 重新设置跟踪分支
1.5 远程分支跟踪
git branch dev origin/master 本地创建dev分支, 跟踪远程master分支
git checkout --track origin/dev 相当于是git co -b dev origin/dev
git branch --set-upstream-to origin/test 重新设置当前分支对应的跟踪分支是test
git branch -u origin/test 简写
1.6 远程分支回退
git reset --hard 0ffaacc 将版本回退到某一个版本(之前的版本会被舍弃)
# 远程版本回退
git reset --hard 0ffaacc 先本地版本回退
git push -f 然后强制提交(有再次恢复的可能, 不建议)
git push --force 完整命令
git revert 0ffaacc 先本地回退, 只是内容回退了, 但是版本记录会往前推一个
git push 推送, 回退远程版本
2. 合并分支
git co master 切换到master分支
git merge test 将test分支合并到master上
git merge --abort 取消分支合并操作, 相当于没有执行git merge命令
2.1 fast-forward
- 这种情况表示: master分支是3, test分支是4, 此时合并, 直接就将4版本追加到了master上
2.2 合并没有冲突
test将C4合并到master上时, master又被提交了一个C5版本; 此时合并会自动生成C6的版本, 表示合并的提交
2.3 合并有冲突
test将C4合并到master上时, master又被提交了一个C5版本; 此时的C6版本并不是自动生成的, 需要我们解决冲突, 然后手动提交
2.4 冲突产生的条件
- 不同文件的修改是不会产生冲突的
- 修改同一个文件, 并且修改了不同行(只是单独的行), 会产生冲突
-
2.5 强制合并
如果远程分支被保护, 则force强推便会失效 ```git git push —force 强制推送到远程(不建议使用, 一般都是使用reverse)
// 强制合共到本地分支
git fetch
git reset —hard origin/master
<a name="qgyZ0"></a>
### 2.6 冲突工具
<a name="Gamld"></a>
#### 2.6.1 自带视图化工具
- **window中自带的视图比较工具是: **`**vimdiff**`
- **通常而言, 解决冲突后, 会生成一个冲突源文件(以.orig结尾), 此文件没什么用, 只要把mertertool.keepBackup设置成false便不会产生**
```git
git merge master
# 产生冲突, 则使用mergetool视图化工具
git mergetool
# 解决冲突后, 提交版本
git commit -m ****
2.6.2 beyond比较工具
- 使用beyondcompare进行比较的时候, 最好打开一个空白的标签页, 这样有助于多文件冲突的处理
```git
设置比较工具成beyond compare, 这样使用mergetool命令的时候, 使用的视图比较工具就是beyondcompare
git config —global diff.tool bc git config —global difftool.bc.path “c:/Program Files/Beyond Compare 4/bcomp.exe” git config —global difftool.prompt false
git config —global merge.tool bc git config —global mergetool.bc.path “c:/Program Files/Beyond Compare 4/bcomp.exe”
去除掉产生的备份文件
git config —global mergetool.keepBackup false
![image.png](https://cdn.nlark.com/yuque/0/2021/png/2309174/1627875966921-f4ca83f9-9a0e-4cdf-bfc0-ee7e6a5047b8.png#clientId=u3680e2d3-01f5-4&from=paste&height=690&id=u08781a96&name=image.png&originHeight=690&originWidth=1920&originalType=binary&ratio=1&size=112430&status=done&style=none&taskId=u8da9c17e-2e47-4339-bb81-58dcec0382f&width=1920)
<a name="AxlIf"></a>
#### 2.6.3 idea冲突比较工具
- **这个其实是最好用的**
<a name="5eQsY"></a>
## 3. Rebase命令
原文链接: [https://blog.csdn.net/the_power/article/details/104651772/](https://blog.csdn.net/the_power/article/details/104651772/)
<a name="EBeIG"></a>
### 3.1 变基操作
**变基操作是将另一个分支上的版本作为master分支上的补丁, 相对于merge命令, 使提交记录更加简洁, 因为merge的C6是一个合并分支版本, 并不是功能版本;**
- **C4, C5可以是多个版本**
```git
git checkout test
git rebase master # 变基命令, 此时会将master上的c5版本, 插到c3与c4之间
# 解决完冲突
# git add -am ***
# git rebase --continue
git checkout master
git merge test # 此时的合并就是fast-forward
3.1.1 变基冲突操作
git rebase --abort 取消变基操作
git rebase --skip 丢弃掉引起冲突的部分(保留master上的冲突, 去掉test上的冲突)
git rebase --continue 手动决绝冲突后, 自动的提交(注意: 要先使用add命令将决绝冲突的文件放到暂存区)
3.1.2 pull命令缺陷
当我们执行git pull命令拉去远程分支的时候, 其实等于git fetch + git merge两个命令, 当本地分支和远程分支, 版本没有保持一致更新时, 就会产生冲突合并版本; 所以我们可以使用git pull —rebase来解决, 这个命令就相当于时git fetch + git rebase, 这样就不会有c6的合并版本了
3.2 pick命令
git rebase -i HEAD~3 进行交互命令
3.3 reword命令
- reword(改写): 改写提交记录的commit信息, 注意提交对象其实也发生了变化
git rebase -i HEAD~3 进行交互命令
# 将pick改成reword
# 使用vi命令更改commit信息(注意: 有几个reword就需要改几次)
3.4 edit命令
3.4.1 插入记录
git rebase -i HEAD~3 进行交互命令
# 将pick改成edit
# 修改工作区文件, 并将提交修改成一个新版本
git rebase --continue
3.4.2 修改记录
git rebase -i HEAD~3 进行交互命令
# 将pick改成edit
# 修改工作区文件, 使用--amend命令修改版本
git rebase --continue
3.4.3 拆分记录
git rebase -i HEAD~3 进行交互命令
# 将pick改成edit
git reset HEAD~ 回退到edit版本的上一个版本
git st 查看一下需要提交的记录文件有哪些
git add *** 第一次提交那些文件
git commit -m 第一次拆分记录
git add *** 第二次提交的文件
git commit -m 第二次拆分记录
git rebase --continue
3.4.5 合并记录
```git git rebase -i HEAD@3 进入交互式命令, git rebase -i 4e9cf0255** 将4e9cf0255之前的记录合并成一条, 不包括4e9cf0255除第一条外, 其余的pick都改成s, 进行追加合并
保存脚本后, 重新修改提交记录的commit -m 信息
如果有冲突的话, 解决完冲突
git add -A
git rebase —continue
```