>>关于Git

1.BitMover公司收回Linux社区的BitKeeper免费使用权,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git。
2.什么是集中式版本控制系统
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。

中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式和分布式版本控制系统有什么区别?
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?

比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。

而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
3.安装Git
如果使用Debian或Ubuntu Linux,通过一条
sudo apt-get install git
就可以直接完成Git的安装;
如果是其他Linux版本,可以直接通过源码安装。
先从Git官网下载源码,然后解压,依次输入:./config,make,sudo make install这几个命令安装就好了。

>>创建版本库并提交文件

版本库又名仓库,repository,可以简单理解成一个目录,

这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
1.创建一个版本库
首先,选择一个合适的地方,创建一个空目录:

  1. $ mkdir gitrepo
  2. $ cd gitrepo
  3. $ pwd
  4. /data/gitrepo

  

第二步,通过git init命令把这个目录变成Git可以管理的仓库:

  1. $ git init
  2. Initialized empty Git repository in /data/gitrepo/.git/

  

此时当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的。

所有的版本控制系统,其实只能跟踪文本文件的改动,而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化。

Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动。

2.添加文件到仓库
第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件

  1. $ git add file1.txt file2.txt

第二步,使用命令git commit -m "commit message",完成

  1. $ git commit -m "add 2 files"

如果没有设置account,此时会提示配置账户信息:

  1. Please tell me who you are.
  2. Run
  3. git config --global user.email "you@example.com"
  4. git config --global user.name "Your Name"
  5. to set your account's default identity.
  6. Omit --global to set the identity only in this repository.

如果不添加--global参数,这个配置将只在当前的repository生效。

>>进行版本管理

1.使用git status可以让我们掌握仓库当前的状态
git status命令可以列出当前目录所有还没有被git管理的文件,
以及被git管理且被修改但还未提交(git commit)的文件。
现在我们修改file1.txt的内容并查看当前状态:

  1. $ git status
  2. On branch master
  3. Changes not staged for commit:
  4. (use "git add <file>..." to update what will be committed)
  5. (use "git checkout -- <file>..." to discard changes in working directory)
  6. modified: file1.txt
  7. no changes added to commit (use "git add" and/or "git commit -a")

file1.txt修改过但还没有添加和提交,同时没有已经添加还没有提交的修改。

2.使用git diff查看对比修改的部分。
git diff顾名思义就是查看difference,
显示的格式正是Unix通用的diff格式顾名思义就是查看difference。

  1. $ git diff
  2. diff --git a/file1.txt b/file1.txt
  3. index 006547b..078ac30 100644
  4. --- a/file1.txt
  5. +++ b/file1.txt
  6. @@ -1 +1,2 @@
  7. -This is the first file!
  8. \ No newline at end of file
  9. +This is the first file!^M
  10. +It is modified!
  11. \ No newline at end of file

  

3.提交修改和提交新文件是一样的操作
第一步是git add,下一步git commit 。

  1. $ git add file1.txt
  2. $ git commit -m "add a line"

4.使用git log显示从最近到最远的提交日志

  1. $ git log
  2. commit 0ecfc92df82585ebadd42fbd95aed9f48392a343
  3. Author: bingyue <bingyue56@163.com>
  4. Date: Tue Feb 23 03:24:30 2016 -0800
  5. add 3nd line
  6. commit 5963416b6e7f3f6eb51a577327329405cb59d937
  7. Author: bingyue <bingyue56@163.com>
  8. Date: Tue Feb 23 03:22:19 2016 -0800
  9. add a line

  

其中的数字字母组合是git的版本号,是一个SHA1计算出来的一个非常大的数字,用十六进制表示。

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:

5.进行版本回退
在Git中,用HEAD表示当前版本,也就是最新的提交,
上一个版本就是HEAD^,上上一个版本就是HEAD^^,
当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id;
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本;
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本;

下面回退到上一个版本:

  1. $ git reset --hard HEAD^
  2. HEAD is now at 5963416 add a line

重新查看版本库,已经看不到第三次修改了:

  1. $ git log
  2. commit 5963416b6e7f3f6eb51a577327329405cb59d937
  3. Author: bingyue <bingyue56@163.com>
  4. Date: Tue Feb 23 03:22:19 2016 -0800
  5. add a line 

如果这时想回到回退前的版本,只要找到那次修改的commit id,指定回到某个版本即可:

  1. $ git reset --hard 0ecfc92df82
  2. HEAD is now at 0ecfc92 add 3nd line

版本号没必要写全,确定唯一即可,Git会自动去寻找。

Git提供了一个命令git reflog用来记录你的每一次命令:

  1. $ git reflog
  2. 0ecfc92 HEAD@{0}: reset: moving to 0ecfc92df82
  3. 5963416 HEAD@{1}: reset: moving to HEAD^
  4. 0ecfc92 HEAD@{2}: commit: add 3nd line

使用这个命令可以找回很多撤销的版本号,于是可以恢复到对应的版本。

>>管理修改

1.工作区和暂存区
Git和其他版本控制系统一个不同之处就是有暂存区的概念,暂存区在Git里非常重要。
工作区(Working Directory)就是你在电脑里能看到的目录,
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

2.管理修改
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
Git管理的是修改,当你用git add命令后,
在工作区的第一次修改被放入暂存区,准备提交,
但是,在工作区的第二次修改并没有放入暂存区,
所以,git commit只负责把暂存区的修改提交了,
也就是第一次的修改被提交了,第二次的修改不会被提交。
用git diff HEAD -- filename 命令可以查看工作区和版本库里面最新版本的区别,
每次修改,如果不add到暂存区,那就不会加入到commit中。

3.撤销修改

4.删除文件
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

>>远程仓库

上面这些都是在本地的repository进行的,但是git的应用场景是远程仓库下的多人协作。
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。

最开始只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
实际情况往往是这样,一台电脑充当服务器的角色,每天24小时开机,

其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

1.使用Github
2.添加远程库并进行克隆

>>分支管理

1.创建与合并分支
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。在Git里,默认的这个分支叫主分支,即master分支。
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
2.冲突解决
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph命令可以看到分支合并图。

内容来自于 廖雪峰的Git教程

Git入门学习和应用笔记的更多相关文章

  1. git入门学习(二):新建分支/上传代码/删除分支

    一.git新建分支,上传代码到新的不同分支  我要实现的效果,即是多个内容的平行分支:这样做的主要目的是方便统一管理属于同一个内容的不同的项目,互不干扰.如图所示: 前提是我的github上已经有we ...

  2. git入门学习(一):github for windows上传本地项目到github

    Git是目前最先进的分布式版本控制系统,作为一个程序员,我们需要掌握其用法.Github发布了Github for Windows 则大大降低了学习成本和使用难度,他甚至比SVN都简单. 一.首先在g ...

  3. Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation

    原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  4. Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD

    原文:Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链 ...

  5. Elasticsearch7.X 入门学习第一课笔记----基本概念

    原文:Elasticsearch7.X 入门学习第一课笔记----基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  6. git 入门学习笔记

    安装msysgit (模拟环境Git)安装后绑定邮箱和名字$ git config --global user.name "Your Name"$ git config --glo ...

  7. git入门学习

    初步学习笔记. 1.创建仓库:git init 仓库:个人理解为文件存放及版本追踪的容器,对应着一个目录,目录中包含用户的文件及git用来追踪文件版本的一系列文件. 新建并进入HelloWorld目录 ...

  8. Git入门学习和使用

    #开篇废话 开篇废话又回来了,离开博客算是有一年了,之间曾经痛下很多次决心,继续写博客,后来都失败了,前年为了申请个CSDN专家,每天发博客,那个高产的状态,现在已然不行了,时过境迁,当时为了吃口饱饭 ...

  9. git 入门学习

    1. 分享一个我自己的百度网盘地址 链接:https://pan.baidu.com/s/17W7gpJNbqgBFy7VOl6-dvw 提取码:2a7t 2.安装就不说了,基本全默认就OK.安装完城 ...

随机推荐

  1. zabbix: failed to accept an incoming connection

    错误描述 查日志发现: failed to accept an incoming connection: connection from "192.168.186.132" rej ...

  2. WebBrowser 禁用右键

    禁用错误脚本提示 将 WebBrowser控件的 ScriptErrorsSuppressed 设为 true 禁用右键菜单 将 WebBrowser 的 IsWebBrowserContextMen ...

  3. BlockingQueue详解

    本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入 等待状态,直到BlockingQueue进了东西才会被 ...

  4. UICollectionViewController用法

    在iOS 6 发布前,开发人员习惯使用UITableView来展示几乎所有类型的数据集合.ios 6 为 IOS 引入了全新的控制器,用来显示数据集合,集合视图控制器是与表视图控制器类似的全新UI框架 ...

  5. Oulipo (kmp)

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26857   Accepted: 10709 Descript ...

  6. Spring3中的mvc:interceptors标签配置拦截器

    mvc:interceptors 这个标签用于注册一个自定义拦截器或者是WebRequestInterceptors. 可以通过定义URL来进行路径请求拦截,可以做到较为细粒度的拦截控制. 例如在配置 ...

  7. shell安装MySQL二进制包

    现在解压MySQL二进制包,稍作配置,就能用了,安装速度快,安装来练习最好不过了,哈哈 该脚本只是安装二进制的MySQL包,my.cnf只修改了简单的选项,没有过多进行设置,若朋友们用我的脚本安装作为 ...

  8. Linux瑞士军刀:密码管理Keeweb

    导读 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.我将在本文中介绍 Keeweb,它是一款 ...

  9. spring3.0+Atomikos 构建jta的分布式事务 -- NO

    摘自: http://gongjiayun.iteye.com/blog/1570111 spring3.0+Atomikos 构建jta的分布式事务 spring3.0已经不再支持jtom了,不过我 ...

  10. Linux set env export declare unset

    http://www.it165.net/os/html/201405/8390.html env /etc/profile 环境变量 系统提供 可改 set /etc/bashrc及用户自定义的变量 ...