【git】基础内容
【摘要】 分布式版本控制 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环境配置
软件下载
官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/
下载对应的版本即可安装!
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)