前言
虽说用了git 一段时间了,但是却没有深入了解过,今天随着廖雪峰大大的git教程来学习一波,顺便总结一下,方便以后复习。欢迎大家访问我的博客啊
集中式版本管理和分布式版本管理
- 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。集中式版本控制系统最大的毛病就是必须联网才能工作。
- 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。但是这里说的不依赖网络,并不是完全不依赖网络就能完成所以的事情,比如让其他开发人员拿到你的改动,所以说这里所说的不依赖网络只是相对的,在没有网络的情况下,可以提交变动到本地的版本库,但最终还是要依赖网络提交变动让其他开发人员看到。
安装
- linux下:安装比较简单,像我使用的deepin(linux的一种发行版)只需要一条
sudo apt-get install git
就可以完成。 - Mac OS X 上:直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
- Windows下:从
https://git-for-windows.github.io
下载,或者国内镜像
创建版本库
- 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
- 在磁盘合适的地方,新建一个目录
- 在win下,为了避免不必要的麻烦,创建目录的路径不要有中文。
- 通过
git init
命令把这个目录变成Git可以管理的仓库: - 瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
- 如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用
ls -ah
命令就可以看见。
Git基本操作
- Git提交数据
- 我们可以简单的把工作目录理解成是一个被Git服务程序管理的目录,Git会时刻的追踪目录内文件的改动,另外在安装好了Git服务程序后,默认就会创建好了一个叫做master的分支,我们直接可以提交数据到了
-
git add <filename>
或者git add .
添加到缓存区 -
git commit - m 'msg'
提交缓存区文件到本地仓库
- Git移除数据
- 有些时候会向把已经添加到暂存区的文件移除,但仍然希望文件在工作目录中不丢失,换句话说,就是把文件从追踪清单中删除
-
git rm -cache <filename>
将文件从追踪区域的缓存区域中移除,commit就不会提交了
- Git移动数据
-
git mv <filename> <newname>
修改文件名称
-
- Git 历史记录
-
git log
查看提交历史记录 -
git log -2
查看最近提交历史记录 -
git log -p -1
-p显示每次提交的内容差异,-1表示最近一次 -
git log stat -2
-stat简要显示增改行数,这样可以看到修改过的内容,对文件添加或移动的行数,并列出增减的概要信息
-
- Git 版本回退
-
git log
可以查看提交历史,以便确定要回退到哪个版本,用 commit id 来回退 -
git reset --hard HEAD^
^
表示退回上一版本,^^
上两版本HEAD~100
上100版本 -
git reset --hard commit_id
任意之前版本
-
- Git 版本前进
-
git reflog
同上
-
- Git 撤销修改
git checkout -- file
-
git checkout -- readme.txt
意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 总之,就是让这个文件回到最近一次git commit或git add时的状态。
- Git 删除文件
git rm <filename>
- 如果误删
git checkout -- <filename>
恢复道这个文件最后commit 那个版本
- Git 创建与合并分支
- 我们知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
-
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
- 每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:
-
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
-
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
-
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并
-
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
-
git checkout -b dev
创建一个新分支并切换到Dev分支 -
git branch
查看当前分支及所有分支 -
git branch <name>
创建分支 -
git checkout
切换分支 -
git merge <name>
合并某分支到当前分支 -
git branch -d <name>
删除分支
- Git解决冲突
- git的强大之处就在于,他可以将冲突部分用
<<<<<<<
,=======
,>>>>>>>
标记出来,当手动解决冲突后,提交合并。 - 可以使用
git log --graph
查看分支合并图
- git的强大之处就在于,他可以将冲突部分用
常用git命令及注释
- add #添加文件内容到文件缓存区
- branch #列出、创建或删除分支
- checkout #检出一个分支或路径到工作区
- clone #克隆一个版本库到一个新目录
- commit #记录变更到版本库
- diff #显示提交之间、提交和工作区之间等的差异
- fetch #从另外一个版本库下载对象和引用
- grep #输出和模式匹配的行
- init #创建一个空的 Git 版本库或重新初始化一个已存在的版本库
- log #显示提交日志
- merge #合并两个或更多开发历史
- pull #获取并合并另外的版本库或一个本地分支
- push #更新远程引用和相关的对象
- rebase #本地提交转移至更新后的上游分支中
- reset #重置当前HEAD到指定状态
- rm #从工作区和索引中删除文件
- show #显示各种类型的对象
- status #显示工作区状态
- tag #创建、列出、删除或校验一个GPG签名的 tag 对象