Git学习
Git
一、为什么要使用Git?
1.传统文档管理
在我们写毕业论文时可能会遇到,多次修改之后的论文命名方式:
论文_改.doc、论文_改改.doc、论文_改改改.doc、论文_改改改改.doc、论文_改改改改再改.doc、
论文_改改改改再改TM不改了.doc
[注意git只能管理文本文件(py代码 .txt .md);对于二进制的文件(如.doc 图片 视频等)是管理不了其差异的。]
2.源代码管理的好处
- 方便多人协同开发
- 方便版本控制 version control
- ....
3.Git的诞生
-
作者Linux之父:Linus Torvalds
-
git开发目的:为了辅助Linux内核的开发
-
是Linus被逼无奈,花了2个星期用c写的
-
2008年,GitHub网站上线,为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub
-
Git迅速成为最流行的分布式版本控制系统(没有之一)
二、Git结构
Git
是分布式管理系统。服务端和客户端都有版本控制功能,都能进行代码的提交,合并,..
图一
图二
三、本地仓库操作
1.安装git
-
ubuntu下安装
sudo apt-get install git
-
windows下安装
2.查看是否安装成功
# 查看你git版本
git --version
# git --help 查看帮助命令
# git help -a 查看所有命令
# 进入分页模式,空格翻页 q键退出
# 当然linux的文件/目录操作也适用;也可以用vim进行编辑文件 cat查看文件 touth创建文件等.
3.创建本地仓库
-
创建一个文件夹用于存放项目文件(myporject)
$ mkdir myproject
-
新建/初始化 本地仓库
cd ~/myproject/ # 初始化 git init # 会创建一个.git的隐藏文件,关于版本控制的文件都存放在这里,绝对不要改动
-
配置个人信息
# 配置全局信息 git config --global user.name 'xinlan' git config --global user.email 'xinlan@tz.com' # 配置的全局信息会保存在家目录下 ~/.gitconfig cat ~/.gitconfig 查看配置的全局
# 配置本项目个人信息 git config user.name 'GuangHua' # 自己账号名 git config user.email '439912875@qq.com' # 配置信息存储在当前目录下的 .git/config下
4.添加文件
创建好了本地仓库,就准备开始开发了。
在项目文件加下创建readme.txt文件,输入以下内容。[或者创建一个markdown文件,在文件中写入一些东西]
这是一个git学习的项目。
当然也可以在Bash终端使用linux命令新建文件/ 新建文件夹.
touch readme.txt # 创建文件文件
vim readme.txt # 进入vim编辑
将文件添加到代码库分两步:
-
先添加到暂存区 [index]
git add readme.txt
-
提交到仓库
git commit -m 'Explain'
git commit
命令的,-m
参数后输入的内容是提交说明。命令执行成功后显示几个文件被改动,加了多少行。 每提交一次就会生成一个版本。
按照这个操作流程,修改readme.txt内容如下
这是一个git学习的项目。
千里之行始于脚下。...
git add .
或者-A
可以一次性把当前目录中所有有改动的文件都添加到暂存区。
5.历史版本
辛勤的工作一段时候,我们提交了很多次了,有很多的版本,怎么查看这些提交记录呢?
git log
git log --oneline # 简化输出每个版本输出一行, 并输出8位hash的提交版本码
git reflog
git reflog
可以查看所有分支的所有操作记录(),包含已删除的commit记录。
git log
不能查看已删除的commit记录
6.版本回退
-
git reset --hard HEAD^
HEAD
表示当前最新版本HEAD^
表示当前最新版本的前一个版本HEAD^^
表示当前最新版本的前两个版本,以此类推HEAD~1
表示当前最新版本的前一个版本HEAD~8
表示当前最新版本的前8个版本,以此类推
-
git reset --hard 版本号
当版本非常多时推荐这种方法。版本号就是每次commit生成的hash值,只用取前六位数。通过 git reflog 或者 git log --oneline 查看所有版本号
$ git reset --hard 版本号
7.撤销修改
运行git status
命令会显示当前工作区,暂存区,仓库的状态。当工作区的所有代码都提交到仓库并和仓库保持一致时会显示:
$ git status
On branch master
nothing to commit, working tree clean
一旦有修改,git status
命令会显示改动的文件,以及你应该怎么提交这些修改。红色代表在工作区修改的文件
, 绿色是添加到缓存区的文件
.
-
撤销工作区代码
git checkout 文件名 # 撤销单个修改的文件 git checkout . # 撤销多个修改的文件
修改文件后没有执行
add
,运行此命令可以撤销所有修改,一旦撤销没有后悔药哦,在确定抛弃所有修改时使用。跟没提交直接删除一样 -
撤销暂存区的代码
# 第一步:将暂存区代码撤销到工作区 git reset HEAD . # 第二步:撤销工作区代码(注意这一步骤也会撤销所有的修改) git checkout .
8.对比文件
-
对比本地仓库与工作区( . 代表对比所有的文件的变化)
git diff HEAD -- . 或者 git diff
-
对比本地仓库各个版本代码
git diff HEAD HEAD^ -- . git diff HEAD~2 HEAD~5 -- .
-
对比当前最新提交的版本与上一次版本所有修改的文件与原文件的变化
git show
9.文件删除
-
删除没有添加进版本库中的工作区中的文件
# 直接删除不用做任何操作
-
删除已添加进暂存区但没有提交的文件
# 1.先撤回工作区 git reset HEAD . # 2.直接删除 rm -rf 文件名/文件夹
-
已提交到版本库(删除后再次提交)
# 1.删除文件 rm 文件名 # 2.运行`git add .` git add . # 3.提交 git commit -m 'delete some file'
四、远程仓库
要实现多人协作分工,就需要git服务端。对于我们学习来说,自己去搭建一个服务端太费事,再说你写的代码也不是啥国家战略秘密,不用担心给别人看到了。前文提到了github网站,它就是一个git服务端,最重要的是不要钱,很多开源项目都托管在它的上面了。但是它的服务器在境外,国内访问比较缓慢,好消息是,国内也成立了一个网站叫码云
不是马云
,大家学习git可以通过这个网站,很多国内项目也开始托管在码云上了。
不管是是使用github还是使用码云,步骤是差不多的,区别是github是全英文的慢一点。这里我们以码云为例。
首先你需要注册一个码云的账户,然后创建一个空的仓库。
。
创建好仓库后,你的仓库会有两个地址,一个是https,一个是ssh。因为使用https需要输入用户名和密码,推荐使用ssh的方式。要使用ssh你需要设置你账户的ssh公钥。公钥管理
要把本地仓库和远程仓库联系起来有两种方式:
1.添加远程仓库
- 添加公钥
运行下列命令生成公钥,在用户家目录的.ssh文件夹
ssh-keygen -t rsa -C "xxx@xxx.com"
按照提示完成三次回车,即可生成 ssh key。通过查看 ~/.ssh/id_rsa.pub
文件内容,获取到你的 public key
cat ~/.ssh/id_rsa.pub
ssh-rsa AAB3NzaC1yc2EAAAADAQABA 163@qq.com... # 复制公钥到码云公钥管理添加
-
克隆
远程仓库里已经存在项目文件,需要将项目从远程仓库clone到本地进行工作。
# 首先cd到你要存放项目的目录 cd ~/projects # 然后运行下面的命令 http方式- $ git clone https://gitee.com/用户名/仓库名.git ssh方式- $ git clone git@gitee.com:yelan_w/test_project.git # 推荐
-
本地初始化一个仓库,设置远程仓库地址后再做push
和第一种方式的区别在于先创建本地仓库, 然后将本地仓库添加到远程仓库
git init # 创建本地仓库 git remote add origin git@gitee.com:用户个性地址/project.git
2.从本地仓库推送到远程仓库
当本地工作完成,需要将本地仓库代码推送到远程仓库,使用git push
命令(只会推送提交到本地仓库的文件)
git push origin master
git push -f origin master # 强推
3.从远程仓库拉取更新到本地仓库
你的同事和你协同开发,他工作的那部分内容完成了,并且已经推送到远程仓库,你接下来的工作需要依赖他的那部分代码,那么你需要将远程仓库代码拉取到本地仓库,使用git pull
命令
git pull origin master
git pull --rebase origin master # 强拉
五、分支管理
正常的开发项目中都是多人协作,每个人的任务一般不会一天就完成,如果把没有完成的代码提交到远程仓库会影响被人工作。git提供了分支的功能就不用担心了,可以创建一个自己的分支,在上面干活,想提交就提交,等到工作完成再一次性合并到原来的分支。
1.创建分支
新建git仓库时会默认创建一个分支master
,它叫主分支。一般情况我们不会直接在主分支上干活,它主要用来发布版本, 进行版本控制。
创建一个开发分支develop
git branch develop
再切换到develop
分支
git checkout develop
Switched to branch 'develop'
这两条命令也可以通过一条命令来实现
git checkout -b develop
-b
参数表示创建并切换。
使用git branch
命令查看当前分支
git branch
* develop
master
2.合并分支
创建好develop
分支后,你开始在该分支干活,完成领导交给你的任务,根据用户的手机壳颜色更换app主题,5分钟之后开发完毕,提交:
$ git add .
Administrator@DESKTOP-F3CCKFR MINGW64 ~/Desktop/haha (develop)
$ git commit -m 'complete change theme'
[develop 5b83e32] complete change theme
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 change_theme.py
在devlop分支
干完活将文件提交到仓库后,现在我们要合并到master
分支
首先切换到master
$ git checkout master
Switched to branch 'master'
查看工作区,你会发现刚才开发的功能文件没有了,不要惊慌,因为那个提交是在develop
分支上,现在我们把develop
分支的工作合并到master
分支上:
$ git merge develop
Updating 7173db6..5b83e32
Fast-forward
change_theme.py | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 change_theme.py
git merge
命令用于合并指定分支到当前分支。合并后,再查看文件夹发现,change_theme.py
文件又回来了。
合并分支后, HEAD
同时指向了 (master, devlop)
3.删除分支
合并完之后你也可以删除掉develop
分支:或者也可以在devlop分支再设分支和删除
$ git branch -d develop
Deleted branch develop (was 5b83e32).
$ git branch
* master
git账户: kongguanghua
添加远程仓库后的配置文件: