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 创建分支

  1. git branch test 创建test分支
  2. git checkout test 切换到test分支
  3. git checkout -b test 创建并切换到test分支
  4. # 创建远程分支
  5. git push --set-upstream origin test 先再本地创建test分支, 然后再推送到远程(其实就是跟踪分支)

1.2 查看分支

  1. git branch 显示本地所有的分支
  2. git branch -v 显示提交的版本信息, 会显示版本差别(ahead, behind)
  3. git branch -a 显示本地与远程的所有分支
  4. git branch -vv 显示对应的远程分支(跟踪分支)
  5. git branch --merge 查看已经合并(所在分支, 相对的)的分支
  6. git branch --no-merge 查看还没有合并(所在分支, 相对的)的分支
  7. git remote prune origin 清理一下本地分支的记录(有时候远程分支删除后, 我们依然可以使用-a命令查看到)

1.3 删除分支

  1. git branch -d test 删除test分支
  2. git branch -D test 强制删除test分支(此时test分支有一部分内容没有合并到master)
  3. git push origin -d test 删除远程的test分支
  4. git remote prune origin 清理一下本地分支的记录(有时候远程分支删除后, 我们依然可以使用-a命令查看到)
  5. # 删除掉已经合并到本地master上的所有分支(只能再bash中执行, cmd中不行)
  6. git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d
  7. # 删除掉再远程已经被合并到master上的分支
  8. git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin
  9. git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin

1.4 分支重命名

  1. git branch -m oldName newName 本地分支重命名
  2. # 远程分支重命名
  3. git push origin -d oldName 删除远程分支
  4. git push origin newName 推送到远程
  5. git br -u newName 重新设置跟踪分支

1.5 远程分支跟踪

  1. git branch dev origin/master 本地创建dev分支, 跟踪远程master分支
  2. git checkout --track origin/dev 相当于是git co -b dev origin/dev
  3. git branch --set-upstream-to origin/test 重新设置当前分支对应的跟踪分支是test
  4. git branch -u origin/test 简写

1.6 远程分支回退

  1. git reset --hard 0ffaacc 将版本回退到某一个版本(之前的版本会被舍弃)
  2. # 远程版本回退
  3. git reset --hard 0ffaacc 先本地版本回退
  4. git push -f 然后强制提交(有再次恢复的可能, 不建议)
  5. git push --force 完整命令
  6. git revert 0ffaacc 先本地回退, 只是内容回退了, 但是版本记录会往前推一个
  7. git push 推送, 回退远程版本

2. 合并分支

  1. git co master 切换到master分支
  2. git merge test test分支合并到master
  3. git merge --abort 取消分支合并操作, 相当于没有执行git merge命令

2.1 fast-forward

  • 这种情况表示: master分支是3, test分支是4, 此时合并, 直接就将4版本追加到了master上

绘图1.jpg

2.2 合并没有冲突

test将C4合并到master上时, master又被提交了一个C5版本; 此时合并会自动生成C6的版本, 表示合并的提交
02.jpg

2.3 合并有冲突

test将C4合并到master上时, master又被提交了一个C5版本; 此时的C6版本并不是自动生成的, 需要我们解决冲突, 然后手动提交
02.jpg

2.4 冲突产生的条件

  • 不同文件的修改是不会产生冲突的
  • 修改同一个文件, 并且修改了不同行(只是单独的行), 会产生冲突
  • 修改同一个文件, 修改不同的方法, 不会产生冲突

    2.5 强制合并

  • 如果远程分支被保护, 则force强推便会失效 ```git git push —force 强制推送到远程(不建议使用, 一般都是使用reverse)

// 强制合共到本地分支 git fetch
git reset —hard origin/master

  1. <a name="qgyZ0"></a>
  2. ### 2.6 冲突工具
  3. <a name="Gamld"></a>
  4. #### 2.6.1 自带视图化工具
  5. - **window中自带的视图比较工具是: **`**vimdiff**`
  6. - **通常而言, 解决冲突后, 会生成一个冲突源文件(以.orig结尾), 此文件没什么用, 只要把mertertool.keepBackup设置成false便不会产生**
  7. ```git
  8. git merge master
  9. # 产生冲突, 则使用mergetool视图化工具
  10. git mergetool
  11. # 解决冲突后, 提交版本
  12. git commit -m ****

image.png

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

  1. ![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)
  2. <a name="AxlIf"></a>
  3. #### 2.6.3 idea冲突比较工具
  4. - **这个其实是最好用的**
  5. <a name="5eQsY"></a>
  6. ## 3. Rebase命令
  7. 原文链接: [https://blog.csdn.net/the_power/article/details/104651772/](https://blog.csdn.net/the_power/article/details/104651772/)
  8. <a name="EBeIG"></a>
  9. ### 3.1 变基操作
  10. **变基操作是将另一个分支上的版本作为master分支上的补丁, 相对于merge命令, 使提交记录更加简洁, 因为mergeC6是一个合并分支版本, 并不是功能版本;**
  11. - **C4, C5可以是多个版本**
  12. ```git
  13. git checkout test
  14. git rebase master # 变基命令, 此时会将master上的c5版本, 插到c3与c4之间
  15. # 解决完冲突
  16. # git add -am ***
  17. # git rebase --continue
  18. git checkout master
  19. git merge test # 此时的合并就是fast-forward

绘图1.jpg

3.1.1 变基冲突操作

  1. git rebase --abort 取消变基操作
  2. git rebase --skip 丢弃掉引起冲突的部分(保留master上的冲突, 去掉test上的冲突)
  3. git rebase --continue 手动决绝冲突后, 自动的提交(注意: 要先使用add命令将决绝冲突的文件放到暂存区)

3.1.2 pull命令缺陷

当我们执行git pull命令拉去远程分支的时候, 其实等于git fetch + git merge两个命令, 当本地分支和远程分支, 版本没有保持一致更新时, 就会产生冲突合并版本; 所以我们可以使用git pull —rebase来解决, 这个命令就相当于时git fetch + git rebase, 这样就不会有c6的合并版本了
绘图1.jpg

3.2 pick命令

  1. git rebase -i HEAD~3 进行交互命令

image.png
image.png

3.3 reword命令

  • reword(改写): 改写提交记录的commit信息, 注意提交对象其实也发生了变化
    1. git rebase -i HEAD~3 进行交互命令
    2. # 将pick改成reword
    3. # 使用vi命令更改commit信息(注意: 有几个reword就需要改几次)
    Snipaste_2021-08-01_16-34-18.png

    3.4 edit命令

    3.4.1 插入记录

    1. git rebase -i HEAD~3 进行交互命令
    2. # 将pick改成edit
    3. # 修改工作区文件, 并将提交修改成一个新版本
    4. git rebase --continue
    image.png

    3.4.2 修改记录

    1. git rebase -i HEAD~3 进行交互命令
    2. # 将pick改成edit
    3. # 修改工作区文件, 使用--amend命令修改版本
    4. git rebase --continue

    3.4.3 拆分记录

    1. git rebase -i HEAD~3 进行交互命令
    2. # 将pick改成edit
    3. git reset HEAD~ 回退到edit版本的上一个版本
    4. git st 查看一下需要提交的记录文件有哪些
    5. git add *** 第一次提交那些文件
    6. git commit -m 第一次拆分记录
    7. git add *** 第二次提交的文件
    8. git commit -m 第二次拆分记录
    9. 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

``` Snipaste_2021-08-01_17-12-15.png