zoukankan      html  css  js  c++  java
  • Git -- 分支与合并 (命令行+可视化工具p4merge)

    基本命令

    把所有的变化都放在master分支并不是最好的做法. 建议的做法是把变化放在分支里面.

    至少应该准备一个feature分支之类的, 把变化都隔离开来, 然后等到所有的功能都稳定之后再合并到master分支.

    说到分支, 就得使用git branch命令.

    列出所有的分支:

    git branch 会列出所有的本地分支.

    git branch -a 会列出本地和远程的所有分支.

    git branch
    git branch -a

    绿色的是本地的分支, 红色的是远程分支.

    星号是表示这时当前活跃的分支.

    创建分支:

    git branch 分知名:

    git branch mynewbranch

    切换分支.

    想切换分支的话, 需要使用git checkout 分知名 这个命令

    git checkout mynewbranch

    那再看看历史纪录: 

    因为我现在还没有做任何更改, 所以这些分支都指向同一个commit, 其实分支就是标签/指针而已.

    修改分支名.

    再切换到master分支: git checkout master.

    然后使用git branch -m 分支名 新分知名 来进行改名操作.

    删除分支.

    注意不能删除当前活跃的分支.

    使用命令git branch -d 分支名.

    git branch -d newbranch

    Fast Forward 合并

    快捷操作: 切换并创建分支: 

    git checkout -b 分支名.

    git checkout -b some-change

    然后我打开某个文件(index.html)修改一下标题.

    Commit之后查看历史纪录, 可以看到再some-change分支里, 修改了index.html的title.

    如果我想要把这个commit合并到master分支.

    首先要切换回到master分支:

    git checkout master

    然后, 我需要知道发生了哪些变化, 也就是比较这两个分支:

    git diff master some-change

    也可以可视化查看: 

    git difftool master some-change

    我这台电脑没有配置p4merge, 所以默认的可能是使用vimdiff可视化工具:

    然后按esc再按:q退出.

    最后就是合并变化: git merge 需要被合并进来的分支名.

    git merge some-change

    可以看到里面列出了所涉及的commits, 并且这是一个fast-forward合并, 所涉及的文件, 以及有哪些变化.

    因为这是一个Fast Forward合并, Git把feature分支后来所有的commits都放在了master分支上, 就像没有分开过一样:

    但是Fast-forward合并只有在满足这个条件的时候才可能执行: 合并的时候master分支没有任何变化.

    合并后的状态如下:

    合并之后, 就不需要这个分支了, 删除:

    git branch -d some-change

    这时, git log里面只有master了.

    禁用 Fast Forward 合并

    添加一个分支, 并且换到该分支:

    git checkout -b add-text

    然后我再index.html里面添加点文字, 并commit.

    然后再修改README.md, 添加文字, commit.

    现在在 add-text这个分支上, 有两个commit, 看下log:

    然后把这个分支合并到master分支.

    首先切换到master分支, 然后再进行git merge, 但是这一次, 我想把我这个分支的过程留下痕迹, 所以要禁用fast-forward 合并:

    git merge 要被合并进来的分支 --no-ff.

    这样做的话, 将会出现一个新的合并commit, 

    然后查看git log:

    可以看到, 整个分支的过程被记录了下来.

    最后删除这个分支, 并查看log:

    可以看到, 删除分支以后, log里面分支的名没有了, 但是分支还在.

    自动合并

    创建一个分支并切换:

    git checkout -b simple-changes

    修改一个文件然后commit:

    然后回到master分支:

    再修改某个文件, 然后commit:

    查看log:

    红线里面那部分就比较有趣了, 两个分支都有变化/commits.

    这种情况可以这么合并:

    git merge 被合并进来的分支 -m "自定义信息".

    git merge simple-changes -m "merging changes from simple-changes"

    查看log:

    可以看到分支的合并已经完成了.

    最后删除分支, 查看log:

    效果一样, 分支名没了, 但是分支的历史还是保留着的.

    可以打开两个文件看看, 改变的内容都保留着了.

    解决合并的冲突

    如果两个分支上都对同一个文件进行了修改, 那么就有可能发生冲突.

    首先创建一个分支, 并切换到该分支上:

    然后修改index.html, 修改几个地方吧.

    然后查看状态, 并commit:

    然后切换到master, 并编辑同一个文件:

    而这时index.html并不是realwork分支修改后的样子, 而是修改之前的样子:

    然后修改index.html, 修改几处可能引起冲突的地方.

    commit:

    然后查看log:

    接下来最应该做的就是diff:

    也可以使用可视化工具进行diff:

    下面进行合并:

    不出所料, 冲突发生了, 自动合并失败.

    现在的状态, 应该叫做Merging状态.

    现在打开index.html是这样的:

    可以看到两处冲突, 每处都有HEAD(master)版的和realwork分支版的.

    上图我使用的是Visual Studio Code, 可以点击上面的按钮来进行冲突的解决, 也可以手动修改文件进行解决.

    但是在这里我使用我配置好的mergetool:

    git mergetool. 这个命令将会打开p4merge(我本机配置的mergetool):

    按图示操作, 点击图标选择不同的版本, 最后点击保存即可.

    关闭p4merge:

    然后commit:

    commit之后, 状态就不再是merging了, 但是会出现一个未被追踪的文件:

    这是因为在解决冲突的时候, git会保存一个带有触痛的原始版本, 以备不时之需:

    但是.orig文件是不应该被追踪的, 所以需要添加到.gitignore文件中:

    然后查看状态:

    这次只有.gitignore发生了变化.

    commit:

    最后可以删除 realwork 分支了:

    查看log:

    Ok.

  • 相关阅读:
    如何用Baas快速在腾讯云上开发小程序-系列2:搭建Phabricator开发管理平台
    如何用Baas快速在腾讯云上开发小程序-系列1:搭建API & WEB WebSocket 服务器
    腾讯云极速配置NodeJS+LNMP运行环境
    Python GTK + 3教程 学习笔记 ——(4)Widget 小部件
    Python GTK + 3教程 学习笔记 ——(3)基础
    Python GTK + 3教程 学习笔记 ——(2)入门
    Python GTK + 3教程 学习笔记——(1)安装
    打包工具pyinstaller
    pip换源
    mac brew
  • 原文地址:https://www.cnblogs.com/cgzl/p/8623290.html
Copyright © 2011-2022 走看看