Git是什么

Git是一个分布式版本控制系统。它可以很方便的记录你的每一次变动,而不需要每次都备份,还能让你和他人很方便的协同开发。这样你每次做了什么改动,瞄一眼就一清二楚了。

--

安装Git

从官网下载适合自己电脑的Git,点击安装,一路“Next”就可以了。安装完成,打开Console开始设置Git参数。

  1. $ git config --global user.name "xxx"
  2. $ git config --global user.email "xxx@xxx.xxx"
  3. //在上面的两个引号中分别填写你的名字和邮箱。
  4. //由于Git是分布式的版本控制系统,可能会有很多用户,每个用户需要有自己的名字和邮箱来互相区分。

--

创建版本库(repository)

简单的说,你可以将版本库理解为一个目录。我们用Git来管理我们的文件,所以你得告诉Git你需要它管理哪个目录下的文件,这个目录就是版本库。

  1. git init
  2.  
  3. //创建一个learnGit目录,并进入learnGit目录,创建版本库
  4. md learnGit
  5. cd learnGit
  6. git init

--

添加文件到版本库中

仓库下创建的文件以及目录需要手动的提交到仓库中。提交分为两步:
1. git add
2. git commit -m "提交的说明"

先创建一个文件叫做readme.txt,里面输入

  1. Git is amazing!
  2. I love Git!

接着将这个readme.txt提交到仓库中:

  1. > git add readme.txt
  2. warning: LF will be replaced by CRLF in readme.txt.
  3. The file will have its original line endings in your working directory.
  4.  
  5. > git commit -"add a readme file"
  6. [master (root-commit) e7ddd65] add a readme file
  7. warning: LF will be replaced by CRLF in readme.txt.
  8. The file will have its original line endings in your working directory.
  9.  1 file changed, 3 insertions(+)
  10.  create mode 100644 readme.txt

--

工作区的状态

使用git status查看目前工作区的状态信息

将readme.md修改为

  1. Git is great!
  2. I love git!

接着使用git status命令

  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.  
  7.         modified:   readme.txt
  8.  
  9. no changes added to commit (use "git add" and/or "git commit -a")

--

查看文件的修改内容

虽然我们可以通过git status知道文件被修改了,但是我们并不了解到底修改了哪些内容。因此使用git diff可以知道具体的修改内容。

  1. > git diff readme.txt
  2. diff --git a/readme.txt b/readme.txt
  3. index 2482f69..8e882dd 100644
  4. --- a/readme.txt
  5. +++ b/readme.txt
  6. @@ -1,3 +1,2 @@
  7. -Git is amazing!
  8. -I love Git!
  9. -
  10. +Git is great!
  11. +I love git!
  12. No newline at end of file
  13. warning: LF will be replaced by CRLF in readme.txt.
  14. The file will have its original line endings in your working directory.

--

查看整个修改过程状态

将修改过的文件进行提交

  1. > git add readme.txt

再来看当前工作区的状态

  1. > git status
  2. warning: LF will be replaced by CRLF in readme.txt.
  3. The file will have its original line endings in your working directory.
  4. On branch master
  5. Changes to be committed:
  6.   (use "git reset HEAD <file>..." to unstage)
  7.  
  8.         modified:   readme.txt

继续提交修改后的文件

  1. > git commit -"amazing became great"
  2. [master warning: LF will be replaced by CRLF in readme.txt.
  3. The file will have its original line endings in your working directory.
  4. 469dcdc] amazing became great
  5. warning: LF will be replaced by CRLF in readme.txt.
  6. The file will have its original line endings in your working directory.
  7.  1 file changed, 1 insertions(+), 1 deletions(-)

再来看当前工作区的状态

  1. > git status
  2. On branch master
  3. nothing to commit, working directory clean

--

历史记录

git log命令可以查看所有的历史记录

  1. > git log
  2. commit e4af028a493a4459fea0c0f673149281e0d11949
  3. Author: LIYANG <liyangtom@163.com>
  4. Date:   Tue Apr 26 16:17:58 2016 +0800
  5.  
  6.     add new line
  7.  
  8. commit 469dcdcd4de36234666885f87fa581441a834992
  9. Author: LIYANG <liyangtom@163.com>
  10. Date:   Tue Apr 26 16:07:00 2016 +0800
  11.  
  12.     amazing became great
  13.  
  14. commit e7ddd658bf0e5791acd07c25a56ba1c4fba1a181
  15. Author: LIYANG <liyangtom@163.com>
  16. Date:   Tue Apr 26 15:49:34 2016 +0800
  17.  
  18.     add a readme file

--

历史记录

git log 命令给出了你的每一次提交,并按时间顺序依次显示,非常详细。但是有时候你只想要一个简单的结果,可以 git log --pretty=oneline

  1. > git log --pretty=oneline
  2. e4af028a493a4459fea0c0f673149281e0d11949 add new line
  3. 469dcdcd4de36234666885f87fa581441a834992 amazing became great
  4. e7ddd658bf0e5791acd07c25a56ba1c4fba1a181 add a readme file

--

返回历史记录

在Git中有个指针叫做HEADHEAD指向哪个快照,你现在就在哪个状态。对于第N个状态的版本HEAD~N

  1. > git reset --hard HEAD~2
  2. HEAD is now at e7ddd65 add a readme file

--

返回历史记录失败

如果现在又想重新回到add new line这个版本怎么办。很简单,只要知道add new linecommit id就可以了。所以你理所当然的使用git log查看commit id

  1. > git log --pretty=oneline
  2. 469dcdcd4de36234666885f87fa581441a834992 amazing became great
  3. e7ddd658bf0e5791acd07c25a56ba1c4fba1a181 add a readme file

add new line不见了!记住git log只能查看HEAD及HEAD以前的版本。

--

查看所有历史操作

git reflog 这个命令可以查看所有操作命令

  1. > git reflog
  2. 469dcdc HEAD@{0}: reset: moving to HEAD~1
  3. e4af028 HEAD@{3}: commit: add new line
  4. 469dcdc HEAD@{4}: commit: amazing became great
  5. e7ddd65 HEAD@{5}: commit (initial): add a readme file

这时你就知道了add new line 的id了,你就可以很开心的回去了

  1. > git reset e4af028
  2. Unstaged changes after reset:
  3. M       readme.txt

--

工作区

工作区就是你存放一切文件的那个目录。比如前面我们新建了一个目录,叫learnGit,然后进入learnGit,在learnGit目录下使用git init命令把learnGit变成了一个Git可以管理的目录。Git自动生成了一个隐藏目录叫.git。此时,这个learnGit目录就是工作区。

--

版本库

工作区中各有一个隐藏目录叫.git.git就是版本库。你commit提交的就是这个地方。

--

暂存区

虽然.git目录是隐藏的,但你仍然可以打开。打开.git,进去以后你会发现里面有很多目录和文件。其中有一个名叫index的文件,这个index文件就是暂存区stage。暂存区是版本库里的一个临时存储的地方,经由暂存区,再提交到版本库。

git版本控制的逻辑过程:

  1. 首先,你在工作区创建了一个文件或者修改了一个文件

  2. 然后你有输入了git add,此时文件实际上是被添加到了暂存区stage,也就是那个index文件

  3. 接着,你又输入git commit,这才算是正式提交。Git默认给我们创建了一个master分支和一个指向master分支的HEAD指针。

--

复杂修改恢复 CND.1

第1种情况: 在工作区产生的修改还没有git add添加到暂存区。你当然可以直接打开编辑器改回到之前的样子,但我们希望Git来帮我们做这件事, 可以执行命令git checkout -- file

比如你在readme.txt中新添加了一行文本 。

  1. Git is great!
  2. I love git!
  3. just add line

这时候就产生了一个修改,现在你后悔了,觉得不应该添加这一行。

  1. $ git checkout -- readme.md

输入完命令以后没有任何提示。没有提示证明你没错。 这时你再打开readme.txt查看一下,发现刚才添加的just add line这一行已经没有了。

--

复杂修改恢复 CND.2

第2种情况: 在工作区产生的修改添加git add到了暂存区。此时只能把这个修改打回到工作区,然后在工作区把这个修改给杀掉。可以执行命令行git reset HEAD file
  1. > git reset HEAD readme.txt
  2. Unstaged changes after reset:
  3. M       readme.txt
  4.  
  5. > git checkout readme.txt

--

删除文件 PART.1

删除文件也是一种修改,因为工作区里的东西发生了变化

新创建一个文件,然后git add,再git commit

  1. > echo >new.txt
  2. > git add new.txt
  3. > git commit -"create new.txt"
  4. [detached HEAD 21e3fe5] create new.txt
  5.  1 file changed, 1 insertion(+)
  6.  create mode 100644 new.txt

--

删除文件 PART.2

然后再把它删了

  1. > del new.txt

这时候Git发现你在工作目录里删了一个文件,但是Git的版本库里仍然还存在着new.txt

  1. > git status
  2. HEAD detached from 9baed55
  3. Changes not staged for commit:
  4.   (use "git add/rm <file>..." to update what will be committed)
  5.   (use "git checkout -- <file>..." to discard changes in working directory)
  6.  
  7.         deleted:    new.txt
  8.  
  9. no changes added to commit (use "git add" and/or "git commit -a")

--

删除文件 PART.3

如果你确定真的要把new.txt删除掉,那就需要执行命令git rm file

  1. > git rm new.txt
  2. rm 'new.txt'

git status一下,发现你的操作还没有正式提交

  1. > git status
  2. HEAD detached from 9baed55
  3. Changes to be committed:
  4.   (use "git reset HEAD <file>..." to unstage)
  5.  
  6.         deleted:    new.txt

你需要再次git commit

  1. > git commit -"del new.txt"
  2. [detached HEAD 5e46854] del new.txt
  3.  1 file changed, 1 deletion(-)
  4.  delete mode 100644 new.txt

--

创建GitHub帐号 Part.1

GitHub的官网注册一个账号,注册之后点击Settings

在左侧栏选择SSH keys,点击New SSH keys

--

创建GitHub帐号 Part.2

进去Git安装目录的\usr\bin目录,在命令行输入以下命令

  1. //把里面的xxx@xxx.xxx部分换成你的邮件地址,然后一路回车就行了。
  2. //这样就在用户主目录(C:\Documents and Settings\用户名\.ssh)下生成了密钥对
  3. // id_rsa是私钥,id_rsa.pub是公钥
  4. $ ssh-keygen -t rsa -"xxx@xxx.xxx"

回到GitHub在Title一栏中随便填一个名字,然后将id_rsa.pub中的内容粘贴到Key栏, 点击Add SSH key按钮就完成了。

--

创建GitHub仓库

在GitHub上创建一个仓库,点击New repository

Repository name一栏中随便填写一个名字作为仓库名。然后直接点击Create repository按钮。

--

GitHub仓库

仓库的基本界面如下,因为我们使用的是SSH协议,而不是HTTPS协议,所以将默认的HTTPS切换成SSH

--

关联远程仓库

第一种情况: 你在本地还没有建立一个仓库

  1. echo "# learnGit" >> README.md
  2. git init
  3. git add README.md
  4. git commit -"first commit"
  5. git remote add origin git@github.com:liyang/learnGit.git
  6. git push -u origin master

第二种情况:如果你在本地已经有了一个仓库

  1. git remote add origin git@github.com:liyang/learnGit.git
  2. git push -u origin master

--

创建分支 Part.1

首先创建一个test.txt的文件,在里面输入:

  1. # this is a test file

然后将它提交:

  1. $ git add test.txt
  2. $ git commit -"add a test file"

接着创建一个dev分支。

  1. $ git branch dev

--

创建分支 Part.2

这样就生成了一个叫dev的分支。但别忘了,我们现在仍然在master分支

  1. $ git branch
  2.   dev
  3. * master
  4. //git branch会列出所有的分支,并在当前分支的前面加上一个*号。

如果需要切换到dev分支,只需执行

  1. $ git checkout dev
  2. //撤销修改的语法是:git checkout -- file
  3. //而切换分支命令没有 -- 这两个短横。

如果你希望创建一个分支并直接切换到那个分支,只需执行

  1. $ git chekcout -b dev
  2. //这样将会创建dev分支并直接切换到dev分支。

--

修改分支 Part.1

在dev分支中进行修改。在test.txt后面加上一行

  1. # this is a test file
  2. first line

接着进行提交

  1. $ git add test.txt
  2. $ git commit -"add first line  on dev"

然后切换回master分支:

  1. $ git checkout master

当切换回master分支后,打开test.txt,发现刚才添加的一行"first line"不见了, 因为"first line"是在dev分支上提交的。

  1. # this is a test file

--

合并分支

现在在master分支上,准备跟dev分支合并:

  1. $ git merge dev
  2. Updating 0fed6b6..38fb696
  3. Fast-forward
  4. test.txt | 1 +
  5. 1 file changed, 1 insertion(+)

合并完成以后,可以删除dev分支

  1. $ git branch -d dev

--

抓取分支

git clone url可以克隆远程仓库到本地

  1. git clone https://github.com/roastlechon/nodejs-rtorrent.git

大话Git的更多相关文章

  1. 大话git中的撤销操作

    下面以现实场景作为情境. 基础知识,理解git中的几个区域 本地代码已经add,未commit 修改本地工作目录中的readme.md,添加文字"第一次修改" 然后查看下状态 ➜ ...

  2. 大话Git系列之初识版本控制系统(2)

    本次接着上次的来介绍版本控制系统,这个讲到的将是Git与Github,说一下什么是Git,什么是GitHub?他们之间的关系是什么? 1.Git 是代码管理的工具 2.GitHub 是基于Git实现的 ...

  3. 大话Git系列之初识版本控制系统(1)

    前言:何谓版本控制系统呐?有两种说法:一种叫法为SCM,==source code management (源代码管理系统)另一种说法为VCS,==version control system(版本控 ...

  4. 【大话QT之十七】Jenkins介绍及安装使用文档(与Git集成)

    文章文件夹结构例如以下: 1> Jenkins与Git相关介绍 2> Jenkins部署安装 3> Gitblit部署安装 4> Jenkins与Git集成使用 5> 项 ...

  5. 【干货分享】大话团队的GIT分支策略进化史

    封面 作为一名85后的技术男,一转眼10年过去了(一不小心暴露了年龄,虽然我叫18岁fantasy),亲手写代码已经是5年前了,目前主要负责公司的软件产品的规划和设计(所以最近写的东西也主要与设计和产 ...

  6. 【转帖】大话Spring Cloud

    springcloud(一):大话Spring Cloud 2017/05/01   http://www.ityouknow.com/springcloud/2017/05/01/simple-sp ...

  7. 《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?

    <大话数据库>-SQL语句执行时,底层究竟做了什么小动作? 前言 大家好,我是Taoye,试图用玩世不恭过的态度对待生活的Coder. 现如今我们已然进入了大数据时代,无论是业内还是业外的 ...

  8. Git 子模块 - submodule

    有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...

  9. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

随机推荐

  1. SAP_Web_Service开发配置

    第一章    SAP创建WS 1.1       概要技术说明 1.2       创建RFC函数 1.3       创建WS 1.4       外部系统访问配置 第二章    SAP调用WS 2 ...

  2. UWP开发中的方向传感器

    在UWP开发中,我们能使用的到方向有三种: OrientationSensor下的四元数:Compass罗盘的HeadingMagneticNorth:以及SimpleOrientationSenso ...

  3. 【原】UIView实现点击着重效果的解决方案

    我们知道,在IOS中UIButton UIControl都有一个默认的选中效果,即点中后会图标会变暗,移开后又恢复正常.如何让UIView UIImageView等这些普通的view也实现同样的效果呢 ...

  4. IOS开发--常用工具类收集整理(Objective-C)(持续更新)

    前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 这些可复用的工具,一定会给你实际项目开发工作锦上添花,会给你带来大大的工作效率. 重复造轮子的事情,除却自我多练习编码之外,就 ...

  5. layout_weight的使用说明

    近期学习了Mars老师的视频,看了十二课的有关layout_weight的讲解,就做了些总结. layout_weight用于分配剩余的布局空间. 首先,先看段代码,它定义了两个textview控件 ...

  6. EF+MVC+cod First项目性能优化总结

    1.EF:this.Configuration.UseDatabaseNullSemantics = true; //关闭数据库null比较行为 2.实体必填字段要加:[Required]属性,可定长 ...

  7. Effective Java 30 Use Enums instead of int constants

    Enumerated type is a type whose legal values consist of a fixed set of constants, such as the season ...

  8. Effective Java 48 Avoid float and double if exact answers are required

    Reason The float and double types are particularly ill-suited for monetary calculations because it i ...

  9. linux下重启oracle服务:监听器和实例

    一.在Linux下重启Oracle数据库及监听器: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart ...

  10. SQL2012数据库加密方法

    1.非对称密钥来保护新的对称密钥 /*--测试环境 Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 C ...