基本命令

把所有的变化都放在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.

Git -- 分支与合并 (命令行+可视化工具p4merge)的更多相关文章

  1. 详细说明svn分支与合并---命令行

    一,svn分支与合并有什么用? 作程序的,对svn在熟悉不过了,但对svn分支熟悉的,我想并不多.因为一般情况下,是用不着svn分支的,其实也没有那个必要.下面我例举几个需要用到svn分支的情况: 1 ...

  2. [转]12款最佳Linux命令行终端工具

    摘要 “工欲善其事必先利其器”,作为菜鸟,也是从别人那里偷学来的一些东东.今天看到同事用到一个终端命令行工具,觉得自己弱爆了.然后在网上搜了下该工具.发现类似的工具还是挺多的,只是自己不知道罢了. 原 ...

  3. 12款最佳Linux命令行终端工具, 20款优秀的 Linux 终端仿真器

    12款最佳Linux命令行终端工具     如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的 ...

  4. 12款最佳Linux命令行终端工具

    12款最佳Linux命令行终端工具 如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的终端软件 ...

  5. 【转】curl 命令行下载工具使用方法小结

    获取curl curl 命令行下载工具 curl的官方网站为: http://curl.haxx.se官方下载页面为:http://curl.haxx.se/download.html 你可能并不清楚 ...

  6. You-Get 视频下载工具 Python命令行下载工具

    You-Get 是一个命令行工具, 用来下载各大视频网站的视频, 是我目前知道的命令行下载工具中最好的一个, 之前使用过 youtube-dl, 但是 youtube-dl 吧, 下载好的视频是分段的 ...

  7. Linux上超酷的命令行扩展工具Oh My Zsh

    Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式.它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作.给我们一种全新的方式使用命 ...

  8. Cmder | 一款命令行增强工具

    文章目录 什么是cmder 安装cmder 让cmder便于使用 将cmder添加到右键菜单中 在设置中添加语言环境 设置默认使用cmd.PowerShell还是bash 调节背景的透明度 添加 ll ...

  9. Linux 命令行作弊工具安利

    本文转自 微信公众号<Linux爱好者>的一篇文章,觉得工具非常好使,且极具使用价值,所以在此安利一下 Linux 用户的福音,记忆力解放!快速调用复杂命令 刚学的一句新命令,才用完就忘了 ...

随机推荐

  1. Python接口测试,Requests模块讲解:GET、POST、Cookies、Session等

    文章最下方有对应课程的视频链接哦^_^ 一.安装.GET,公共方法 二.POST 三.Cookies 四.Session 五.认证 六.超时配置.代理.事件钩子 七.错误异常

  2. python技巧

    python小技巧: 1.强烈建议使用Python的r前缀,就不用考虑转义的问题了. 2.正则表达式的使用: test = '用户输入的字符串' if re.match(r'正则表达式', test) ...

  3. python中 字符 字典 列表之间的转换

    1 字典 转 字符 定义一个字典:dict = {'name': 'python', 'age': 7}字典转字符 可以使用str强制转换 如: str(dict) 此时dict的类型就是字符型了 2 ...

  4. pycharm安装,svn使用,远程开发调试,接口测试,连接服务器

    磨刀不误砍柴工,配置完美的编辑器,在开发时,能帮助我们节约大量的时间成本,从而是我们的精力放在业务逻辑实现上面! 接下来将介绍 使用pyhcarm如何使用svn,远程开发调试,接口测试,已经连接远程服 ...

  5. shell脚本——mysql

    很期待,学习shell脚本,减少重复工作 自动安装配置mysql脚本: #/bin/bash LOG_FILE=/home/hadoop1/log/installmysql.log function ...

  6. webpack入门宝典

    前提摘要 本文是经过二天自己学习总结出来的一些心得,本文是在最新版的webpack4x的基础上进行配置的(听说webpack4x比以往改变都很大有些插件可能有问题).如果你以前没怎么接触过Webpac ...

  7. vxworks下文件读写示例

    dev 1.create file on floopy disk and write contents: -> pdev=fdDevCreate(0,0,0,0)     /* A:,1.44M ...

  8. dojo省份地市级联之省份封装类(一)

    省份封装类 Province.java /** * 省份封装类 */ package com.you.model; import java.io.Serializable; /** * @author ...

  9. java.sql.SQLException: Can not issue empty query.

    1.错误描述 java.sql.SQLException: Can not issue empty query. at com.mysql.jdbc.SQLError.createSQLExcepti ...

  10. C# 中?和??的用法

    最近在看官方的源码时,经常看到有 Int? sum; 和 FileProvider = FileProvider ??builder.GetFileProvider(); 一个问号: 很多数据类型时不 ...