赞
踩
目录
Git是世界上最先进的分布式版本控制系统。对于开发者来说,主要用于代码托管和代码版本控制。
略,可参考廖雪峰的博客:https://www.liaoxuefeng.com/。
Git软件下载地址:Git - Downloads
下载速度比较快的国内开源资源下载链接地址:
https://npm.taobao.org/mirrors/git-for-windows/
下载安装包后进行安装,使用默认的安装选项进行即可。安装完成之后,打开Git Bash,界面如下:
第一次使用Git,需要设置两项用户身份信息,分别是用户名和Email,以命令行的方式来进行设置,如下:
$ git config --global user.name "xxxx" |
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,可以使用记事本将它打开,发现里面存有上面所设置两项用户身份信息:
不管是本地仓库还是远程仓库(下文会讲到),都需要这两项信息作为认证的依据。
仓库(repository)其实就是一个目录,所以创建仓库,其实就是创建一个目录,可以在任何位置通过Git Bash里面的命令mkdir来进行创建。这是一个比较特殊的目录,是Git的管理目录。目录里面每个文件的修改、删除(凡是有改动的)都能被Git跟踪到,而且也能查询到相应的历史记录。
在win下的E盘里面,新建一个目录git_learn。通过Git bash的命令行进入到这个目录里面。
在该目录下执行命令:git init之后,这个目录就变成了Git可以管理的仓库。
命令git init执行完毕,可以看到弹出的提示:“在xxxx位置初始化了一个空的仓库”。通过一个命令行就可以把一个仓库给建立起来了,那么这个Git仓库,到底有什么不同的呢?其实,命令执行过后,在当前目录下,还生成了一个新的目录.git,它是一个隐藏的目录。可以使用命令ls -a来查看,如下:
这个目录是Git的核心部分,它是用来管理当前仓库(E:\git_learn,在哪个目录下执行git init,那个目录就是一个仓库)的,不要试图去修改这个目录里面的.git文件,否则就破坏了整个Git仓库。
所有的版本控制系统(不只是Git,比如还有SVN等),都只能跟踪文本文件的改动。比如TXT文件、网页、程序代码....,比如在第几行,新增了哪几个单词,在第几行删掉了哪几个单词。但是对于一类比较特殊的文件,二进制文件,比如图片、视频、可执行文件等,也可以由版本控制系统来进行管理,但是没法跟踪文件的变化,只能把二进制文件每一次的改动都串起来。比如,它可以知道图片大小从100KB变成了200KB,但是到底哪里有了更改,控制系统并不知道,因为这是二进制文件。
微软的Word文件、PDF等文件都是二进制文件,所以版本控制系统是没法跟踪Word文件的改动的。
要想真正使用版本控制系统,就应该以纯文本方式来编写文件,文本是有编码的,最好使用UTF-8编码,大部分平台都能支持,兼容性好。
把一个文件添加到Git仓库,那么文件就要建立在仓库里面,或者是仓库里面的子目录,否则Git是找不到文件的。接下来,执行两个步骤即可将新建的文本添加到仓库:
|
注:
git commit命令使用了一个参数-m,后面是本次提交的说明,一般是输入一些有意义的内容。
可以一次性add很多文件,然后使用commit一次性提交很多文件(git add -A)。
(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 版本成功回退
注意:版本回退跳转之后,会将改动的文件还原,记得再次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
使用这个命令,可以显示命令历史记录。
工作区:工作区就是个目录,而且就是仓库目录。
版本库:版本库其实就是工作区里面的隐藏文件.git。版本库里面包含两部分,一个是暂存区(stage/index),另一个是Git为我们自动创建的第一个分支master。
使用add命令的之后,是把文件添加到了暂存区,然后使用commit之后,才会将更改提交到master分支里面。可以这么理解,需要提交的文件修改,通通放到暂存区,然后使用commit一次性提交所有的修改。
查看工作区和版本库里面最新的版本的区别:git diff HEAD --filename
在没有使用add命令将修改添加到暂存区之前,可以使用命令git checkout --filename来丢弃工作区的修改,那么就回到和版本库一模一样的状态。如果已经添加到暂存区只会,文件又做了修改,那么使用命令之后,那么就回到添加暂存区一样的状态。
总之,这个命令会回到最近一次git add或者git commit的状态。
删除也是改动,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
|
上述命令中:
第 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. |
这是因为 Git 使用 SSH 连接,而 SSH 连接在第一次验证 GitHub 服务器的 Key 时,需要你确认 GitHub 的 Key 的指纹信息是否真的来自 GitHub 的服务器,输入 yes 回车即可。从现在起,只要本地作了提交,就可以通过以下命令把本地 master 分支的最新修改推送至 GitHub:
git push origin master //推送master分支到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 |
(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)先把远程仓库都克隆过来
注:JNIDemo.git----->远程仓库名.git
(2)查看tag
git tag //先查看所有标签 git show tagname //查看某个具体标签的描述 |
(3)取出自己想要的版本
git checkout tagname |
注:取出对应版本代码后,复制到其他地方做修改,不要在当前目录下进行修改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。