目录
一、Git简介
1、版本控制系统简介
2、 Git的安装
a、安装git
b、Git 的配置
二,本地仓库
三、GIT分支操作
1、关于分支
2. 分支基本操作
3、分支合并
4、冲突
一、Git简介
1、版本控制系统简介
版本控制系统(VCS)是将『什么时候、谁、对什么文件做了怎样的修改』这样的信息以版本的形式保存并进行管理的系统。
简单来说,版本控制系统会去记录它所管理的文件的『历史版本』。
版本控制系统 “不是网盘,而胜似网盘” :
-
它和网盘的相同点在于:它可以位于局域网,或者是外网上的一台服务器上,你和你的小伙伴们可以在不同的地方、不同的电脑上,以它为 “中介、桥梁” 共享文件。
-
它胜似网盘的地方在于:它能记录你和你的小伙伴们对文件修改的所以历史版本,并且你可以将你的文件恢复到你感兴趣的某个历史版本。
Git 并非唯一的版本控制系统,它的前辈是 Subversion 。2014 年 Git 的市场占有率首次超过 Subversion ,成为主流。
Git 相较于 Subversion 的先进之处在于:
-
Subversion 中的版本信息仅存在于中央仓库,而 Git 中所有的本地库中都有完整的历史版本信息。
-
Subversion 中的 “分支” 很重,创建分支、删除分支、合并分支等分支相关操作很慢,而 Git 中的分支很轻,分支操作是 Git 的拳头特性
2、 Git的安装
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。由于开发机大多数情况都是windows,所以本教程只讲解windows下的git的安装及使用
a、安装git
-
下载git
官方下载地址:Git - Downloads
淘宝下载地址:CNPM Binaries Mirror
- 安装git服务端
图形界面如下:
命令行界面如下:
b、Git 的配置
在使用 git 之前需要使用 config 命令配置下用户名和用户邮箱:
git config --global user.name "zhangsan"
git config --global user.email "zh"
git config --global push.default simple
git config --global core.editor notepad
这个命名是可以自己随便定的
这些信息写到全局配置文件通常在【C:\Users\Administrator.gitconfig】,Administrator不同电脑可能有所区别,重申一遍,你只需要做一次这个设置。如果你传递了 --global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要--global选项
push.default simple:Git 2.x 默认的是 simple,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码
push.default matching: Git 1.x 的默认行为,其意是如果你执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支
在使用 git 之前创建 SSH Key,未来会使用到:
ssh-keygen -t rsa -b 4096 -C "备注"
一路回车
cat ~/.ssh/id_rsa.pub
二,本地仓库
git init 创建本地仓库
git add 从工作区提交到暂存区
git add stu.java
git add . -- 提交所有文件
git commit 从暂存区提交到本地仓库
git commit -m "提交注释"
git status --查询文件状态
git log -- 查看文件日志
git reset --hard commitID --版本切换
git reflog --查看操作记录
三、GIT分支操作
1、关于分支
版本的提交不可能『依次进行,以便形成一条直线型的提交历史记录』,原因有二:
-
并行式开发:有两个以上的开发者在对同一个项目进行并行式开发。
版本库 1 版本库2
A <--- B <--- C A <--- B <--- DC
/
A <--- B
\
D
- 修复旧版本中的 bug:一方面要修复旧版本中的 bug,而与此同时又要创建和发布新的版本。
前期
A <--- B <--- C <--- D修复 bug 之后
C <--- D
/
A <--- B
\
E
分支可以看作是开发过程当中的并行线,我们可以把提交图想象成游泳池中的泳道:
E release
/
A <--- B <--- C <--- D master
\
F test
在一个 Git 版本库中,总是唯一存在着一个『活动分支』(也叫『当前分支』)。我们可以用 branch 命令(不带选项)来列出所有的分支。Git 会用星号(*)凸显出当前活动分支。
2. 分支基本操作
a、查看分支
通过 git branch 可以看到 Git 仓库的所有分支。
当执行 git init 指令的时候,Git 就会自动产生一个名为 master 的分支:主分支。主分支是默认的、初始的。
b、创建分支
创建新的分支,也是使用 git branch 命令。
git branch 新分支名 [从当前分支的 Commit]
如果省略 Commit,那么就是从当前分支的 HEAD 分化出新分支。
c、切换分支
建立分支后,可以通过 git checkout 命令来切换当前分支:
git checkout <分支名>
有个简单的办法可以创建新分支并切换:
git checkout -b <新分支名> [Commit节点]
(即它总是在当前分支上的)
在图形化界面中,直接双击分支名称即可完成切换
d、删除分支
删除分支使用:
git branch -d <被删除分支名>
如果在删除一个分支时,自己还未转移到其他分支上,git 会拒绝删除操作。如果坚持要删除的话,则使用 -D 选项替换 -d 选项。
一般情况下,分支应该合并到另一个分支。如果要删除还未合并的分支,Git 会显示错误信息,并拒绝删除。当然你也通过 -D 选项来强制删除
3、分支合并
在大多数情况下,项目的分支都会被合并到主(master)分支。合并项目分支需要使用 git merge 命令:
git merge <另一个分支名>
一般都是其他分支合并到master分支,先切换到master 分支,在执行git merge dev01,意思把dev01 代码合并到master上
4、冲突
Git 的设计目标之一就是为了能够让开发者之间的分布式协作变得尽可能容易一些。因此从很大程度上来说,merge 命令能自动对分支进行合并,完全不需要用户交互。
当两个分支对于同一个文件做出了不同的操作时,可能会出现冲突,而且此时,Git 无法自动 “帮” 你合并。最常见的冲突情况有 2 种:
-
两个分支对于同一个文件的同一个位置做出了修改。那么你在合并这两个分支时,Git 无法自己决定 “合并后保留的是哪个分支上的内容(而废弃另一个),亦或者是两个分支上的都要保留” ?这种情况,就需要人来裁决。
-
一个分支对一个文件执行了删除操作,而另一个分支上这个文件还在,仅仅只是内容有变动。那么你在合并这两个分支时,Git 无法自己决定 “合并后这个文件到底是应该删除,还是留着” ?这种情况也需要人来裁决。
补充一点,并非对于同一个文件的修改,都会造成冲突。比如,如果两个分支是对同一个文件的不同位置做出了修改(注意和上述第一种情况的区别),Git 自己也会自动合并:合并后的内容会同时采纳两个分支上的操作。
当 Git 遇到了自身无法解决的冲突时,就会显示以下错误信息。
$ git merge a-branch Auto-merging foo.txt CONFLICT (content): Merge conflict in foo.txt Automatic merge failed; fix conflicts and then commit the result.
此时,如果执行 git status 命令,会看到 git 提醒你,它无法完成自动合并,需要你手动进行编辑,并且要求你在编辑之后,执行 git commit 。
$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add <file>..." to mark resolution) both modified: foo.txt no changes added to commit (use "git add" and/or "git commit -a")
冲突标志通常会描述两组修改。首先这些被修改的行在当前分支(HEAD)中的内容。接下来又列出了他们在另外一个分支的内容,例如:
第一次修改 第二次修改
手动解决完冲突以后,运行 git add 命令把相关文件添加到暂存区。继续执行 git merge --continue 命令编辑新生成的提交的 log 信息。然后 merge 完成。