文章目录

  • 关于 Git
    • Git 背后的故事
    • 基本概念
    • 术语中英文对照
  • 安装Git客户端
    • Linux 平台安装
    • Windows 平台
  • 使用 Git
    • 客户端生成数字证书
    • 从远程库克隆项目
    • 创建本地版本库
    • 关联本地版本库到远程库
    • 检查工作区
    • 保存更新暂存区
    • 提交更新至版本库
    • 创建分支
    • 切换分支
    • 合并分支
    • 将本地的分支推送到远程库
    • 获取远程库的最新版本
    • 解决冲突
  • Git 常用命令集

关于 Git

Git 背后的故事

伟大的作品总是诞生于伟大的时代,正如 Git 同样诞生于一个英雄辈出、极富纷争的年代。

2005 年,Linux 内核开发社区正面临严峻的挑战:他们不能继续使用 BitKeeper 了(注:原因是当时BitKeeper 著作权所有者决定收回授权,内核开发团队与其协商无果),而又没有其他的 SCM (Software Configuration Management)可满足他们的分布式系统的需求。Linux 之父 Linus Torvalds 接受了这个挑战,决定开发一个新的版本控制系统,并制定了分布式、非线性、简单快速的设计目标。周末他消失了,新的一周,Git 问世了。

自诞生以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。今天,Git 已经成为上万个项目的版本控制系统,并且在程序员中引发了开源热潮。

基本概念

和 SVN 相比,Git 有一些独特的术语和概念,有必要了解一下。

  1. 工作区(working tree):可以理解为客户端电脑上的项目路径
  2. 版本库(repository):工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库
  3. 暂存区(stage):存放在 .git 目录下下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
  4. 默认的远程版本库(origin):尽管 Git 是分布式的,但它不排斥中心服务器

工作区、版本库中的暂存区和版本库,以及远程库之间的关系如下:


图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

git add
暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

git commit
暂存区的目录树写到版本库(对象库)中,HEAD 指向分支会做相应的更新。

git reset HEAD
暂存区的目录树会被重写,被HEAD 指向分支的目录树所替换,但是工作区不受影响。

git rm --cached
直接从暂存区删除文件,工作区则不做出改变。

git checkout 或者 git checkout –
暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

git checkout HEAD 或者 git checkout HEAD
HEAD 指向的分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

git clone git@sdysit.com:/sdyouth/git/xufive.git
从远程库克隆项目

git fetch
从远程的分支获取最新的版本到本地。

get push
将本地版本库的分支推送到远程库上对应的分支。

术语中英文对照

为便于浏览,该部分内容已独立成文,敬请移步至:Git 术语及中英文对照

安装Git客户端

Git 目前几乎可以运行在包括 Linux/Unix、Solaris、Mac和 Windows 等所有平台上。Git 各平台安装包下载地址为:http://git-scm.com/downloads

Linux 平台安装

Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。如果你碰巧用 Debian 或 Ubuntu,使用下面的命令,就可以直接完成Git的安装。

sudo apt-get install git

Windows 平台

写这篇博客的时候,最新的 Git 客户端版本是 Git-2.19.1。点此下载最新的安装文件,然后运行,按默认选项安装即可。我大概只更改了默认的编辑器,其他接受了默认选项。

友情提示:关于行结束符,默认的选择是 checkout 时从 LF 转 CRLF,commit 时 从 CRLF 转 LF。这样设置适合跨平台的开发,不过 add 操作时会出现警告,忽略即可。







安装完成后,右键菜单会增加 Git GUI 和 Git Bash 两项。用户可以根据自己的习惯选择使用 Git GUI 或 Git Bash 来创建、管理自己的版本库。

在非本地版本库的工作区打开 Git GUI,界面如下:


这里,可以创建本地版本库,可以克隆远程库,也可以打开本地已经存在的版本库。

在本地版本库的工作区打开 Git GUI,界面如下:


版本库中新增加的或者修改过的文件将会出现在左侧上方的窗口中。也可以点击“Rescan”按钮重新检查新增加的或者修改过的文件,以更新左侧上方的窗口显示内容。

点击“Stage Changed”按钮,新增加的或者修改过的文件将会从左侧上方的窗口移到左侧下方的窗口中,完成文件暂存。点击暂存区的单个文件图标,该文件将回退到未暂存的状态。

点击“Commit”按钮,已经暂存的文件将被提交到版本库——特别说明,这里的版本库是指本地库,而非远程库。点击“Push”按钮,才可以将本地库的当前分支提交到远程库。关于分支,将在后面详细说明。

使用 Git

理解了 Git 的理念,使用 Git 是一个很自然的过程,不管是在 windows 平台还是 linux 平台上,不管用 Git GUI 还是 Git Bash。本博文主要介绍 windows 平台上的使用,以 Git GUI 为主,间或使用 Git Bash。

客户端生成数字证书

Git 是分布式的,可以不依赖于远程库而独立工作。因此,数字证书不是必须的。如果打算连接远程库,这项准备工作只需要做一次。

假定有一个远程库:
ssh://git@sdysit.com:22/sdyouth/git/GitTest.git

因为使用了的是默认端口,可以简写为:

git@sdysit.com:/sdyouth/git/GitTest.git

出于安全考虑,只有数字证书公钥保存在 Git 服务器的 Git 客户端才能连接这个远程库。通常,Git 客户端的数字证书保存在 C:\Users\用户名.ssh 路径下。

如果 Git 客户端不存在 C:\Users\用户名.ssh 路径,请启动 Git Bash,尝试从远程库克隆 test 项目:

$ git clone git@sdysit.com:/sdyouth/git/GitTest.git

第一次连接到目标 Git 服务器时会得到一个提示:

Cloning into 'GitTest'...
The authenticity of host 'sdysit.com (120.55.169.217)' can't be established.
ECDSA key fingerprint is SHA256:tTXVyJPoqCiEZP3+3E2uOOmvXIWGEWtCcUOgBhlb+iQ.
Are you sure you want to continue connecting (yes/no)? yes

选择 yes

Warning: Permanently added 'sdysit.com,120.55.169.217' (ECDSA) to the list of known hosts.
git@sdysit.com's password:
Connection closed by 120.55.169.217 port 22
fatal: Could not read from remote repository.Please make sure you have the correct access rights
and the repository exists.

最终的结果肯定是失败的,即使你输入了正确的密码。但我们已经将此服务器加入到了已知服务器列表中。此时 C:\Users\用户名.ssh 下会多出一个文件 known_hosts,以后在这台电脑上再次连接目标 Git 服务器时不会再提示上面的语句。

如果 Git 客户端存在 C:\Users\用户名.ssh 路径,则直接在 Git Bash 执行以下命令,生成数字证书:

$ ssh-keygen -t rsa -C "xufive@sdysit.com"

xufive@sdysit.com 是我的用户名。每个用户都应该有自己的有别于其他用户的用户名。虽然 Git 不限定用户的操作权限,但是管理员需要知道来访者是谁,以便于在该用户离开团队时,从服务端删除他的数字证书公钥。

现在,C:\Users\用户名.ssh 下会多出两个文件 id_rsa 和 id_rsa.pub,id_rsa 是私钥,id_rsa.pub 是公钥。请把公钥文件交给管理员(出于安全考虑,这里不讨论管理员的工作),很快你就成为远程库的合法用户了。管理员也许会给你一个密码,请牢记并妥善保管。

从远程库克隆项目

前文已经展示过使用 Git Bash 克隆版本库,下图为使用 Git GUI 从远程库克隆 FY-3 项目到本地 D:\YouthGit 路径下。友情提示:如果 D:\YouthGit 路径下已经存在 FY-3 文件夹,将无法完成克隆。

创建本地版本库

以在本地 D:\YouthGit 路径下创建 FY-2 项目为例。启动 Git Bash,执行以下操作即可。

xufiv@LAPTOP-07EQCT4C MINGW64 /d/YouthGit
$ pwd
/d/YouthGitxufiv@LAPTOP-07EQCT4C MINGW64 /d/YouthGit
$ mkdir FY-2xufiv@LAPTOP-07EQCT4C MINGW64 /d/YouthGit
$ cd FY-2xufiv@LAPTOP-07EQCT4C MINGW64 /d/YouthGit/FY-2
$ git init
Initialized empty Git repository in D:/YouthGit/FY-2/.git/xufiv@LAPTOP-07EQCT4C MINGW64 /d/YouthGit/FY-2 (master)
$

如果使用 Git GUI,创建本地项目版本库如下图所示。

关联本地版本库到远程库

在本地创建的版本库,要关联到远程库,前提是被关联的远程库必须存在。以在本地 D:\YouthGit 路径下创建 的FY-2 项目为例,使用 Git GUI 关联到远程库 git@sdysit.com:/sdyouth/git/FY-2.git,需要添加远程库。点击菜单Remote --> Add…,在弹出窗口中正确填入远程库路径,并给远程库取一个恰当的名字,点击 Add 按钮即可完成操作。

检查工作区

当工作区新增加了文件,或者原有的文件有改变时,启动 Git GUI 后会自动显示在未暂存文件列表中。点击“Rescan”按钮,也可以重新检查新增加的或者修改过的文件,以更新左侧上方的窗口显示内容。

保存更新暂存区

点击“Stage Changed”按钮,新增加的或者修改过的文件将会从左侧上方的窗口移到左侧下方的窗口中,完成文件暂存。点击暂存区的单个文件图标,该文件将回退到未暂存的状态。

提交更新至版本库

点击“Commit”按钮,已经暂存的文件将被提交到版本库——特别说明,这里的版本库是指本地库,而非远程库。每次 commit 之前,请务必填写说明,否则 Git GUI 将会拒绝执行命令。关于本次 commit 的说明,对于合作者,以及以后的开发工作有着非常重要的作用。

创建分支

假定在 FY-2 项目中创建以 master 分支当前代码为起点的 demo 分支,点击 Git GUI 菜单 Branch --> Create…,在弹出窗口中照下图操作即可。创建新的分支后,Git GUI 自动切换到新的分支,并更新工作区。

切换分支

点击 Git GUI 菜单 Branch --> Checkout…,在弹出窗口中照下图操作,即可切换到 master 分支,同时更新工作区。

合并分支

点击 Git GUI 菜单 Merge --> Local Merge…,在弹出窗口中照下图操作,即将 domo 分支合并到 master 分支上。

将本地的分支推送到远程库

点击 Push 按钮,在弹出窗口上照下图操作,即可将本地库的 master 分支推送到远程库。

获取远程库的最新版本

点击 Git GUI 菜单 Remote --> Fetch from,在第三级菜单中选择恰当的远程库,在弹出窗口中照下图操作,即可获取远程库的最新版本。


另外,我们还可以选择 Remote --> Rrune from 来完成更新。git fetch 和 git pull 的区别在于:

  1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge
  2. git pull:相当于是从远程获取最新版本并merge到本地

在实际使用中,git fetch更安全一些,因为在merge前,我们可以查看更新情况,然后再决定是否合并。比如,使用 Git Bash 执行 git fetch,可以完成更精确的操作。

git fetch origin master:tmp
git diff tmp
git merge tmp

解决冲突

写到这里,我已经精疲力竭、无力继续了。待我满电复活之后再补充吧。

Git 常用命令集

为便于浏览,该部分内容已独立成文,敬请移步至:Git 常用命令集

Git 学习笔记——程序员篇相关推荐

  1. 学习笔记---程序员练级攻略(入门篇、修养篇、专业基础篇、软件设计篇、高手成长篇)

    根据极客时间 左耳朵耗子 整理,请忽略每一行最后的数字 文章目录 1. 入门篇 47 2. 修养篇 51 3. 专业基础篇 56 4. 软件设计篇 60 5. 高手养成 63 1. 入门篇 47 1. ...

  2. 批处理脚本学习笔记——程序员版

    批处理脚本学习笔记 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明.否则将追究法律责任.http://blog.csdn.net/taotaoyouarebaby/ar ...

  3. Redis学习笔记(实战篇)(自用)

    Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...

  4. Git 学习笔记:6 GitHub

    Git 学习笔记:6 GitHub 账户的 创建和配置 SSH访问 头像 邮件地址 两步验证 对项目做贡献 派生(fork)项目 GitHub 流程 创建合并请求 利用合并请求 合并请求的进阶用法 将 ...

  5. 《软技能-代码之外的生存指南》学习笔记之理财篇

    <软技能–代码之外的生存指南>学习笔记之理财篇 作者:[美] John Z. Sonmez 摘要:这是⼀本真正从"⼈"(⽽⾮技术也⾮管理)的⾓度关注软件开发⼈员⾃⾝发展 ...

  6. flink1.12.0学习笔记第1篇-部署与入门

    flink1.12.0学习笔记第 1 篇-部署与入门 flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇-高级 ...

  7. javaSE学习笔记01 入门篇

    javaSE学习笔记01 入门篇 java语言概述 Java背景知识 java是 美国 sun 公司 在1995年推出的一门计算机高级编程语言. java早期称为Oak(橡树),后期改名为Java. ...

  8. OracleDesigner学习笔记1――安装篇

    OracleDesigner学习笔记1――安装篇   QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一.       前言 Oracle是当 ...

  9. Git学习笔记(2) --- References探寻

    在上一篇文章Git学习笔记(1) --- 内部存储模式中,已经说了git的内部存储模式以及.git/objects文件中的内容,这一篇文章主要讲讲git内部的references. Reference ...

最新文章

  1. ACL 2020 | 多编码器是否能够捕获篇章级信息?
  2. mysql读取求和_MySQL从单独的表中获取求和值
  3. Python函数合集:足足68个内置函数请收好!
  4. Android之如果解决Android studio项目里面的类名不能重命名
  5. JSP的四大作用域和九大内置对象
  6. mybatis 不生效 参数_Mybatis-日志配置
  7. [结构力学] 铰结三角形规律中虚铰也记为单铰
  8. python类属性的应用 子类继承可以节约空间
  9. 带着canvas去流浪系列之四 绘制散点图
  10. mysql update emp set_Mysql数据库性能优化一
  11. dr. unarchiver_1F 新店开业男士一生仅能定制一枚的钻戒,DR 教你用一生爱一人
  12. 第六章节 多态 (多态的概述)
  13. java api 第一个类是_java_8_第一个API
  14. 北斗卫星导航系统基础篇之(一)
  15. 静态库与动态库的区别与优缺点
  16. 安卓手游辅助分析与开发!五步搞定Android开发环境部署,深度好文
  17. qt控件之qt中的控件QTableWidget的使用
  18. Ubuntu扩展系统根目录磁盘空间
  19. ajax谷歌浏览器提示等待超时,调用谷歌浏览器爬虫,selenium webdriver等设置等待时间和超时时间...
  20. 故宫景点功课3:太和殿院落上

热门文章

  1. 工行网银银企互联业务简介
  2. 北京交通大学计算机学院保研,北京交通大学计算机与信息技术学院(专业学位)计算机技术保研条件...
  3. Jacky的のLinux diary
  4. OCXO、VCXO、TCXO、DCXO、SPXO
  5. Mac出现问题的5个警告信号与处理方法
  6. 瑜伽的起源和种类划分
  7. 单片机基于独立按键的屏幕翻页/功能选择方案(支持长按,短按,双击操作)
  8. rpm安装mysql odbc_如何以rpm方式安装mysql odbc驱动
  9. 1063: 判断三角形的形状(3级)输入三角型的三条边,判断三角形的形状。
  10. OS X 安装命令行看图工具 chafa 以及其依赖libtool