Git入门学习--(一)

Git简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。

集中式vs分布式
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中 央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联 网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个 人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然 每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的 电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个 人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题, 所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个 局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统 通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干 活,只是交换修改不方便而已。

安装Git
首先,你可以试着输入git,看看系统有没有安装Git:

% git
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]

出现上述代码则表示安装完成。
Mac OS X上安装Git:
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要 运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就 可以完成安装了。
Windows上 安 装 Git:
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。 安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故 意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查 的。

创建版本库
1.首先,选择一个合适的地方,创建一个空目录,如:/Users/k/Public/Git
2.打开终端, 切换到当前文件目录下:

	cd /Users/k/Public/Git

3.通过git init命令把这个目录变成Git可以管理的仓库:

% git init
Initialized empty Git repository in /Users/k/Public/Git/.git/
出现上述命令表示建立完成

如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

% lls
study
% ls -al
total 0
drwxr-xr-x  4 k  staff  128 10  2 20:00 .
drwxr-xr-x+ 5 k  staff  160 10  2 19:56 ..
drwxr-xr-x  9 k  staff  288 10  2 20:00 .git
drwxr-xr-x  2 k  staff   64 10  2 19:56 study

文件修改提交
所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单 词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制 文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例 子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

Windows使用需要注意!!!
不要使用自带的记事本编辑文件。由于Microsoft开发记事本的团队使用了一个非常弱智的行为 来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF- 8 without BOM。

编写一个git1.txt,并放在你的git目录下:
随意添加你喜欢的内容:Git is free software!!!

# 可以直接使用vim命令建立文件,然后按i进行编写,最后按Esc,并输入:wq就可以保存并退出了
(base) k@D Git % vi git1.txt
# 使用add filename 去添加文件到git库中
(base) k@D Git % git add git1.txt   
# git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你 就能从历史记录里方便地找到改动记录。     
(base) k@D Git % git commit -m "git free"
[master (root-commit) e27dfd3] git free
 1 file changed, 1 insertion(+)
 create mode 100644 git1.txt

为什么Git添加文件需要add,commit一共两步?因为commit可以一次提交很多文件,所以你可以多次add不同的文 件,比如:

$ git add f1.txt
$ git add f2.txt f3.txt 
$ git commit -m "add 3 files."

文件修改Git查看操作
继续对Git中的文件进行修改,添加以下内容:I love Git!

(base) k@D Git % vi git1.txt 
# 使用git status查看结果。git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
(base) k@D Git % git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   git1.txt
	
no changes added to commit (use "git add" and/or "git commit -a")

已经知道文件已经被修改过了,如果我们想要知道修改了什么内容的化就需要使用git diff

(base) k@D Git % git diff git1.txt 
diff --git a/git1.txt b/git1.txt
index 5ea92d0..54c1099 100644
--- a/git1.txt
+++ b/git1.txt
@@ -1 +1,2 @@
 Git is a free software!!!
+I love Git!

确认文件的修改之后,就是对文件的提交了,和提交新文件是一样的操作

版本回退
每当你觉得文件修改到一定程度的时候,就可以“保存一 个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复, 然后继续工作,而不是把几个月的工作成果全部丢失。

# 实际工作中,可以使用git log来查看历史记录
(base) k@D Git % git log
commit a26b9ae1f74bc4ec563e1d1a9dbbffbac1bdbca5 (HEAD -> master)
Author: *** <**********>
Date:   Fri Oct 2 20:31:46 2020 +0800

    love git

commit e27dfd36889bbb89b4cd3711a548a7ace9d72cca
Author: Ren-HK <1311438488@qq.com>
Date:   Fri Oct 2 20:14:45 2020 +0800

    git free
# 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
(base) k@D Git % git log --pretty=oneline
a26b9ae1f74bc4ec563e1d1a9dbbffbac1bdbca5 (HEAD -> master) love git
e27dfd36889bbb89b4cd3711a548a7ace9d72cca git free
'''
看到的一大串类似a26b9...的是commit id(版本号),和SVN不一样,Git的commit id不是 1,2,3......递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和 我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3......作为版本号,那肯定就冲突了。
'''
# 我们要把当前版本回退到上一个版本,就可以使用git reset命令
(base) k@D Git % git reset --hard HEAD^
HEAD is now at e27dfd3 git free
# 使用git log来查看版本库的状态
git log --pretty=oneline
e27dfd36889bbb89b4cd3711a548a7ace9d72cca (HEAD -> master) git free
# 这里可以看到版本库中已经回到了以前的版本
# 查看当前文件中的内容
(base) k@D Git % cat git1.txt 
Git is a free software!!!
# 如果想要回到未来的版本又怎么办呢?
‘’‘
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个版本的commit id是a26b9ae...,于是就可以指定回到未来的某个版本。版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就 无法确定是哪一个了。
‘’‘
(base) k@D Git % git reset --hard a26b9ae
HEAD is now at a26b9ae love git
# 可以看到文件已经到了未来的版本
(base) k@D Git % cat git1.txt            
Git is a free software!!!
I love Git!
# Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从你要回退的地方去。然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。
# 当你的终端中找不到你的commit id时怎么办?可以使用git reflog操作,其中记录了你的每一次命令
(base) k@D Git % git reflog
a26b9ae (HEAD -> master) HEAD@{0}: reset: moving to a26b9ae
e27dfd3 HEAD@{1}: reset: moving to HEAD^
a26b9ae (HEAD -> master) HEAD@{2}: commit: love git
e27dfd3 HEAD@{3}: commit (initial): git free

工作区和暂存区
工作区(Working Directory) 就是你在电脑里能看到的目录,
版本库( Repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

管理修改
为什么Git比其他版本控制系统设计得优秀, 因为Git跟踪并管理的是修改,而非文件。
为什么Git管理的是修改?
进行以下操作:第一次修改->git add->第二次修改->git commit
我们前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交, 但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的 修改被提交了,第二次的修改不会被提交。

撤销修改

(base) k@D Git % git add git1.txt 
(base) k@D Git % git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   git1.txt
# 提示使用git restore --s taged可以把暂存区中的修改撤销掉,重新放回工作区中
(base) k@D Git % git restore --staged git1.txt 
(base) k@D Git % git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   git1.txt

no changes added to commit (use "git add" and/or "git commit -a")
# 这时已经将文件从暂存区移除了,并将其放入工作区中。提示我们可以使用git restore去还原工作区中文件的修改
(base) k@D Git % cat git1.txt 
Git is a free software!!!
I love Git!
Who are you?
I'm not you.
(base) k@D Git % git restore git1.txt 
# 可以看到,文件已经被修改了
(base) k@D Git % cat git1.txt 
Git is a free software!!!
I love Git!
Who are you?
# 如何丢弃工作区的修改
$ git checkout -- readme.txt
$ git status
On branch master
nothing to commit, working tree clean

删除文件

(base) k@D Git % vi test.txt
(base) k@D Git % git add test.txt
(base) k@D Git % git commit -m "add txt"
[master 6df4415] add txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt
(base) k@D Git % git rm test.txt 
rm 'test.txt'

小提示:先手动删除文件,然后使用git rm 和git add效果是一样的。 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。 注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

远程仓库
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个 原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之 分。
有个 叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账 号,就可以免费获得Git远程仓库。
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所 以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没 有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C “youremail@example.com”
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所 以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key 的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的所有内容。点“Add Key”,你就应该看到已经添加的Key。
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持 SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的 Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信 息放进去。
如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不 见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。

添加远程库
首先,登陆GitHub,然后,在右上角找到"+"然后“New reporetories”按钮,创建一个新的仓库:
在Repository name填入你想设定的仓库名字(learn),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
目前,在GitHub上的这个learn仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:

# 注意这里的操作必须是在的仓库目录下完成
git remote add origin git@github.com:Ren-HK/Learn.git
git branch -M main
git push -u origin main

请千万注意,把上面的Ren-HK替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有 问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
下一步,就可以把本地库的所有内容推送到远程库上:
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新 的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样。
从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master 

把本地master分支的最新修改推送至GitHub,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值