Git 简介

git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。是 linux 创始人 Linus Torvalds 为了帮助管理 linux 内核开发而开发的一个开放源码的版本控制软件。最初 git 的开发是为了辅助 linux 内核开发的过程,因为 git 免费而又超级好用,现在已经成为最流行的分布式版本控制系统,尤其是 2008 年, github 网站上线了,它为开源项目免费提供 git 存储,无数开源项目开始迁移至 github 。

Git 安装

提供了各种平台的安装方法,跟着说明安装即可。

以 windows 系统为例,安装完后打开 git bash 命令行工具,输入 git --version 查看安装的 git 版本

alsy@home-alsy MINGW64 /
$ git --version
git version 2.11..windows.

打印出版本信息说明你已经成功安装 git 了

Git 的相关设置

1. 自报家门,设置你的姓名和 email

$ git config --global user.name "your_name"
$ git config --global user.email "your_email"

注意: git config 命令的 --global 参数,这时你这台电脑上所有的 git 仓库都会使用这个配置,当然你也可以针对某个仓库指定不同的用户名和 email 地址。

2. 设置 git 输出显示颜色,看起来更醒目

$ git config --global color.ui true

3. 关于 git config

查看仓库级的config,命令:git config --local -l

查看全局级的config,命令:git config --global -l

查看系统级的config,命令:git config --system -l

注意配置文件的优先级是: 仓库 > 全局 > 系统

查看当前生效的配置,命令:git config -l,这个时候会显示最终三个配置文件计算后的配置信息

$ git config --local -l
$ git config --system -l
$ git config --global -l
$ git config -l

Git 工作流

你的本地仓库由 git 维护的三棵“树”组成。

第一个是你的工作区, 它持有实际文件,就是你在文件资源管理器中看到的。

第二个是暂存区(stage),它像个缓存区域,临时保存你的改动。

最后是HEAD,它指向你最后一次提交的结果。

Git 相关操作

1. 创建新仓库

在一个空的工作目录中开始,创建一个名为 learngit 的空目录, 然后创建一个名为 a.txt 的文件。

$ mkdir learngit
$ cd learngit
$ touch a.txt
$ ls
a.txt

你现在有一个包含单个文件的目录,执行 git init 命令,从该目录创建 git 仓库。git 会自动创建的一个分支叫 master。

$ git init
Initialized empty Git repository in G:/learngit/.git/

2. 检查仓库的状态

使用 git status 命令检查当前仓库的状态,这是个比较常用的命令。

$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
    a.txt
nothing added to commit but untracked files present (use "git add" to track)

3. 将更改提到暂存区

使用 git add <file> 命令将文件更改提交到暂存区,当有多个文件时使用 git add . 命令提交所有文件的修改包括新建的文件。

$ git add a.txt
$ git add .

使用 git status 查看仓库的状态

$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
    new file: a.txt

4. 把暂存区的内容提交到当前分支(默认为 master)

这里会有一个 HEAD 指针指向 master 分支,并且 HEAD 指针总是指向你的当前分支。

$ git commit
[master (root-commit) 91c0959] first commit
file changed, insertions(+), deletions(-)
create mode a.txt

执行 git commit 命令,会调出文本编辑器,提示你输入一段本次提交的描述。

你也可以使用 git commit -m 'first commit' 来快速的进行描述提交,如果发现提交的描述有误或者不恰当可以使用 git commit --amend 命令来对最近提交的描述信息进行替换

使用 git status 查看仓库的状态

$ git status
On branch master
nothing to commit, working tree clean

5. 查看历史提交记录

使用 git log 命令查看

$ git log
commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <@qq.com>
Date: Sat Mar :: + first commit

这时列出了我们第一次提交的记录

下面我们来更改 a.txt 的内容, 再次提交来查看记录

$ echo 'some modified' > a.txt //向a.txt写入'some modified'

$ 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: a.txt no changes added to commit (use "git add" and/or "git commit -a") $ git commit -a -m 'second commit' //这是暂存和提交一起操作的缩写,后面跟描述
[master e9df1e3] second commit
file changed, insertions(+) $ git log //查看记录 commit e9df1e351fc321d4c63bfe9f76773759a03012e2
Author: alsy <@qq.com>
Date: Sat Mar :: + second commit commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <@qq.com>
Date: Sat Mar :: + first commit

我们可以看到我们这两次提交的记录

6. 撤销修改

文件的撤销修改可以分为三个时间点的撤销

a. 修改了文件,没有 add 到暂存区

$ echo 'some modified ~' >> a.txt //往 a.txt 追加 'some modified ~'

$ cat a.txt //输出 a.txt 的内容
some modified
some modified ~ $ 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: a.txt no changes added to commit (use "git add" and/or "git commit -a")

可以看到我们修改了 a.txt 文件,此时查看状态,git 会提示你是要 git add <file> 去提交更改还是 git checkout -- <file> 去丢弃更改,当然这里我们是要丢弃更改

$ git checkout -- a.txt

$ git status
On branch master
nothing to commit, working tree clean $ cat a.txt
some modified

此时 a.txt 有恢复到原来的状态

b. add 到暂存区,没有 commit 到分支

$ echo 'some modified ~' >> a.txt

$ git add a.txt

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.txt

可以看到我们修改了 a.txt 文件并且把它提交到暂存区,此时查看状态,git 会提示你 git reset HEAD <file> 把暂存区的修改撤销掉(unstage),重新放回工作区

$ git reset HEAD a.txt
Unstaged changes after reset:
M a.txt $ 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: a.txt no changes added to commit (use "git add" and/or "git commit -a")

执行 git reset HEAD a.txt 命令后,我们查看状态,可以看到暂存区是干净的,工作区的 a.txt 有修改,和第 1 种情况一样

c. commit 到分支

$ echo 'some modified ~' >> a.txt

$ git commit -a -m 'add some modified'
[master 533f16a] add some modified
file changed, insertion(+) $ git st
On branch master
nothing to commit, working tree clean $ git log
commit 533f16a192ff11cbc5fa92643780155e50dcab60
Author: alsy <@qq.com>
Date: Sat Mar :: + add some modified commit 71b53372b30d69648a4c2516d73fa3563197ec08
Author: alsy <@qq.com>
Date: Sat Mar :: + second commits commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <@qq.com>
Date: Sat Mar :: + first commit

可以看到我们已经把修改 commit 到分支了,这时我们可以采用两种方式来撤销

(1) git revert [ HEAD | commit-ish ]

$ git revert HEAD
[master e1f8ce3] Revert "add some modified"
file changed, deletion(-) $ git log
commit e1f8ce3351bd1bf0e2532c8f1e227c995bbc48e0
Author: alsy <@qq.com>
Date: Sat Mar :: + Revert "add some modified" This reverts commit 533f16a192ff11cbc5fa92643780155e50dcab60. commit 533f16a192ff11cbc5fa92643780155e50dcab60
Author: alsy <@qq.com>
Date: Sat Mar :: + add some modified commit 71b53372b30d69648a4c2516d73fa3563197ec08
Author: alsy <@qq.com>
Date: Sat Mar :: + second commits commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <@qq.com>
Date: Sat Mar :: + first commit

可以看到 git revert 是生成一个新的提交来撤销某次提交,此次提交之前的 commit 都会被保留

(2) git reset [ --soft | --mixed | --hard ]  [ HEAD^ | commit-sh ]

  • --soft

保留源码,只回退到 commit 信息到某个版本,不回退暂存,如果还需要提交,直接commit即可。

  • --mixed

保留源码,回退 commit 和暂存信息到某个版本。

git reset 默认是 --mixed 模式

git reset --mixed  等价于  git reset

  • --hard

源码也会回退到某个版本,commit 和 index 都会回退到某个版本。

$ echo 'some modified ~' >> a.txt

$ git commit -a -m 'git reset test'

$ git log
commit 7c7c69f2b891b4368fd4d59c31827793e41ceac5
Author: alsy <@qq.com>
Date: Sat Mar :: + git reset test commit e1f8ce3351bd1bf0e2532c8f1e227c995bbc48e0
Author: alsy <@qq.com>
Date: Sat Mar :: + Revert "add some modified" This reverts commit 533f16a192ff11cbc5fa92643780155e50dcab60. commit 533f16a192ff11cbc5fa92643780155e50dcab60
Author: alsy <@qq.com>
Date: Sat Mar :: + add some modified commit 71b53372b30d69648a4c2516d73fa3563197ec08
Author: alsy <@qq.com>
Date: Sat Mar :: + second commits commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <@qq.com>
Date: Sat Mar :: + $ git reset --hard HEAD^
HEAD is now at e1f8ce3 Revert "add some modified" $ cat a.txt
some modified

git revert 是用一次新的 commit 来回滚之前的 commit,git reset 是直接删除指定的 commit。

7. 分支的管理

a. 创建分支

使用 git branch <branch_name> 来创建一条新的分支

$ git branch dev

$ git branch
dev
* master

我们在 master 基础上创建了一条 dev 分支,git branch 命令可以帮助我们查看所有的本地分支,并且在当前分支前带有 * 号标记

b. 切换分支

使用 git checkout <branch_name> 来切换分支

$ git checkout dev
Switched to branch 'dev' $ git branch
* dev
master

看到我们已经处于 dev 分支上了

c. 合并分支

现在我们在 dev 分支上做一些修改

$ echo 'some modified on dev' >> a.txt

$ git commit -a -m 'some modified on dev'

我们要将 dev 分支上的代码合并到master,使用 git merge <branch_name> 来合并分支

$ git checkout master
Switched to branch 'master' $ git merge dev
Updating e1f8ce3..0209ed1
Fast-forward
a.txt | +
file changed, insertion(+) $ cat a.txt
some modified some modified on dev

可以看到此时 dev 上的修改已经到 master 上了

8. 远程仓库

远程仓库其实和本地仓库一样,只不过是作为一个代码提交、共享的平台,一般也不会有人直接在上面做提交修改。github 是免费 git 仓库的托管平台,我们可以在 github 创建一个仓库作为我们的远程仓库。当然我们也可以自己搭建 git服务器,来创建我们的远程仓库。以 github 为例:

a. 创建ssh key :

$ cd ~/.ssh/
$ ls
github_rsa github_rsa.pub id_rsa id_rsa.pub

看看这个目录下有没有 id_rsa 和 id_rsa.pub 这两个文件,如果没有则执行以下命令来创建:

$ ssh-keygen -t rsa -C "youremail"

id_rsa 是私钥, id_rsa.pub 是公钥,我们需要把公钥添加到 github , 把 id_rsa.pub 里面的内容添加到 github 上:

这样我们才有权限去推送代码

b. 创建远程仓库

c. 本地关联远程仓库

我们可以根据 github 上给出的提示来与远程仓库进行关联,即:

$ git remote add origin https://github.com/2944927590/node-practice.git

$ git push origin master
Counting objects: , done.
Delta compression using up to threads.
Compressing objects: % (/), done.
Writing objects: % (/), 1.03 KiB | bytes/s, done.
Total (delta ), reused (delta )
To https://github.com/2944927590/node-practice.git
* [new branch] master -> master

我们可以使用 git push --set-upstream origin master 让本地的 master 分支与远程仓库的 master 分支建立连接,这样我们可以直接使用 git push 来将本地 master 分支代码推送到远程 master 分支

$ git push --set-upstream origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date $ git push
Everything up-to-date

d. 拉取最新代码

git pull 命令来拉取远程仓库的最新代码到本地,这里需要指出 git pull 相当于 git fetch(取下更改) 和 git merge (合并到本地分支)两条命令

$ git pull
Already up-to-date.

9. Git 设置别名

$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.st status
$ 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

这样 git checkout 等命令可以用 git co 等代替了,当然你可以对其他命令设置别名。

10. 实际开发中的分支

一般我们在项目开发中,会有一个 master 分支作为整个项目的主分支,也就是实际上线的代码分支;同时可能还会有一个 dev 分支,作为开发环境的代码分支;有的还会有一个 qa 分支,作为测试环境的代码分支;我们都是在为这三条分支服务。比如我们接到新的需求,开始创建分支,首先切到 master 分支,git pull 拉取最新的代码,创建一个自己的开发分支 task , 我们在 task 分支上开始写我们的代码,merge 到 dev 分支进行开发调试,merge 到 qa 分支进行测试,最后 merge 到 master 分支上线。

拓展阅读

更多精彩内容,欢迎关注微信公众号~

强大的版本管理工具 Git的更多相关文章

  1. linux系统下使用流行的版本管理工具 Git

    前几天被版本管理困扰了好久,主要是因为 没法回到之前的版本,新版本又出了问题真的很尴尬. 终于决定使用目前网上很火的版本管理工具-------Git 历史啥的就不说了,说些有用的. 我用的是oschi ...

  2. 版本管理工具Git(1)带你认识git

    简介 本篇将带领大家认识,git.github,让大家对git有基本的认识:下面将持续更新几篇文章来介绍git,见git导航: 下一篇中将讲解git的安装及使用: Git系列导航 版本管理工具Git( ...

  3. 版本管理工具Git(2)git的安装及使用

    下载安装git 官方下载地址:https://git-scm.com/download/win 这里以windows为例,选择正确的版本: 验证是否安装成功,右键菜单中会出现如下菜单: Git工作流程 ...

  4. 版本管理工具Git(一)简要介绍

    版本管理工具不但可以备份而且还能记录版本,也就是同一个东西不同时期的状态同时可以跟踪追溯.版本管理工具由CVS.SVN.Git.GitHub. 最早的版本管理工具CVS,因为多人开发项目导致工作很难协 ...

  5. 版本管理工具Git(2)git的使用

    上一篇带大家认识了Git,在本篇中将讲解Git的安装及使用: Git系列导航 版本管理工具Git(1)带你认识git 版本管理工具Git(2)git的安装及使用 版本管理工具Git(3)VS下如何使用 ...

  6. 版本管理工具Git(3)VS2013下如何使用git

    Git系列导航 版本管理工具Git(1)带你认识git 版本管理工具Git(2)git的安装及使用 版本管理工具Git(3)VS下如何使用git VS下创建项目 vs中新建项目MyGitTest201 ...

  7. 版本管理工具git与svn简介

    版本管理工具 版本管理工具简介 常见版本管理工具 cvs(Concurrent Versions System) vss(Visual SourceSafe) svn 常用的版本管理工具 git 流行 ...

  8. Studio之版本管理工具Git (图文教程)

    目前业界主流的版本管理工具主要是 svn/git.svn是1种集中式的代码管理工具,而git是1种散布式的代码管理工具,广受极客的爱好.而基于git的github更是全宇宙码农的提高逼格,深究技术的必 ...

  9. 谈谈分布式版本管理工具Git

    一.主流的版本管理工具 目前在企业中比较主流的版本管理工具有:GIT.SVN.CVS等等. 二.什么是Git? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.是 L ...

随机推荐

  1. 前端基本知识(一):W3C标准&&冒泡事件,捕获事件,W3C DOM对象模型,对比分析

    W3C标准是万维网联盟, 其他的可以参考万维网版本的更新内容 一.W3C标准 二.W3C DOM事件 三.冒泡事件 四.捕获事件 一.W3C标准 其实网页是由三分部组成:1.结构(structure) ...

  2. C语言的函数类型

    C语言的函数类型与返回值类型不一致时出现,是以函数类型为标准; 而如果在java与c#语言中上述情况是编译错误的;

  3. 初学NodeJs

    1.在ecmascript部分node和js其实是一样的,比如数据类型的定义,语法结构,内置对象 在js中的顶层对象 window 在node中的顶层对象 global 注意:在node中也没有什么w ...

  4. Azure 基础:用 PowerShell 自动发布 CloudServices

    在软件的开发过程中,自动化的编译和部署能够带来很多的优势.下面我们聊聊如何自动发布云应用程序到 azure 上的 cloud services. 打包要发布的内容 首先使用 msbuild 编译 *. ...

  5. java继承(一)

    虽然说java中的面向对象的概念不多,但是具体的细节还是值得大家学习研究,java中的继承实际上就是子类拥有父类所有的内容(除私有信息外),并对其进行扩展.下面是我的笔记,主要包含以下一些内容点: 构 ...

  6. ASP.NET MVC5 实现分页查询

    对于大量数据的查询和展示使用分页是一种不错的选择,这篇文章简要介绍下自己实现分页查询的思路. 分页需要三个变量:数据总量.每页显示的数据条数.当前页码. //数据总量 int dataCount; / ...

  7. 怎么写jquery插件

    1. 添加js文件到html文件中,放下面的两行到html文档底部,</body>之前. <script src="js/jquery-1.9.1.min.js" ...

  8. PowerPoint超链接字体颜色修改、怎么去掉超链接下划线

    经常在做PPT幻灯片时会遇到这样一个问题,给文字加超链接后发现链接的颜色是蓝色的,而且还带有下划线,这种效果与主题的色彩搭配简直是太影响美观效果了.有没有什么办法可以去掉PPT中的超链接下划线?再将超 ...

  9. Angela Merkel poised for record poll win and historic third term

    Her success remains a mystery for many, but victory could see the German chancellor beat Thatcher's ...

  10. Zigbee折腾之旅:(一)CC2530最小系统

    最近在倒腾Zigbee,准备参加物联网全国大赛,学校有给我们发Zigbee开发板,但是对于喜欢折腾的我来说,用开发板还是不过瘾,起码也得知道怎么去画一块板子.于是乎,在百度一番后就有了下面这篇文章. ...