git教程笔记

Git是什么

Git能解决什么问题

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了。

安装Git

  • Linux上安装
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网站查看各类配置文件,组合一下便可用。

通常须要忽略那些文件呢?

  • 操做系统自动生成的文件或者编译生成的文件。
  • 忽略敏感信息,好比密码
    好比Python里面,
# 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就会把每一个版本自动串成一条时间线

image.png

如何进行版本回退

首先,Git必须知道当前版本是哪一个版本,

  • HEAD表示当前版本,
  • 上一个版本就是HEAD^
  • 上上一个版本就是HEAD^^
  • 固然往上100个版本写成HEAD~100

而后使用git reset开始回退

git reset --hard HEAD^

若是发现回退错了,因此想回到最开始的版本。

  • 若是命令行窗口尚未被关掉,能够顺着往上找直到找到那个版本的ID是3628164...,因而就能够指定回到将来的某个版本:
$ git reset --hard 3628164
  • 若是命令行窗口关闭了,可使用git reflog来查看执行commit命令时候的commit id。而后使用git reset

总结一下:
如今总结一下:

  • HEAD指向的版本就是当前版本,所以,Git容许咱们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log能够查看提交历史,以便肯定要回退到哪一个版本。

  • 要重返将来,用git reflog查看命令历史,以便肯定要回到将来的哪一个版本。

几个概念

首先解释几个名词:

  • 工做区:指的是创建了git的目录,也就是平时咱们进行代码编辑的地方
  • 版本库:工做区有一个隐藏目录.git,是Git的版本库。
    版本库里面有暂存区(Stage)、分支(Master)以及指向分支的指针HEAD
    其中Git区别于其余的版本控制系统的一个不一样之处就是有了暂存区

git add命令实际上就是把要提交的全部修改放到暂存区(Stage),而后,执行git commit就能够一次性把暂存区的全部修改提交到分支。

image.png

理解了这个,咱们来可以下的过程

第一次修改 -> git add -> 第二次修改 -> git commit

能够发现第二次修改之后并无git add,也就是第二次修改的内容没有放到暂存区,因此git commit不会把第第二次的修改提交了。

这就是Git比其余版本控制系统优秀的地方,由于Git跟踪管理的是修改,而不是文件

没有提交到分支以前的撤销

以前咱们说到了若是已经git commit到分支之后,要进行版本回退应该怎么作。

可是若是咱们只是添加到了暂存区,甚至还没提交到暂存区,此时应该如何撤销呢?

  • 只是修改,没有add到暂存区:
git checkout -- file

使用这个命令还能够把误删的文件恢复回来

  • 已经add到暂存区,可是没有commit
    • 首先使用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
image.png

当建立新的分支后,Git新建了一个指针devHEAD指向dev,切换到了dev上了。而后后面的修改都是在dev上了,master指针不变。

image.png

当咱们在dev上把工做完成了,就能够合并分支。方法就是直接把master指向dev当前的提交。

image.png

下面是具体用命令怎么作

  • 建立dev分支并切换
$ git branch dev
$ git checkout dev#切换分支
  • 正常提交
  • 切换到master分支上
  • 合并指定分支dev当前master分支
git merge dev

此时有可能两个分支都有提交,因此没法自动合并,须要手动解决冲突,再提交
image.png

  • 删除分支
$ git branch -d dev

分支策略

在实际团队协做的时候,应该保证master很是稳定,只 是用来发布新的版本,平台应该不在上面修改。

每一个人能够常常生成一些dev分支, 在上面进行修改,当有必要的时候,再合并到主分支上便可。

场景一:Bug分支

每一个bug均可以经过一个新的临时分支来修复,修复后,合并分支,而后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,能够建立一个分支issue-101来修复它,可是dev上的工做只进行到一半,还无法提交,怎么办?

  • 可使用stash功能把现场存储起来,以后能够恢复
git stash
  • 而后建立Bug分支,进行修复
  • 切换到master上,合并,删除分支
  • 如今应该回到dev分支继续干活了。恢复现场
    • git stash apply:恢复之后stash内容不删除,须要再使用git stash drop
    • git stash pop:恢复的时候同时把stash的内容也删除了。
      由于可能屡次保存现场,因此能够先使用git stash list查看,而后恢复指定的stash
$ git stash apply stash@{0}

场景二:Feature分支

开发一个新feature,最好新建一个分支,可是还没开发完的时候,收到通知取消此特性。

此时固然直接删除就好,不过问题就在于分支尚未被合并,若是删除能够经过git branch -D <name>强行删除。

使用标签

发布一个版本的时候,能够先在版本库里面打一个tag。标签其实就是版本库的一个快照

既然有commit,为何还要tag呢?

好比要将上周一的版本打包发布,咱们知道commit id是一堆乱七八糟的数字,并很差查找,若是加上一个tag v1.2,就有了实际意义,能够与某个commit绑在一块儿,更好查找。

如何打标签

  • 首先,切换到打标签的分支上git branch
  • 使用git tag v1.l0建立一个标签,使用git tag能够查看全部标签,标签不是按照时间排序,而是按照字母排序
  • 若是要绑定历史的 commit,能够怎能先使用git log找到commit id
git 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 Key
    打开CMDer,输入
ssh-keygen -t rsa -C "youremail@example.com"#须要把邮件地址换成你本身的邮件地址

而后一路回车
能够经过everything搜索一下id_rsa.pub这个公钥在那里,而后使用Notepad++打开,复制全部的内容。
image.png

  • 在Gitee的设置里面粘贴公钥的内容。

image.png

为何要SSH Key呢?
由于码云要识别这个推送确实是你本人干的。

固然码云支持多个Key,若是有多个电脑,能够创建多个Key

将代码推送到远端

若是要把代码推送到远端,有两种场景,一是如今已经在本地创建了仓库了,如今想在Gitee上一样创建一个,而后合并便可。
另外一种是如今啥都没干,直接从Gitee上建一个,而后clone到本地便可。

首先在Gitee上创建一个新仓库名字是articlespider
image.png

  • 若是已经在本地创建了仓库
    image.png
    • 首先关联远程库: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是针对当前用户起做用的

搭建Git服务器

搭建服务器

须要准备一台运行Ubuntu的机器

  • 安装git :sudo apt-get install git
  • 建立git 用户,用来运行git服务:sudo adduser git
  • 建立证书登陆
    收集全部须要登陆的用户的公钥,就是他们本身的id_rsa.pub文件,把全部公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
  • 初始化git仓库
    选定一个目录做为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
$ sudo git init --bare sample.git

这样就会建立一个没有工做区的裸仓库,把全部者改成git

sudo chown -R git:git sample.git
  • 禁用shell登陆
    编辑/etc/passwd文件完成。找到相似下面的一行:
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学习。

相关文章
相关标签/搜索