Git 学习笔记——程序员篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xufive/article/details/84394386

关于 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 [email protected]:/sdyouth/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://[email protected]:22/sdyouth/git/GitTest.git

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

[email protected]:/sdyouth/git/GitTest.git

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

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

$ git clone [email protected]:/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.
[email protected]'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 "[email protected]"

[email protected] 是我的用户名。每个用户都应该有自己的有别于其他用户的用户名。虽然 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/YouthGit

xufiv@LAPTOP-07EQCT4C MINGW64 /d/YouthGit
$ mkdir FY-2

xufiv@LAPTOP-07EQCT4C MINGW64 /d/YouthGit
$ cd FY-2

xufiv@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 关联到远程库 [email protected]:/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 常用命令集

猜你喜欢

转载自blog.csdn.net/xufive/article/details/84394386