大话Git
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中有个指针叫做HEAD
,HEAD
指向哪个快照,你现在就在哪个状态。对于第N个状态的版本HEAD~N
- > git reset --hard HEAD~2
- HEAD is now at e7ddd65 add a readme file
--
返回历史记录失败
如果现在又想重新回到add new line
这个版本怎么办。很简单,只要知道add new line
的commit 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版本控制的逻辑过程:
首先,你在工作区创建了一个文件或者修改了一个文件
然后你有输入了
git add
,此时文件实际上是被添加到了暂存区stage,也就是那个index文件接着,你又输入
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的更多相关文章
- 大话git中的撤销操作
下面以现实场景作为情境. 基础知识,理解git中的几个区域 本地代码已经add,未commit 修改本地工作目录中的readme.md,添加文字"第一次修改" 然后查看下状态 ➜ ...
- 大话Git系列之初识版本控制系统(2)
本次接着上次的来介绍版本控制系统,这个讲到的将是Git与Github,说一下什么是Git,什么是GitHub?他们之间的关系是什么? 1.Git 是代码管理的工具 2.GitHub 是基于Git实现的 ...
- 大话Git系列之初识版本控制系统(1)
前言:何谓版本控制系统呐?有两种说法:一种叫法为SCM,==source code management (源代码管理系统)另一种说法为VCS,==version control system(版本控 ...
- 【大话QT之十七】Jenkins介绍及安装使用文档(与Git集成)
文章文件夹结构例如以下: 1> Jenkins与Git相关介绍 2> Jenkins部署安装 3> Gitblit部署安装 4> Jenkins与Git集成使用 5> 项 ...
- 【干货分享】大话团队的GIT分支策略进化史
封面 作为一名85后的技术男,一转眼10年过去了(一不小心暴露了年龄,虽然我叫18岁fantasy),亲手写代码已经是5年前了,目前主要负责公司的软件产品的规划和设计(所以最近写的东西也主要与设计和产 ...
- 【转帖】大话Spring Cloud
springcloud(一):大话Spring Cloud 2017/05/01 http://www.ityouknow.com/springcloud/2017/05/01/simple-sp ...
- 《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?
<大话数据库>-SQL语句执行时,底层究竟做了什么小动作? 前言 大家好,我是Taoye,试图用玩世不恭过的态度对待生活的Coder. 现如今我们已然进入了大数据时代,无论是业内还是业外的 ...
- Git 子模块 - submodule
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...
- Git 在团队中的最佳实践--如何正确使用Git Flow
我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...
随机推荐
- SAP_Web_Service开发配置
第一章 SAP创建WS 1.1 概要技术说明 1.2 创建RFC函数 1.3 创建WS 1.4 外部系统访问配置 第二章 SAP调用WS 2 ...
- UWP开发中的方向传感器
在UWP开发中,我们能使用的到方向有三种: OrientationSensor下的四元数:Compass罗盘的HeadingMagneticNorth:以及SimpleOrientationSenso ...
- 【原】UIView实现点击着重效果的解决方案
我们知道,在IOS中UIButton UIControl都有一个默认的选中效果,即点中后会图标会变暗,移开后又恢复正常.如何让UIView UIImageView等这些普通的view也实现同样的效果呢 ...
- IOS开发--常用工具类收集整理(Objective-C)(持续更新)
前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 这些可复用的工具,一定会给你实际项目开发工作锦上添花,会给你带来大大的工作效率. 重复造轮子的事情,除却自我多练习编码之外,就 ...
- layout_weight的使用说明
近期学习了Mars老师的视频,看了十二课的有关layout_weight的讲解,就做了些总结. layout_weight用于分配剩余的布局空间. 首先,先看段代码,它定义了两个textview控件 ...
- EF+MVC+cod First项目性能优化总结
1.EF:this.Configuration.UseDatabaseNullSemantics = true; //关闭数据库null比较行为 2.实体必填字段要加:[Required]属性,可定长 ...
- 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 ...
- 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 ...
- linux下重启oracle服务:监听器和实例
一.在Linux下重启Oracle数据库及监听器: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart ...
- SQL2012数据库加密方法
1.非对称密钥来保护新的对称密钥 /*--测试环境 Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 C ...