Git学习笔记
导语:
Git学习笔记
一、Git简介
git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何大小项目的版本管理。与CVS相比,它不是把版本库放在集中的存储服务器,而是每个开发者电脑上都是一个版本库,无须联网就可以管理代码版本,并且分支管理更高效,切换更快捷方便,已经成为现在开发者主流版本控制工具。
二、前言
git仓库初始的创建通常有两种方式,一种是自己本地创建项目,再链接到远程仓库。另一种是先创建远程仓库,再将远程仓库克隆(git clone)到本地。接下来我就分别从这两个方式讲解。
三、本地仓库创建
- 初始化仓库
$ mkdir gitstudy
$ cd gitstudy
$ git init - 加入暂存区
$ git add hellogit.txt
$ git add -A 或者 git add . //是添加全部文件
- 将文件加入历史版本
$ git commit -m "add hellogit file" //-m是该版本的说明语句
- 与远程仓库链接
$ git remote add origin https://gitcafe.com/jiyiren/gitstudy.git
- 提交到远程仓库
$ git push -u origin master //-u 第一次提交让git记住本地仓库与远程仓库
//的连接,以后可以不要
四、远程仓库先创建
- 创建远程仓库,可以到github或者gitcafe或者gitosc等
- 将远程仓库克隆(clone)下来,本地就会有对应的文件夹仓库
$ git clone https://gitcafe.com/jiyiren/gitstudy.git
- 修改后加入暂存区,提交到历史版本,再推送到远程
$ git add -A
$ git commit -m "modify hellogit file"
$ git push origin master
五、版本管理
1. 说明
我们有两个仓库,一个本地仓库,一个远程仓库,两个仓库互相关联。本地仓库为了开发代码,远程仓库为了记录版本和保存正确的代码。git的主要功能都应该在我们本地仓库里使用,那git具体怎么管理代码的呢?这要先从本地仓库的划分说起。本地仓库也就是开发的文件夹里,分为工作区,暂存区和历史版本区,工作区就是我们实际操作的区域,暂存区就是git add后文件进入的暂存状态,历史版本区是git commit后文件记录在历史版本里的区域。我们的git push就是向远处推送历史版本区的内容,工作区和暂存区为我们的版本回退提供方便。
2. 重要命令解释
$ git status
查看当前的工作区的状态,通常有三种状态,一种是工作区干净: nothing to commit, working directory clean, 一种是使用了git add之后,显示Changes not staged for commit(提示有已添加但是未提交的修改) ,一种是新添加文件后,显示Untracked files(提示有未跟踪的文件)$ git diff
命令:
- 这个命令的理解点就是在参照物,也就是对比双方是谁。
$ git diff
图片中1标号内容,该句将工作区的修改与暂存区对比。例如:$ git diff mtest.txt
$ git diff --cached
图示2标号,这句则是将
暂存区与本地历史版本区中的最新版本对比。例如:$ git diff --cached mtest.txt
$ git diff HEAD
图示3标号,这句是将本地工作区(包含了暂存区内容)与本地历史版本区里的最新版本对比。如:$ git diff HEAD -- mtest.txt
,此处文件名要用--
分隔,前后都有空格。- 图示4和图示5分别为两个历史版本id对比和本地与分支的对比。这个用的都比较少。
显示提交版本历史记录
$ git log
或者$ git log --pretty=oneline
可以显示我们提交版本的记录,按照从近到远的版本显示。$ git log --graph --pretty=oneline
可以显示分支状态:$ git log --graph --pretty=oneline --abbrev-commit
这个是简短形式:- 主要是git log结合多种参数显示各种结果具体参数请看git log参数
git reset --hard <版本>
回退版本,有两种方式,一种是相对回退,我们都知道HEAD默认指向当前分支的最新历史版本,而git给了我们一种以HEAD方式的相对语句就是HEAD^
这个代表当前版本的上一个版本,HEAD^^
代表当前版本的上上一个版本,可以一直加^
向上的箭头来回退版本。当然如果回退个数很多比如100个,那个写100个^
也麻烦,所以有缩写就是HEAD~100
。$ git reset --hard HEAD^ //回退到上一个版本 $ git reset --hard HEAD~100 //回退到上100个版本
另一种方式是绝对回退,上面的命令
$ git log --pretty=oneline
可以显示历史提交版本的commitid,当然很长,但是记录前面7个数字就可以了标识一个版本了。$ git reset --hard 3628164 //回退到3628164..的版本
git reflog
这个是命令历史记录。当我们回退到上一个或者几个版本时,我们用$ git log
命令查看的只能显示是当前版本以及当前版本之前的,那比当前版本还新的版本我们就看不到了,那怎么办?git reflog
就可以显示我们所有操作的命令历史,注意与git log
的区别,git log
是版本历史记录,git reflog
是命令历史记录。从这个里面就可以找到最新版本的commitid
,就可以回退到任意一个版本。- 撤销修改,其实回退版本也相当于撤销修改了,但是有特别的几个命令比较常用,这里讲下。
git checkout -- filename
这个是将工作区下的文件恢复到暂存区下的状态,取消本地未暂存的修改,暂存区不请空,也就是如果你后来的修改将被撤销。如:$ git checkout -- mtext.txt
。git reset HEAD filename
这个是将暂存区的修改恢复到本地工作区,暂存区将清空。如:$ git reset HEAD mtext.txt
。
六、分支与合并
1. 说明
2. 命令解释
- 查看分支
$ git branch //查看本地分支
$ git branch -r //查看远程分支
$ git branch -a //查看所有分支(包括本地和远程) - 创建分支
git branch develop //创建develop分支
- 切换分支
git checkout develop //切换到develop分支
- 创建并切换分支
git checkout -b mdeve //创建并切换到mdeve分支
- 删除分支
git branch -d mdeve //删除mdeve分支,强行删除用-D
- 合并分支默认ff模式
git merge mdeve //合并mdeve分支到当前分支
默认合并方式是Fast-forward,也就是将要合并的分支直接向当前分支提交。没有提交信息 解决冲突
很多时候用Fast-forward方式直接提交是不成功的,因为有冲突存在,所以我们要手动解决冲突
$ git merge feature1 //合并feature1分支
不成功的结果如下:
Git用<<<<<这个箭头表示HEAD当前分支,====这个为分隔线,>>>>>>这个为feature1分支里的内容,只要手动删除这三处并自己选择内容作为最终结果。
合并分支禁ff模式合并
$ git merge --no-ff -m "merge no ff" dev //采用no ff模式合并并添加了信息提示
Fast-forward模式合并直接向当前分支提交,这种模式下如果删除掉分支,就会丢掉分支信息
如果用no ff这种模式合并,git就会在merge时生成一个新的commit,这样就可以从分支历史里查看出分支信息了。暂存临时现场
$ git stash //把工作现场存储起来,使得工作区干净如初
主要用于在自己工作到一半,没法提交,然后又有新的bug要修复,就用这个命令保存现场,然后切换到bug分支,修复。
恢复临时现场
$ git stash list //查看临时工作区保存记录 stash@{0}: WIP on dev: 6224937 add merge//这是临时工作区记录列表 $ git stash apply stash@{0} //恢复刚刚的临时工作区 $ git stash drop stash@{0} //删除刚刚的临时保存记录
上面的命令已经可以恢复并删除保存记录了,但是语句比较多,还有一种方法直接恢复到最近一次的临时现场:
$ git stash pop //既恢复工作区又删掉了保存记录
七、多人协作(重点)
1. 说明
2. 讲解
查看远程信息
$ git remote //查看远程库的信息 origin $ git remote -v //查看更详细信息 origin git@github.com:michaelliao/learngit.git (fetch) origin git@github.com:michaelliao/learngit.git (push)
推送分支
$ git push origin master //推送主分支 $ git push origin mdev //推送mdev分支
抓取分支 (模拟多人协作,假如你自己和一个A同学协作)
A同学: $ git clone url.. //先从仓库克隆 $ git branch //查看分支,默认只有master分支,但是远程是有dev分支的 $ git checkout -b dev origin/dev //所以要本地创建dev并与远程相连接 $ git commit -m "add something by A" //A同学修改了东西并添加入版本库 $ git push origin dev //上传到远程仓库
我自己: $ git commit -m "add something by me" //此时我自己也修改了一些东西, //并与A同学该的相同地方 $ git push origin dev //此时推送将推送失败,提示先git pull $ git pull //于是你也就git pull,提示失败,本地dev未与远程连接 $ git branch --set-upstream dev origin/dev //再按照提示将本地分支与远程连接 $ git pull //再次git pull,成功,但是出现冲突,解决冲突 $ git commit -m "merge&add something" //提交冲突,至此就完成了多人协作
分支链接(重要)
$ git checkout -b dev origin/dev
这个是新建本地分支为dev并与远程的dev相关联
$ git branch --set-upstream dev origin/dev
这个是我之前新建了分支,但是没有关联到远程分支,这里是将已有的分支关联到远程分支。
八、标签
打标签两种方式
$ git branch //查看分支 *dev master $ git checkout master //切换到要打标签的分支 Switched to branch 'master' $ git tag v1.0 //用git tag name来打标签,默认打在最新提交的commit上 $ git tag //查看所有标签
//还可以如下打标签,按照commit id来打标签,如下: $ git log --pretty=oneline --abbrev-commit//查看commit历史,找到要打标签的id号 $ git tag v1.0 622493 $ git tag //查看标签列表(按照标签名列出) $ git show v1.0 //查看v1.0标签的详细信息
删除分支和推送分支
$ git tag -d v0.9 //删除标签0.9,创建的分支默认都在本地,不会自动推送到远程。 $ git push origin v1.0 //将标签1.0推送到远程 $ git push origin --tags //一次性将全部未推送的标签推送到远程 //要删除远程标签,有点麻烦的 $ git tag -d v0.9 //先从本地删除标签 $ git push origin :refs/tags/v0.9 //然后再从远程删除标签
九、图形化界面
git自带图形化界面的
- 在git bash里输入
git gui
就会显示图形化界面。
- 在git bash里输入
gitk
就会显示图形化的log界面
- 在git bash里输入
- SourceTree 这个自己看吧
十、git教程链接
- 官网英文教程
- 官网中文教程
- 快速简易指南
- 图解多语言(含中文)教程 –极力推荐
- 实战教程 –比较长,但是很实用