• Git 从了解到精通(2)分支管理及代码冲突和Stashing


    作者:zyugat.cn/zyugat.com

    Git 从了解到精通(2)分支管理及代码冲突和Stashing

    Git 从了解到精通(1)常用命令

    Git 从了解到精通(2)分支管理及代码冲突和Stashing

    分支

    git pull:拉去更新,自动合并。

    git fetch [remote-name]:拉取更新,和不会自动合并到当前工作分支。

    git branch --no-merged:查看未合并的分支

    git branch --merged:查看已经合并的分支

    # 1. 创建分支
    git branch dev
    # 2. 切换分支
    git checkout dev
    
    # 3. 新建并切换分支
    git branch -b dev
    
    # 4. 分支改名, 将 master 分支改为 main
    git branch -m master main
    
    # 5. 合并分支,需先切换到 main 主分支上在执行
    # 记得 Push!
    git checkout main
    git merge dev
    
    # 6. 删除分支
    # 如果分支 dev 还未合并到 main 会提示无法删除,需使用 -D 强制删除
    git branch -d dev
    
    # 7. 查看本地分支
    git branch
    # 8. 查看远程分支
    git branch -r
    
    # 9. 如果远程分支有个 develop ,而本地没有,你想把远程的 develop 分支迁到本地:
    git checkout -b develop origin/develop
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    merge的问题和 rebase 的用法

    例如有两个分支,main 和 dev。

    • 情况
      • 当有人在 main 分支上**对分支做出改变**了,会导致 main 和 dev 分支不是一个起点,从而多出了一步合并操作,当发生冲突的时候,就需要管理 main 的人去处理冲突。
      • 这不是我们想要的效果,我们想要当发生冲突应该由 dev 分支的管理员去处理冲突。
    # 正常合并
    * 636f97f - (HEAD -> main, dev) merge dev (14 seconds ago) <zyugat>
    * ded723d - merge dev (3 minutes ago) <zyugat>
    
    # 非正常合并
    *   f2e6d16 - merge dev2 (2 hours ago) <zyugat>
    |\
    | * 50d9ff5 - (dev2) dev2 change test.txt (3 hours ago) <zyugat>
    * | 7725c3c - dev change test.txt (3 hours ago) <zyugat>
    |/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • rebase
      • 使 dev 分支的节点起点,移动到 main 分支的终点。(dev 永远是先于 main 分支的)
      • 如果存在冲突则是 dev 人员去处理
    # 使 dev 分支是最新的
    git checkout dev
    git rebase main
    git commit -m "dev news"
    
    # main 分支合并
    git checkout main
    git merge dev
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220909180220125

    reset

    使用 reset 恢复到历史提交点,重置暂存区与工作目录的内容

    • 参数
      • --mixed(默认) :回退到 add 的动作。
      • --soft :回退 commit 的动作。
      • --hard :清空工作区和暂存区的改动。

    例:

    1. git reset --hard b7b73147ca8d6fc20e451d7b36 恢复到指定提交版本(先通过 git log 查看版本号),重置 stage 区和工作目录里的内容。
    2. git reset --hard HEAD^^^ 恢复前三个版本
    3. git reset HEAD -- . 撤销暂存区的文件
    4. git reset HEAD a.sh 放弃已经 add 暂存区的文件 a.sh

    代码冲突

    第一步到第四步是部署环境,从第五步开始就是模拟冲突。

    # 1. 新建两个分支
    git branch dev
    git branch dev2
    
    # 2. 在 dev 分支上创建, 然后合并到
    git checkout main
    echo "main" >> test.txt
    git add test.txt
    git commit -m "commit test.txt"
    
    # 3. 将 main 分支合并到 dev and dev2 分支
    git checkout dev
    git merge main
    git checkout dev2
    git merge main
    
    # 4. 在 dev 和 dev2 分支上分别修改 test.txt
    git checkout dev
    echo "dev change test.txt" >> test.txt
    git add test.txt
    git commit -m "dev change test.txt"
    
    git checkout dev2
    echo "dev2 change test.txt" >> test.txt
    git add test.txt
    git commit -m "dev2 change test.txt"
    
    # 5. 开始模拟冲突
    # 1) 合并 dev and main 分支
    git checkout main
    git merge dev
    # 2) 合并 dev2
    $ git merge dev2
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    这个时候我们打开 test.txt 文本就会出现。

    • <<<<<<< HEAD
      • 意思是从这里开始发生冲突
    • =======
      • 上面的代码代表是原本的内容(dev 合并到 main 的内容)
      • 下面就是我们 dev2 我内容
    • >>>>>>> dev2
      • 冲突结束
    main
    <<<<<<< HEAD
    dev change test.txt
    =======
    dev2 change test.txt
    >>>>>>> dev2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们因该怎么处理呢?

    1. 现在我们知道了,上面是原本的内容,下面就发生冲突的内容。
    2. 我们就需要手动合并他们两个的代码,例如我想要保留 dev2 的内容,原本 dev 内容注释掉就可以了。
    3. 记得要把 <<<<<<< HEAD=======>>>>>>> dev2。都删除干净。
    main
    # dev change test.txt
    dev2 change test.txt
    
    • 1
    • 2
    • 3

    然后在进行 commit

    git add test.txt
    git commit -m "merge dev2"
    
    • 1
    • 2

    Stashing

    当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。

    “暂存” 可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

    stash:暂存代码

    # 暂存代码
    git stash
    
    # 查看暂存代码
    git stash list
    
    # 恢复
    git stash apply
    # 恢复的同时删除记录
    git stash pop
    
    # 恢复完后最好删除那次记录
    git stash drop
    
    # 清空所有
    git stash clear
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    tag

    1. 添加标签 git tag v1.0
    2. 列出标签 git tag
    3. 推送标签 git push --tags
    4. 删除标签 git tag -d v1.0.1
    5. 删除远程标签 git push origin :v1.0.1

    打包发布

    --prefix 指定目录名

    git archive main --prefix='zyugat/' --format=zip > zyugat.zip
    
    • 1
  • 相关阅读:
    Spring Cloud--从零开始搭建微服务基础环境【二】
    C++ Tutorials: C++ Language: Other language features: Preprocessor directives
    springboot生成二维码的正确姿势-附视频附源码
    Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来
    如何画业务流程图?
    Dapper数据库字段(列)与实体属性名不一致,通过Column特性自动注入映射
    市场调研:2022年金属家具行业深度分析与发展前景报告
    低代码平台和无代码平台有什么区别
    高频CSS面试题
    【PAT甲级】1019 General Palindromic Number
  • 原文地址:https://blog.csdn.net/qq_31755699/article/details/126787524