Git是什么

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

--

安装Git

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

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

--

创建版本库(repository)

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

git init

//创建一个learnGit目录,并进入learnGit目录,创建版本库
md learnGit
cd learnGit
git init

--

添加文件到版本库中

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

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

Git is amazing!
I love Git!

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

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

--

工作区的状态

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

将readme.md修改为

Git is great!
I love git!

接着使用git status命令

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

--

查看文件的修改内容

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

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

--

查看整个修改过程状态

将修改过的文件进行提交

> git add readme.txt

再来看当前工作区的状态

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

继续提交修改后的文件

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

再来看当前工作区的状态

> git status
On branch master
nothing to commit, working directory clean

--

历史记录

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

> git log
commit e4af028a493a4459fea0c0f673149281e0d11949
Author: LIYANG <liyangtom@163.com>
Date:   Tue Apr 26 16:17:58 2016 +0800     add new line commit 469dcdcd4de36234666885f87fa581441a834992
Author: LIYANG <liyangtom@163.com>
Date:   Tue Apr 26 16:07:00 2016 +0800     amazing became great commit e7ddd658bf0e5791acd07c25a56ba1c4fba1a181
Author: LIYANG <liyangtom@163.com>
Date:   Tue Apr 26 15:49:34 2016 +0800     add a readme file

--

历史记录

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

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

--

返回历史记录

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

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

--

返回历史记录失败

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

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

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

--

查看所有历史操作

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

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

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

> git reset e4af028
Unstaged changes after reset:
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中新添加了一行文本 。

Git is great!
I love git!
just add line

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

$ git checkout -- readme.md

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

--

复杂修改恢复 CND.2

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

--

删除文件 PART.1

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

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

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

--

删除文件 PART.2

然后再把它删了

> del new.txt

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

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

--

删除文件 PART.3

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

> git rm new.txt
rm 'new.txt'

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

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

你需要再次git commit

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

--

创建GitHub帐号 Part.1

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

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

--

创建GitHub帐号 Part.2

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

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

--

关联远程仓库

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

echo "# learnGit" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:liyang/learnGit.git
git push -u origin master

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

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

--

创建分支 Part.1

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

# this is a test file

然后将它提交:

$ git add test.txt
$ git commit -m "add a test file"

接着创建一个dev分支。

$ git branch dev

--

创建分支 Part.2

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

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

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

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

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

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

--

修改分支 Part.1

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

# this is a test file
first line

接着进行提交

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

然后切换回master分支:

$ git checkout master

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

# this is a test file

--

合并分支

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

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

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

$ git branch -d dev

--

抓取分支

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

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. MUI - 将tap模拟成原生click体验

    mui提供了tap事件替换了html5的click事件,解决了300ms延时的问题.不过相比原生app的click体验还是有些许差距的.关于300ms延时的问题,这篇帖子分析的比较完善,其中提到了穿透 ...

  2. iOS设计模式之原型模式

    原型模式 基本理解 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节 ...

  3. MySQL初步笔记,有待整理

     查询表纪录: select * from tb1; 插入一条记录 insert tb1 values(value1,value2,...); 修改表的默认编码: alter table tb1 ch ...

  4. iOS设计模式简介

    开闭原则: 一个模块的修改,对拓展开放而对修改关闭. 举个例子:有一个类在项目中很多地方被使用了,但是由于需求,想对这个类进行拓展,这里可以使用继承拓展出子类,可以对子类进行修改,尽量不要修改原来的类 ...

  5. 我们需要专职的QA吗?

    [ 引用评论里的一句话:hurt but true  抛开作者某些偏激的想法外,作者暴露出来的问题还是需要测试思考的: 1.TestCase,TestData,TestConfiguration 没有 ...

  6. XMLHttp小手册,原生ajax参考手册

    个人做java ee开发,在一般的公司里上班,做的是一般的网站. 1.如果经常使用jquery等框架进行异步调用,最主要的不是了解jquery怎么用,而是了解http协议. 2.为了了解http协议, ...

  7. statement和preparedstatement用法区别

    1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.   2.作为 ...

  8. 2015.8.1 bootstrap学习(个人每日学习的随笔,比较凌乱

    写在前面: 记录自己的学习中遇到的问题和解决办法.因为是每日晚上总结,可能只是随便一笔带过方便自己记忆.如有写的错误或者凌乱之处,请勿介意 1.<html lang="zh-hans& ...

  9. Centos 部署Keepalive高可用软件

    Keepalive安装部署   一.环境介绍 1)Centos6.4 2) keepalived-1.2.12 3) 主备机的ip Master:172.31.100.5 Slave: 172.31. ...

  10. JAVA基础之对象的初始化

    本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及 final 关键字对初始化的影响.另外,还讨论了由于继承原因,探讨了引用变量的编译时类型和运行时类型 一,实例变量的初 ...