Git -- 分支与合并 (命令行+可视化工具p4merge)

基本命令

把全部的变化都放在master分支并非最好的作法. 建议的作法是把变化放在分支里面.html

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

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

列出全部的分支:

git branch 会列出全部的本地分支.工具

git branch -a 会列出本地和远程的全部分支.post

git branch
git branch -a

 

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

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

 

建立分支:

git branch 分知名:指针

git branch mynewbranch

 

 

切换分支.

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

git checkout mynewbranch

 

那再看看历史纪录: htm

由于我如今尚未作任何更改, 因此这些分支都指向同一个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.

相关文章
相关标签/搜索