【git】基础内容

举报
LongYorke 发表于 2021/01/30 21:55:27 2021/01/30
【摘要】 分布式版本控制 Git版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。Git是分布式版本控制系统,分布式特点:没有中央服务器,每个人的电脑就是一个完整的版本库。Git是免费、开源的,最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper!git优点:实现...

分布式版本控制 Git

版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。
Git是分布式版本控制系统,分布式特点:没有中央服务器,每个人的电脑就是一个完整的版本库。Git是免费、开源的,最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper!
git优点:
  • 实现跨区域多人协同开发
  • 追踪和记载一个或者多个文件的历史记录
  • 组织和保护你的源代码和文档
  • 统计工作量
  • 并行开发、提高开发效率
  • 跟踪记录整个软件的开发过程
  • 由于没有中央服务器,每个人的电脑就是一个完整的版本库,不会因为服务器损坏或者网络问题,造成不能工作的情况
  • 适合分布式开发,强调个体。
  • 任意两个开发者之间可以很容易的解决冲突。

git缺点:
  • 代码保密性差,每个人都拥有全部的代码!
  • 所有版本信息仓库全部同步到本地的每个用户,增加了本地存储空间的占用。
  • 模式上比SVN更加复杂。


Git=“饭桶”?

我们都知道,Linux 内核开源项目有着为数众广的参与者。整个项目组开始的时候启用一个分布式版本控制系统 BitKeeper 来管理和维护代码。本来BitKeeper 用的好好的,后来BitKeeper公司怀疑Linux社区中一些大佬在搞逆向工程,企图破解 BitKeeper !他们就收回了给Linux开发者的免费授权,于是Linus不得不自己写了一个分布式版本控制系统,还给它起名git。
小伙伴们可以想象有人开发一款软件,并且给它起名“傻逼”或者“饭桶”的场景么。


Git环境配置

软件下载


打开 [git官网] https://git-scm.com/,下载git对应操作系统的版本。

官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/

下载对应的版本即可安装!
Windows安装:傻瓜式点击下一步(更改一下安装目录),倘若还有问题的话,在【Hexo】笔记01:安装Hexo-云社区-华为云 中有详解
Liunx安装
1、如果你碰巧用Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装,非常简单。
2、老一点的Debian或Ubuntu Linux,要把命令改为sudo apt-get install git-core,因为以前有个软件也叫GIT(GNU Interactive Tools),结果Git就只能叫git-core了。由于Git名气实在太大,后来就把GNU Interactive Tools改成gnuit,git-core正式改为git。
3、如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config,make,sudo make install这几个命令安装就好了。


软件卸载

打开系统属性

打开系统设置

打开环境变量


删除Path


删除git环境后再进行软件卸载





启动Git

安装成功后在开始菜单中会有Git项



任意文件夹下右键也可以看到对应的git


Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令


常用的Linux命令

1)、cd : (change directory)改变目录。
2)、cd . . 回退到上一个目录,直接cd进入默认目录
3)、pwd : 显示当前所在的目录路径。
4)、ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
5)、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
6)、rm: (remove)删除一个文件, rm index.js 就会把index.js文件删除。
7)、mkdir: (make directory)新建一个目录,就是新建一个文件夹。
8)、rm -r : 删除一个文件夹, 例如:rm -r src 删除src目录
rm -rf / 切勿在Linux中尝试!f递归 /代表根目录,直接格式化所有文件!!
9)、mv :(move)移动文件,
mv index.html src
index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
10)、reset 重新初始化终端/清屏。
11)、clear 清屏。
12)、history 查看命令历史。
13)、help 帮助。
14)、exit 退出。
15)、#表示注释



Git配置

所有的配置文件,其实都保存在本地!
查看配置 git config -l

查看不同级别的配置文件:
#查看系统config git config --system --list #查看当前用户(global)配置 git config --global --list #查看当前仓库配置信息 git config --local --list

Git相关的配置文件:
1)、Git\etc\gitconfig :Git 安装目录下的 gitconfig --system 系统级
2)、C:\Users\Administrator\ .gitconfig : 只适用于当前登录用户的配置 --global 全局
3)、当前文件夹\.git\config :查看当前仓库配置信息

设置用户名与邮箱(必须的用户标识)
当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
git config --global user.name "LongYorke" #名称
git config --global user.email xxxxxxxxxx@qq.com #邮箱
只需要做一次这个设置,如果你传递了--global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。
如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要--global选项。
总之--global为全局配置,不加为某个项目的特定配置。



Git基本理论

四个区域

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:


  • Workspace:工作区,就是你平时存放项目代码的地方
  • Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。就像我们去购物一样,先把东西放到购物车Index / Stage,去结账没问题后放到家里Repository
  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
git仓库中HEAD指向本地的仓库区内当前的开发分支,默认主分支master


文件的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
  • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
  • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

下图描述了文件状态、三个区域(本地)、部分命令关联部分

  • git status [filename] :查看指定文件状态
  • git status:查看所有文件状态
  • git diff:比较文件的不同,即暂存区和工作区的差异。



  • git log查看历史提交记录


黑色:
  • git add .:暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • git commit -m “1.0.0”:将本地修改过的文件提交到本地库中,并有提交信息1.0.0,master 分支会做相应的更新。
  • git rm --cached <file> :会直接从暂存区index/stage删除文件,工作区则不做出改变。

红色:
  • git reset HEAD :暂存区index/stage的目录树会被respository重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

绿色:
  • git checkout . 或者 git checkout -- <file> :,会用暂存区index/stage全部或指定的文件覆盖工作区的文件。这个操作会清除工作区中未添加到暂存区的改动。
  • git checkout HEAD . 或者 git checkout HEAD <file> :会用 HEAD 指向的 master 分支中的全部或者部分文件覆盖暂存区和以及工作区中的文件。这个命令不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

如果再讨论远程仓库:
  • git push:是将本地库中的最新信息发送给远程库;
  • git pull:是从远程获取最新版本到本地,并自动merge;
  • git fetch:是从远程获取最新版本到本地,不会自动merge;
  • git merge:是用于从指定的commit(s)合并到当前分支,用来合并两个分支;



加上分支内容:
# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 新建一个分支,指向指定commit
$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]



有点晕?那么来一波总结:

1、存储(去的感觉):
git add 工作区->暂存区
git commit -m 暂存区->本地仓库
git commit --amend -m [message] ①如代码无新变化,覆盖上一次commit的提交信息
②如有变,覆盖上一次commit
git push 本地仓库->远程仓库

2、覆盖与删除(回的感觉):
git merge:本地仓库内两个部分合并
git fetch 远程仓库->本地仓库
git pull 相当于 git fetch + git merge
(有“HEAD” 的从本地仓库开始操作)
git reset HEAD 本地仓库的内容->暂存区 (覆盖)
git reset --hard HEAD 本地仓库的内容->工作区+暂存区(覆盖)
git checkout HEAD 本地仓库的内容->暂存区+工作区(覆盖)
git checkout ①--<文件> 暂存区内容->工作区(覆盖) ②<分支> 切换分支
git rm --cached 暂存区->垃圾桶
git rm [file1] [file2] 工作区->垃圾桶(同时)工作区删除记录->暂存区

3、最开始啥也没有
git init
git clone 远程仓库->本地仓库+暂存区+工作区

4、分支
看下面实际操作过程



工作流程

Gitee、Github 两大代码托管平台,小孩子才做选择,我们都要~
工作流程一般是这样的:
1、使用以下命令生成 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
ssh-keygen -t rsa -C "youremail@example.com"

打开id_rsa.pub,复制里面的key
2、上传自己的 SSH 公钥。
github:

左侧寻到


gitee:


3、添加仓库信息:
github:





gitee:




4、创建仓库
git init
5、 从现有 Git 仓库中拷贝项目,如
git clone git://github.com/xxx/xxx.git
5、本地库上使用命令git remote add把它和 Gitee 的远程库关联:

git remote add origin git@gitee.com:longyorke/LongYorke_test.git
出现该情况说明本地库已经关联了一个名叫 origin 的远程库(做该实验之前我已经关联过了,如果第一次关联是不会fatal的),此时,可以先用git remote -v查看远程库信息:
git remote -v

可以看到,本地库已经关联了 origin 的远程库,并且,该远程库指向 Gitee。
我们可以删除已有的 Gitee 远程库:
git remote rm origin

重新关联远程库:git 给远程库起的默认名称是 origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。
git remote add github git@github.com:LongYorke/long-yorke_music.git
git remote add gitee git@gitee.com:LongYorke/long-yorke_music.git
此刻,远程库名字不再是 origin,而是我们设置的github与gitee
$ git remote -v
gitee   git@gitee.com:longyorke/long-yorke_music.git (fetch)
gitee   git@gitee.com:longyorke/long-yorke_music.git (push)
github  git@github.com:Longyorke/LongYorke_music.git (fetch)
github  git@github.com:Longyorke/LongYorke_music.git (push)

6、有了修改的变化后,瞅一下文件状态
git status
7、将工作区的文件提交到暂存区域。
git add .
8、将暂存区域的文件提交到本地仓库。
git commit -m '初始化项目版本'
9、如果要推送到 GitHub,使用命令:
git push github master

如果要推送到 Gitee,使用命令:
git push gitee master
10、分支管理
创建一个dev分支用于测试开发,master分支用于稳定版存储
git branch dev
观察分支
git branch


切换分支命令:
git checkout dev


合并分支命令:
出于dev分支时,将material合并进入dev分支
git merge master

删除dev分支命令:
git branch -d dev

11、恢复
git中把commit删了后,并不是真正的删除,而是变成了悬空对象(dangling commit)。我们只要把把这悬空对象(dangling commit)找出来。
1)用git reset --hard HEAD 覆盖后
2)找到悬空对象
git fsck --lost-found dangling commit xxx
3)用合并命令进行恢复:
git merge xxx


12、强制覆盖远程分支

然后用这个
git push -u 我们起的主机名字 本地分支 -f 
强制覆盖已有远程的分支

此外还有Git 查看提交历史、Git 标签等内容
可以进入gitee官网了解更全面的内容
可以进入git官网学习更全面的知识


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。