Git能解决什么问题?答曰:版本控制。html
常常写文档的同窗应该比较清楚,对某个文档修改了一点之后,又不想直接覆盖,这样的话,后面发现写错了,就恢复不回来。因此就复制出不少文件名不同,可是内容差很少的文件。git
这样也不是不能够,可是问题在于,Copy了不少份,太消耗空间。同时查找恢复也并不方便。github
因此咱们但愿有这样一种软件,它能够shell
好比这样windows
版本 | 文件名 | 用户 | 说明 | 日期 |
---|---|---|---|---|
1 | service.doc | 张三 | 删除了软件服务条款5 | 7/12 10:38 |
2 | service.doc | 张三 | 增长了License人数限制 | 7/12 18:09 |
3 | service.doc | 李四 | 财务部门调整了合同金额 | 7/13 9:51 |
4 | service.doc | 张三 | 延长了免费升级周期 | 7/14 15:17 |
其实仅仅是对Word文档进行版本控制,我以为有道云协做就能够了,可是它须要使用外网,并且不是利用Windows自带的目录,感受仍是不太方便。安全
其实版本控制器还有不少,好比CVS和SVN,可是它们都是集中式的控制系统。bash
所谓集中式,天然有个Master级别的角色,它能够保存全部的版本库。你们须要先从版本库里面得到最新的版本,修改之后再上传。这样Master天然就有了全部分支最新的版本了。服务器
缺点是必须联网,是否是很相似与上面说到的有道云笔记啊!app
那分布式版本控制系统有啥区别呢?分布式系统没有Master这个角色,全部的终端一视同仁,每一个人都有一个完整的版本库。那怎么协做呢?只须要互相通讯,互相推送就能够了。ssh
分布式系统的优势在于安全,一我的的电脑坏了,还有其余人的电脑做为备份嘛。
固然在实际应用的时候,通常不会有两我的互相推送,仍是会引入一个中央服务器,可是它就相似于一个交换机,只是用来交互数据,没有它你们也能够在本地干活。
并且Git还有强大的分支管理功能,仍是免费的。如今最快、最简单也最流行的就是Git了。
sudo apt-get install git
首先要进行全局设置:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
什么是版本库?就是仓库,respository,能够理解为一个目录,里面的全部文件能够被Git管理起来,里面的文件修改、删除都跟跟踪到。
下面来建立版本库,
在须要建立版本库的地方里面打开cmder,输入
git init
当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的
有些时候须要把某些文件放到目录中,可是又不能提交它。能够在Git工做区创建一个.gitignore
文件,里面填充要忽略的文件名
咱们能够经过.gitignore网站查看各类配置文件,组合一下便可用。
通常须要忽略那些文件呢?
# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
有的时候,想添加一个文件到Git,发现添加不了,多半是被忽略了。可使用
git add -f <文件>
也能够看是哪条规则限制了这个文件的上传
git check-ignore -v <文件>
全部的版本控制系统都只能跟踪文本文件的改动,好比TXT文件、代码等。
对于图片、视频、Word等都是二进制文件,虽然仍然能够由版本控制系统管理,可是没有办法对比文件系统的变化。也就是说经过Cmder没法对比两个版本之间的差异。
因此使用Git主要仍是针对于代码文件、TXT文件等进行版本控制,须要注意的是
使用windows进行编码的时候,建议使用Notepad++将默认编码设置为UTF-8 without BOM
添加文件到Git仓库,分两步:
第一步,使用命令git add .
,注意,可反复屡次使用,添加多个文件;
要随时掌握工做区的状态,使用git status
命令。
若是git status告诉你有文件被修改过,用git diff readme.txt
能够查看修改内容。
git diff HEAD -- readme.txt
能够看查看工做区和版本库里面最新版本的区别
第二步,使用命令git commit -m "备注"
进行正式提交。
实际上每次执行git commit -m
就保存了一次快照
,相似于打游戏的时候存一次档。若是咱们想回退的话,能够经过快照来进行恢复rollback
可使用git log --pretty=oneline
命令显示从最近到最远的提交日志,以时间轴的形式显示日志提交。
上面一章咱们讲了,可使用git commit
进行提交,而后使用git log --pretty=oneline
查看有提交的版本。
$ git log --pretty=oneline 3628164fb26d48395383f8f31179f24e0882e1e0 append GPL ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
其中相似3628164...882e1e0的是commit id(版本号),为了保证多人提交的环境下,commit id不一样,因此Git使用了SHA1计算出来的一个很是大的数字,用十六进制表示,这样就能够避免冲突了。
Git就会把每一个版本自动串成一条时间线
首先,Git必须知道当前版本是哪一个版本,
HEAD
表示当前版本,HEAD^
HEAD^^
,HEAD~100
而后使用git reset
开始回退
git reset --hard HEAD^
若是发现回退错了,因此想回到最开始的版本。
$ git reset --hard 3628164
git reflog
来查看执行commit命令时候的commit id。而后使用git reset
总结一下:
如今总结一下:
HEAD指向的版本就是当前版本,所以,Git容许咱们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
能够查看提交历史,以便肯定要回退到哪一个版本。
要重返将来,用git reflog
查看命令历史,以便肯定要回到将来的哪一个版本。
首先解释几个名词:
暂存区(Stage)
、分支(Master)以及指向分支的指针HEAD
暂存区
git add
命令实际上就是把要提交的全部修改放到暂存区(Stage),而后,执行git commit
就能够一次性把暂存区的全部修改提交到分支。
理解了这个,咱们来可以下的过程
第一次修改 -> git add -> 第二次修改 -> git commit
能够发现第二次修改之后并无git add
,也就是第二次修改的内容没有放到暂存区,因此git commit不会把第第二次的修改提交了。
这就是Git比其余版本控制系统优秀的地方,由于Git跟踪管理的是修改,而不是文件
以前咱们说到了若是已经git commit
到分支之后,要进行版本回退应该怎么作。
可是若是咱们只是添加到了暂存区,甚至还没提交到暂存区,此时应该如何撤销呢?
git checkout -- file
使用这个命令还能够把误删的文件恢复回来
git reset HEAD file
回退到工做区。git checkout -- file
把工做区的修改撤销了。总之,记住一点:git checkout -- 文件
命令,撤销的是工做中文件的修改,而git reset HEAD -- 文件
命令,撤销的是暂存区中文件的修改。
git checkout . #本地全部修改的。没有的提交的,都返回到原来的状态 git stash #把全部没有提交的修改暂存到stash里面。可用git stash pop回复。 git reset --hard HEAD #返回到某个节点,不保留修改。
分支有什么用?每一个人能够建立本身的分支,想提交就提交,直到完成全部的功能之后,一次性合并到原来的分支上,这样能够不影响别人工做。
Git好就好在切换分支只须要不到1s,比SVN等快不少。
Git默认有一条主分支,即master
分支,而HEAD
指针实际上指向当前分支的,此时就是master
当建立新的分支后,Git新建了一个指针dev
,HEAD
指向dev
,切换到了dev
上了。而后后面的修改都是在dev
上了,master
指针不变。
当咱们在dev
上把工做完成了,就能够合并分支。方法就是直接把master
指向dev
当前的提交。
下面是具体用命令怎么作
$ git branch dev $ git checkout dev#切换分支
master
分支git merge dev
此时有可能两个分支都有提交,因此没法自动合并,须要手动解决冲突,再提交
$ git branch -d dev
在实际团队协做的时候,应该保证master
很是稳定,只 是用来发布新的版本,平台应该不在上面修改。
每一个人能够常常生成一些dev分支, 在上面进行修改,当有必要的时候,再合并到主分支上便可。
每一个bug均可以经过一个新的临时分支来修复,修复后,合并分支,而后将临时分支删除。
当你接到一个修复一个代号101的bug的任务时,能够建立一个分支issue-101来修复它,可是dev上的工做只进行到一半,还无法提交,怎么办?
git stash
git stash apply
:恢复之后stash内容不删除,须要再使用git stash drop
git stash pop
:恢复的时候同时把stash的内容也删除了。git stash list
查看,而后恢复指定的stash$ git stash apply stash@{0}
开发一个新feature,最好新建一个分支,可是还没开发完的时候,收到通知取消此特性。
此时固然直接删除就好,不过问题就在于分支尚未被合并,若是删除能够经过git branch -D <name>
强行删除。
发布一个版本的时候,能够先在版本库里面打一个tag。标签其实就是版本库的一个快照
既然有commit,为何还要tag呢?
好比要将上周一的版本打包发布,咱们知道commit id是一堆乱七八糟的数字,并很差查找,若是加上一个tag v1.2
,就有了实际意义,能够与某个commit绑在一块儿,更好查找。
git branch
git tag v1.l0
建立一个标签,使用git tag
能够查看全部标签,标签不是按照时间排序,而是按照字母排序git log
找到commit idgit tag v0.9 commit id
git tag -a v0.1 -m "version 0.1 released" 32321332
可使用 git show v0.1
查看说明。
若是标签打错了,能改吗?固然能。删除便可。
$ git tag -d v0.1
由于建立的标签都只存储在本地,不会自动推送到远程。因此,打错的标签能够在本地安全删除。
到如今为止咱们已经学会了如何在本身的电脑上进行工做,本章则将讲解如何把代码托管到Gitee远程仓库来进行管理,这样就能够进行协做以及代码的备份呢。
以前咱们只是在本身的电脑上搭一个Git仓库,实际上也能够分布到不一样的机器上,别的机器只要复制原始版本就行了,这样就能够保证你们都同样。
因此彻底能够搭一个Git服务器,而后全部的人都从服务器里面复制一份到本身这边,再把各自的提交推送到仓库里面,实现协做。
最著名的Git服务器当属GitHub
,不过在国内比较的慢,因此咱们使用中国版的GitHub
——码云(gitee.com)
本地Git仓库和GitHub仓库之间的传输是经过SSH加密的,因此须要先上传公钥,想知道原理能够点击HTTPS
ssh-keygen -t rsa -C "youremail@example.com"#须要把邮件地址换成你本身的邮件地址
而后一路回车
能够经过everything
搜索一下id_rsa.pub
这个公钥在那里,而后使用Notepad++打开,复制全部的内容。
为何要SSH Key呢?
由于码云要识别这个推送确实是你本人干的。
固然码云支持多个Key,若是有多个电脑,能够创建多个Key
若是要把代码推送到远端,有两种场景,一是如今已经在本地创建了仓库了,如今想在Gitee上一样创建一个,而后合并便可。
另外一种是如今啥都没干,直接从Gitee上建一个,而后clone到本地便可。
首先在Gitee上创建一个新仓库名字是articlespider
git remote add origin git@server-name:path/repo-name.git
git push -u origin master
第一次推送master分支的全部内容;git push origin master
cd existing_git_repo git remote add origin https://gitee.com/***/articlespider.git git push -u origin master
若是在新建远程仓库的时候加上了README.MD
,可是这个Readme.md
又不在本地库里面,因此会报错。能够
$ git pull --rebase origin master
固然也能够在本地根目录新建一个Readme.md
git clone
复制一个版本下来。git clone git@gitee.com:****/articlespider.git
建立了远程仓库之后,能够进行多人协做。能够将本地的分支推送到远端,也能够从远端拉取
远程仓库默认名称是origin
可使用git push进行推送。
git push origin 分支
如今另外一我的须要在dev分支上作开发,首先应该先clone一份到本地。
git clone git@gitee.com:****/articlespider.git
当从远程仓库克隆的时候,Git自动把master与远程的master对应起来。
查看远程库的信息:git remote -v
此时只能看到master
分支,若是也要在分支dev
上开发的话,必须建立远程origin的dev分支到本地,
git checkout -b dev origin/dev
而后就能够继续开发了。
那么咱们怎么与之协做呢?
git push origin <branch>
推送本身的修改git pull
合并。no tracking information
,说明连接关系没有创建起来。使用git branch --set-upstream <branch> origin/<branch>
git push origin <branch>
由于建立的标签都只存储在本地,不会自动推送到远程
若是要推送某个标签到远程,使用命令git push origin <tagname>
或者,一次性推送所有还没有推送到远程的本地标签:
$ git push origin --tags
若是要删除的话,首先须要先删除本地的。
$ git tag -d v0.9
而后,从远程删除。
$ git push origin :refs/tags/v0.9
咱们可能同时进行多个项目,他们都须要推送到远端。好比learngit项目,如今要与远程库关联
git remote add origin git@gitee.com:<your name>/learngit.git
若是报错fatal: remote origin already exists.
说明本地库已经关联了一个名叫origin的远程库
能够先删除
git remote rm origin
再关联一个远程库gitee
git remote add gitee git@gitee.com:<gitee name>/learngit.git
此时远程库的名称叫gitee,不叫origin。
若是要推送:
git push gitee master
所谓配置别名其实就是配置命令的简写,好比使用git st表示git status等。
$ git config --global alias.st status#查看工做区状态 $ git config --global alias.co checkout#切换分支,撤销修改 $ git config --global alias.ci commit#提交 $ git config --global alias.br branch#分支 $ git config --global alias.unstage 'reset HEAD'#回退 $ git config --global alias.last 'log -1'#查看log $git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
加上--global是针对当前用户起做用的
须要准备一台运行Ubuntu的机器
sudo apt-get install git
sudo adduser git
$ sudo git init --bare sample.git
这样就会建立一个没有工做区的裸仓库,把全部者改成git
sudo chown -R git:git sample.git
git:x:1001:1001:,,,:/home/git:/bin/bash
改成:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户能够正常经过ssh使用git,但没法登陆shell,由于咱们为git用户指定的git-shell每次一登陆就自动退出。
$ git clone git@server:/srv/sample.git
最后把全部的命令总结成一个表格
一级 | 二级 | 命令 |
---|---|---|
提交代码 | 新建仓库 | git init |
提交到暂存区 | git add . | |
提交到分支 | git commit -m "" | |
查看 | 查看状态 | git status |
查看提交记录 | git log --pretty=oneline | |
查看命令历史 | git reflog | |
对比 | git diff HEAD -- readme.txt | |
标签 | git tag | |
远端仓库 | git remote -v | |
版本控制 | 未提交到暂存区 | git checkout . |
已提交到暂存区 | git reset HEAD file | |
已经提交到分支 | git reset --hard <HEAD^> | |
分支 | 建立分支 | git branch dev |
切换分支 | git checkout dev | |
合并 | git merge dev | |
删除分支 | git branch -d dev | |
强行删除 | git branch -D dev | |
存储现场 | git stash | |
恢复现场 | git stash pop | |
标签 | 建立标签 | git tag v0.9 |
删除标签 | git tag -d v0.8 | |
推送远程标签 | git push origin --tags | |
删除远程标签 | git push origin :refs/tags/v0.9 | |
远程仓库 | 上传公钥 | ssh-keygen -t rsa -C "youremail@example.com" |
关联远程库 | git remote add origin https://gitee.com/***/articlespider.git | |
删除远程库 | git remote rm origin | |
第一次提交 | git push -u origin master | |
普通提交 | git push origin | |
拉取 | git pull origin | |
多人协做 | 复制 | git clone git@gitee.com:****/articlespider.git |
建立远端分支到本地 | git checkout -b dev origin/dev | |
建立连接关系 | git branch --set-upstream origin/ | |
别名 | 查看log | $git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue) |
本文主要是根据Git教程整理获得的,目的是帮助Git学习。