Git与Github的使用

目录

1. Git是什么

2. 集中式和分布式版本控制系统的区别

3. 在Windows10上安装Git

4. 创建本地仓库(repository)

4.1 新建仓库

4.2 把修改的文件添加到版本库

4.3 版本查询和跳转

4.4 几个重要的概念

4.5 撤销修改

4.6 删除文件

5. 远程仓库(免费的Git服务端)


1. Git是什么

Git是世界上最先进的分布式版本控制系统。对于开发者来说,主要用于代码托管和代码版本控制。

2. 集中式和分布式版本控制系统的区别

略,可参考廖雪峰的博客:https://www.liaoxuefeng.com/。

3. 在Windows10上安装Git

Git软件下载地址:Git - Downloads

下载速度比较快的国内开源资源下载链接地址:

https://npm.taobao.org/mirrors/git-for-windows/

下载安装包后进行安装,使用默认的安装选项进行即可。安装完成之后,打开Git Bash,界面如下:

第一次使用Git,需要设置两项用户身份信息,分别是用户名和Email,以命令行的方式来进行设置,如下:

$ git config --global user.name "xxxx"
$ git config --global user.email "xxxxxxx"

Git是分布式版本控制系统,所以,每个机器都必须自报家门。这里的git config命令使用了--global参数,表示在这台电脑上的所有的Git仓库都会使用这个配置。

Git Bash 的命令用法跟 Linux 完全一样,比如 cd、 ls 、mkdir、clear等命令。

注:

 在安装Git的时候,如果使用都是默认的安装路径,那么用户主目录(跟Linux里面的用户主目录是一样的概念)就默认在C盘里面,比如:C:\Users\Administrator。双击Git Bash图标启动Git Bash(每一次启动Git Bash,它的工作目录默认设置在用户主目录下。),在Git Bash里面使用命令pwd进行查看。如下:

在win下,对应的就是这个目录:

Git默认的用户主目录里面,有个文件.gitconfig,可以使用记事本将它打开,发现里面存有上面所设置两项用户身份信息:

不管是本地仓库还是远程仓库(下文会讲到),都需要这两项信息作为认证的依据。

4. 创建本地仓库(repository)

仓库(repository)其实就是一个目录,所以创建仓库,其实就是创建一个目录,可以在任何位置通过Git Bash里面的命令mkdir来进行创建。这是一个比较特殊的目录,是Git的管理目录。目录里面每个文件的修改、删除(凡是有改动的)都能被Git跟踪到,而且也能查询到相应的历史记录。

4.1 新建仓库

在win下的E盘里面,新建一个目录git_learn。通过Git bash的命令行进入到这个目录里面。

在该目录下执行命令:git init之后,这个目录就变成了Git可以管理的仓库。

命令git init执行完毕,可以看到弹出的提示:“在xxxx位置初始化了一个空的仓库”。通过一个命令行就可以把一个仓库给建立起来了,那么这个Git仓库,到底有什么不同的呢?其实,命令执行过后,在当前目录下,还生成了一个新的目录.git,它是一个隐藏的目录。可以使用命令ls -a来查看,如下:

这个目录是Git的核心部分,它是用来管理当前仓库(E:\git_learn,在哪个目录下执行git init,那个目录就是一个仓库)的,不要试图去修改这个目录里面的.git文件,否则就破坏了整个Git仓库。

4.2 把修改的文件添加到版本库

所有的版本控制系统(不只是Git,比如还有SVN等),都只能跟踪文本文件的改动。比如TXT文件、网页、程序代码....,比如在第几行,新增了哪几个单词,在第几行删掉了哪几个单词。但是对于一类比较特殊的文件,二进制文件,比如图片、视频、可执行文件等,也可以由版本控制系统来进行管理,但是没法跟踪文件的变化,只能把二进制文件每一次的改动都串起来。比如,它可以知道图片大小从100KB变成了200KB,但是到底哪里有了更改,控制系统并不知道,因为这是二进制文件。

微软的Word文件、PDF等文件都是二进制文件,所以版本控制系统是没法跟踪Word文件的改动的。

要想真正使用版本控制系统,就应该以纯文本方式来编写文件,文本是有编码的,最好使用UTF-8编码,大部分平台都能支持,兼容性好。

把一个文件添加到Git仓库,那么文件就要建立在仓库里面,或者是仓库里面的子目录,否则Git是找不到文件的。接下来,执行两个步骤即可将新建的文本添加到仓库:

  1. 把文件添加到暂存区,命令:git add filename
  2. 再把文件提交到仓库,命令:git commit -m  “description”

注:

git commit命令使用了一个参数-m,后面是本次提交的说明,一般是输入一些有意义的内容。

可以一次性add很多文件,然后使用commit一次性提交很多文件(git add -A)。

4.3 版本查询和跳转

(1)查看提交历史:git log

这个命令会显示从最近到最远的提交日志,是按照时间来进行排序的。如果嫌弃输出的信息太多,可以加参数--pretty=oneline,那么就会以单行的形式来进行显示,每一行显示的内容为commit id(提交的版本号)+提交时候的描述:

commit id是一个非常大的数字,为什么需要这么大的数字作为id?主要是为了避免提交版本号的冲突。每提交一个版本,Git就会把它们自动串成一条时间线。我们可以直接使用可视化工具查看提交历史的时间线:

右键Git仓库--------->Git History

(2)版本跳转命令:git reset --hard HEAD

HEAD表示当前版本,也就是最新的版本,那么上一个版本就是HEAD^,上上一个版本就是HEAD^^,依次类推。当然,如果存在100个版本,那就得写100个^,屏幕根本没法显示,也很麻烦。所以,还有另一种表达方式:HEAD0、HEAD1、HEAD2...。还可以再有一种方式:git reset --hard +commit id(一般写前5位即可:git reset --hard cb926)。

注:方式一,会造成版本回退!!!覆盖。(比如从版本2回退到版本1,可以回退。但是从版本1再跳到版本2,版本2就没了!),所以,版本的跳转,建议使用第二种方式。

版本跳转示例:不覆盖当前版本

xxxxxx@srv-pad-compile5:$ git log -2

commit ccdc3efc8364400788bc704810a40e2c648bd507

Author: xxxxxx <xxxxxx@xxxxxx-semi.com>

Date:   Mon Mar 9 14:30:25 2020 +0800

    success to enum

   

    Change-Id: I86f1c22046ff9e667eb90ea7e5c1a9113cdc77e5

commit cbab012075903d0e96b8b2032a12125bdaa4444f

Author: xxxxxx<xxxxxx@xxxxxx-semi.com>

Date:   Sat Mar 7 15:49:47 2020 +0800

    success to add HD audio play support

   

Change-Id: Ie0fcb483e41d7e7e765a37c305ba9b5e1aaa0aa2

xxxxxx@srv-pad-compile5:$ git reset --hard cbab012075903d0e

HEAD is now at cbab012075 success to add HD audio play support

weiguopai@srv-pad-compile5:$ git log -2

commit cbab012075903d0e96b8b2032a12125bdaa4444f

Author: xxxxxx <xxxxxx@xxxxxx-semi.com>

Date:   Sat Mar 7 15:49:47 2020 +0800

    success to add HD audio play support

   

    Change-Id: Ie0fcb483e41d7e7e765a37c305ba9b5e1aaa0aa2

commit f2710863dc73c961f6570403f105265ea9aefa83

Author: xxxxxx<xxxxxx@xxxxxx-semi.com>

Date:   Sat Mar 7 14:02:15 2020 +0800

    ready to add HD support

   

    Change-Id: Ic966af7cc592636e915eccda35c9cd04b1cdbacb

跳转到前一个版本怎么操作:

xxxxxx@srv-pad-compile5:$ git reflog

cbab012075 HEAD@{0}: reset: moving to cbab012075903d0e

ccdc3efc83 HEAD@{1}: reset: moving to ccdc3efc83

cbab012075 HEAD@{2}: reset: moving to cbab012075903d0e9

ccdc3efc83 HEAD@{3}: commit: success to enum

cbab012075 HEAD@{4}: commit: success to add HD audio play support

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

xxxxxx@srv-pad-compile5:$ git reset ccdc3efc83

Unstaged changes after reset:

M       samples/actions_sdk_demo/usb_audio_sourcesink/prj.conf

M       samples/actions_sdk_demo/usb_audio_sourcesink/src/Makefile

M       samples/actions_sdk_demo/usb_audio_sourcesink/src/usb_handler.c

M       subsys/usb/class/audio_sourcesink/audio_sourcesink.c

xxxxxx@srv-pad-compile5:$ git log -2

版本成功回退

commit ccdc3efc8364400788bc704810a40e2c648bd507

Author: xxxxxx <xxxxxx@xxxxxx-semi.com>

Date:   Mon Mar 9 14:30:25 2020 +0800

    success to enum

    Change-Id: I86f1c22046ff9e667eb90ea7e5c1a9113cdc77e5

commit cbab012075903d0e96b8b2032a12125bdaa4444f

Author: xxxxxx<xxxxxx@actions-semi.com>

Date:   Sat Mar 7 15:49:47 2020 +0800

    success to add HD audio play support

Change-Id: Ie0fcb483e41d7e7e765a37c305ba9b5e1aaa0aa2

注意:版本回退跳转之后,会将改动的文件还原,记得再次git checkout !!

如下:

xxxxxx@srv-pad-compile5:$ git reflog -10

cbab012075 HEAD@{0}: reset: moving to cbab012075903d0e96b8b2032a12125bdaa4444f

ccdc3efc83 HEAD@{1}: reset: moving to ccdc3efc83

cbab012075 HEAD@{2}: reset: moving to cbab012075903d0e

ccdc3efc83 HEAD@{3}: reset: moving to ccdc3efc83

cbab012075 HEAD@{4}: reset: moving to cbab012075903d0e9

ccdc3efc83 HEAD@{5}: commit: success to enum

cbab012075 HEAD@{6}: commit: success to add HD audio play support

f2710863dc HEAD@{7}: commit: ready to add HD support

4a93eb3b78 HEAD@{8}: commit: ready to add HD support

d4483a74b6 HEAD@{9}: commit: ready to init volume_sync

(3)查看命令历史:git reflog

使用这个命令,可以显示命令历史记录。

4.4 几个重要的概念

工作区:工作区就是个目录,而且就是仓库目录。

版本库:版本库其实就是工作区里面的隐藏文件.git。版本库里面包含两部分,一个是暂存区(stage/index),另一个是Git为我们自动创建的第一个分支master。

使用add命令的之后,是把文件添加到了暂存区,然后使用commit之后,才会将更改提交到master分支里面。可以这么理解,需要提交的文件修改,通通放到暂存区,然后使用commit一次性提交所有的修改。

查看工作区和版本库里面最新的版本的区别:git diff HEAD --filename

4.5 撤销修改

在没有使用add命令将修改添加到暂存区之前,可以使用命令git checkout --filename来丢弃工作区的修改,那么就回到和版本库一模一样的状态。如果已经添加到暂存区只会,文件又做了修改,那么使用命令之后,那么就回到添加暂存区一样的状态。

总之,这个命令会回到最近一次git add或者git commit的状态。

4.6 删除文件

删除也是改动,Git可以跟踪到哪个文件被删除了,所以删除之后,要记得重新提交一次修改。

5. 远程仓库(免费的Git服务端)

GitHub 是一个网站(官网链接:https://github.com/),它提供 Git 仓库托管服务的。 只要注册一个 GitHub 账号,就可以免费获得 Git 远程仓库。 免费使用的前提是你的仓库是公开的, 别人可以随便下载源码。如果想把公开仓库变为私有的,需要交费。

对于第 1 次使用 GitHub,需要执行以下步骤:
(1) 创建 SSH Key:
         在用户主目录下,看看有没有.ssh 目录,如果有,再看看这个目录下有没有 id_rsa 和
id_rsa.pub 这两个文件,如果已经有了,可直接跳到下一步。
         如果没有,打开命令行(Windows 下是打开 Git Bash),在用户主目录下创建 SSH Key, 命令如下:
ssh-keygen -t rsa -C "3437255484@qq.com"
邮件是自己的邮件地址,然后一路回车,使用默认值即可。
         如果一切顺利的话,可以在用户主目录里找到.ssh 目录,里面有 id_rsa 和 id_rsa.pub 两个文件, 它们是 SSH Key 的秘钥对。 id_rsa 是私钥,不能泄露出去; id_rsa.pub 是公钥,可以放心地告诉任何人。

(2) 注册 GitHub 用户:
         登录 https://github.com/, 在首页输入用户名、 EMAIL、密码,进行注册。


(3) 在 GitHub 里添加 SSH Key:
点击网页右上角的绿色按钮,选择“Settings”:

在新界面中,按下图中标号顺序选择、填写(其中 Title 可以任意写, Key 为 id_rsa.pub

文件的内容):

(4) 创建仓库:
点击网页右上角的“+”号,选择“New repository”


以JNIDemo 为例,在如下界面中,写入仓库名(“Repository name”)、描述信息“( Description”),然后点击“Create repository”按钮:

为什么 GitHub 需要 SSH Key 呢?因为 GitHub 需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而 Git 支持 SSH 协议,所以, GitHub 只要知道了你的公钥,就可以确认只有你自己才能推送。当然, GitHub 允许你添加多个 Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的 Key 都添加到 GitHub,就可以在每台电脑上往 GitHub 推送了。
最后友情提示,在 GitHub 上免费托管的 Git 仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。


(5) 提交本地仓库到 GitHub:
以本地的 JNIDemo 仓库为例,先在命令行里进入 JNIDemo 目录,执行以下命令:
 

git remote add origin git@github.com:wgp/JNIDemo.git


git push -u origin master
git push origin --tags


上述命令中:

第 1 个命令是把本地的 JNIDemo 仓库和 GitHub 上的 JNIDemo 仓库关联起来。
第 2 个命令是把本地仓库的 master 分支推送到 GitHub 上。
第 3 个命令是把本地标签推送到 GitHub 上。


注意: 第一次推送时要加上“-u”选项, Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令:


注意: SSH 警告
当你第一次使用 Git 的 clone 或者 push 命令连接 GitHub 时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?


 这是因为 Git 使用 SSH 连接,而 SSH 连接在第一次验证 GitHub 服务器的 Key 时,需要你确认 GitHub 的 Key 的指纹信息是否真的来自 GitHub 的服务器,输入 yes 回车即可。从现在起,只要本地作了提交,就可以通过以下命令把本地 master 分支的最新修改推送至 GitHub:

git push origin master  //推送master分支到Github
git push origin --tags   //推送标签到Github

(6)克隆远程仓库

命令:git clone git@github.com:wgp/JNIDemo.git

Github给出的地址不止一个,还可以使用这样的地址:https://github.com/wgp/JNIDemo.git

这是因为,Git支持多种协议,默认的Git使用SSH协议,还可以使用https协议。使用https协议有缺点: 速度相对较慢、每次推送都必须输入口令。但是也要看开发环境,比如某些公司内部只开放HTTP端口,那么就没法使用ssh了。有时候,主机翻墙,得看具体使用的是什么协议。比如我的翻墙:

这时候,就不能使用https://github.com/wgp/JNIDemo.git这个命令了,因为不支持,会出现无法连接到远程仓库的错误。那么就得使用Git原生态所支持的ssh协议了。

(7)标签管理

a. 创建标签

发布一个版本的时候,通常都是在版本中打一个标签来进行管理。以后就可以根据标签来取出自己想要的版本,所以标签也称为版本库的一个快照。

创建标签的命令:git tag 标签名

查看所有标签:git tag

创建带有说明的标签:git tag -a 标签名 -m “description”

查看标签说明:git show 标签名

注:默认的标签是打在最新提交的commit上的,如果要给指定的commit提交标签,在后面指定commit id即可,如下:

创建标签的命令:git tag 标签名 commit id

创建带有说明的标签:git tag -a 标签名 -m “description” commit id

b. 删除标签

(1首先查看本地存在标签

git tag

1.0.0

(2然后先删除本地标签

git tag -d 1.0.0

[可以一次性删除多个标签:git tag –d 标签1 标签2 ……]

(3然后推送到远程仓库

git push origin --delete 1.0.0

[可以一次性删除多个标签]

6. 分支管理

   暂时留空

7. 下载代码完整流程

(1)创建本地仓库、远程仓库

git init

(2)关联本地仓库和远程仓库

git remote add origin git@github.com:wgp/JNIDemo.git
git push -u origin master

(3)添加修改到暂存区并且提交修改

git add xxxx/git add  -A

git commit -m “description”

(4)给提交打上标签

git tag xxx [commit id]

(5)将修改和标签同步到Github

git pull –u origin master

git pull origin --tags

克隆远程仓库:

(1)先把远程仓库都克隆过来

git clone git@github.com:wgp/JNIDemo.git

或者

https://github.com/wgp/JNIDemo.git

注:JNIDemo.git----->远程仓库名.git

(2)查看tag     

git tag            //先查看所有标签

git show tagname   //查看某个具体标签的描述

(3)取出自己想要的版本

git checkout tagname

注:取出对应版本代码后,复制到其他地方做修改,不要在当前目录下进行修改。

下一篇:Git命令和问题集_卡卡6的博客-CSDN博客

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值