git笔记-简单入门
git笔记
git是一个分布式版本控制系统,它的优点有哪些呢?分为以下几个部分
- 与集中式的版本控制系统比起来,不用担心单点故障问题,只需要互相同步一下进度即可。
- 支持离线编辑,每一个人都有一个完整的版本库。
- 跨平台支持
- 性能高效
安装和初始化配置
git的安装方式有方式
- 带GUI的git,带有图形化界面
- 命令行安装
个人比较推荐命令行安装的方式,我采用的是centos 7.x的系统
- 添加 CentOS/RHEL 7 存储库
sudo yum -y install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm
- yum安装git
sudo yum install git -y
初始化git
- 配置用户名
git config --global user.email '你的邮箱'
- 配置邮箱
git config --global user.email '你的密码'
创建仓库
在git中,创建仓库有两种方式
- 使用git init
git init
- git init reop name
git init name
- 从gitee/github已有的仓库,创建仓库(使用clone的方式)
git clone git@gitee.com:tmeermer/hnys.git
工作区和文件状态
git有三个工作区域分为工作区,暂存区,本地仓库。现在来简单解释一下这三个区域
工作区:当前的工作目录,所有的操作都在这里进行
暂存区:工作区完成工作后,将产生的文件推送到暂存区,临时保存这些文件。可以理解为一个临时的杂货铺
本地仓库:这里存放最终的成品,也就是仓库。
添加和提交文件
- 添加文件
git add filename
添加时后面需要添加文件名,也可使用通配符进行批量提交
git add *.txt
现在该命令就只会提交以txt为后缀的文件了,当然也可以使用.来提交当前文件夹下的所有文件
git add .
- 提交文件
git commit -m "这是第一次提交"
- -m参数的含义是说明此次提交的主要信息,如果不加上m参数,git会默认打开vim编辑器,来输入提交的信息
- 查看提交状态
git status;
其中查看提交日志的命令是
git log
也可以加上参数查看简洁的提交日志
git log --oneline
其中有邮箱和名称,都是通过我们之前使用的config
命令来配置的。
git reset 回退版本
在日常开发的时候,我们通常都有进行版本回退的需求。就可以使用reset这个命令以下是它的每个参数含义
soft
参数的含义是:回退到某一次的提交位置,但是工作区和暂存区的内容是保存的
·hard·
参数的含义是:回到某一次的提交位置,但是工作区和暂存区的内容全部丢弃
mixed
参数介于sort和hard中间,工作区的内容保留但是暂存区的内容删除
soft测试
现在来测试soft参数的命令产生的作用
echo "file1" > file1.txt
echo "file2" > file2.txt
echo "file3" > file3.txt
现在创建了三个txt的文件并且使用了以下命令进行提交,分为三次
git add file1.txt
git commit -m "第一次提交"
git add file2.txt
git commit -m "第二次提交"
git add file3.txt
git commit -m "第三次提交"
查看提交结果
现在是已经有三次提交了,现在回退到第二次提交 7b6b999
git reset --soft 7b6b999
可以发现真的回退到了第二次提交这个位置,而且暂存区和工作区的文件都没有被丢弃
在提交的过程中出现了nothing to commit, working tree clean
问题,原因是:
暂存区没东西获或者东西都提交到版本库中的当前分支,且工作区
中的文件都被git跟踪了(都git add .)
解决方案:修改需要提交的文件中的任何一处(空格都行),然后重新add,commit。
hard测试
现在来测试hard参数会产生什么样的效果,分为了三个文件夹进行测试
echo "file1" > file1.txt
echo "file2" > file2.txt
echo "file3" > file3.txt
先创建三个txt文件,都进行依次提交
git add file1.txt
git commit -m "这是第一次提交"
git add file2.txt
git commit -m "这是第二次提交"
git add file3.txt
git commit -m "这是第三次提交"
进行回退操作,回退至d7a1e8a
测试发现,暂存区和工作区的文件的file3.txt
都被丢弃了。
hard参数的话,需要慎用!
mixed测试
现在来测试mixed参数,还是添加三个txt文件
echo "file1" > file1.txt
echo "file2" > file2.txt
echo "file3" > file3.txt
依次进行提交
git add file1.txt
git commit -m "这是第一次提交"
git add file2.txt
git commit -m "这是第二次提交"
git add file3.txt
git commit -m "这是第三次提交"
进行回退操作,回退至第二次提交:d02077e
git reset --mixed d02077e
查看暂存区和目录下的文件状态
可以发现工作区的文件还在,但是暂存区的不存在了,此时HEAD指针指向了第二次提交的位置。
git diff 查看差异
当需要查看工作区和暂存区的内容是否有差异时,需要使用以下命令查看差异
git diff
需要查看之前任意的几个版本的差异
git diff HEAD~X HEAD
也可直接使用来查看最后一个版本之前的差异
git diff HEAD
git diff HEAD~ HEAD
还可以在后面加上文件名,只查看该文件的差异
git diff HEAD~1 HEAD file2.txt
每次提交都有一个哈希值,也可以使用这个值来判断这两次提交之间的差异
git diff d7a1e8a 9a857be
使用git rm 删除文件
在使用git时,想删除本地工作区和暂存区的文件时,如果使用Linux的系统命令的话会比较麻烦
rm file1.txt
删除完查看状态,可以发现在工作区的文件已显示被删除了,还需要使用以下命令来更新,这里的提交是要告诉暂存区,在下一次提交的时候file1.txt已经被删除了!
git add .
git commit -m "delete file1.txt"
但是git给我们提供了 git rm 命令,可以让操作变得更简单
git rm file
测试一下、
git rm file2.txt
这次可以发现,暂存区和工作区都同步被删除了,这就是 git rm命令的作用。
.gitgnore忽略文件
这个文件的作用是,让我们忽略掉一些不应该加入到版本库中的文件,这样可以让我们的版本库变得更加干净和更小
这是我们需要忽略的文件,以免带来不必要的风险
现在向我们的本地仓库中添加.gitignore文件
echo "acess.log" > .gitignore
vim .gitignore
// 添加如下内容
access.log
*.log
添加到暂存区
git add .
提交到本地仓库
git commit -am "full submit"
查看效果
可以发现我们创建的日志文件并没有被提交到缓存区。
如果打算要忽略全部的日志文件,可以参考以下写法
*.log
# 忽略temp目录下的文件
temp/
关联本地仓库和远程仓库
之前演示的都是本地仓库进行的提交和各种测试,但是在实际的生产环境中往往都是需要连接到远程仓库进行提交和各种其他操作。但是先决条件是配置好了ssh密钥,平台可以选择github/gitee。其中gitee相当于国内的gihub,速度较快。
- 登录gitee设置ssh公钥(已省略,具体步骤可自行查阅)
网址:gitee
- clone远程仓库到本地,并且同步提交到远程的master分支
git remote -v 查看有没有远程仓库
git init .
git clone git@gitee.com:tmeermer/c-language-practice-code.git
//注:项目地址形式为:https://gitee.com/xxx/xxx.git或者 git@gitee.com:xxx/xxx.git
git add .
git commit -m "commit"
git push origin master
将本地的master分支推送到远程的master分支,如果不存在则会覆盖
分支管理
git中的分支可以看作一棵树上的枝干,最粗壮的是主分支,其他分支都是从分支。git中的主分支叫做master,通常主分支都是用来发布重大更新的,其他开发和测试的过程都是在开发分支上完成的。测试通过后才会合并进主分支。
- git如何查看当前分支?
git branch
- git如何创建分支?
git checkout dev
git status
- git中如何切换分支?
git checkout branch--name
- git中如何合并分支?
git memger branch--name
- git中如何删除无用的分支?
git branch -d branch--name
git解决合并冲突
现在来模拟两个两个分支修改了同一处的情况,这样会导致git发生合并冲突,从而合并失败
在以上操作中,我们在两个分支中提交了一样的内容,导致了冲突。
git init myproject
# 创建master分支
git checkout -b master
# 向文件内写入内容
echo "This is a line added in feature-branch." > example.txt
vim example.txt
```
"This is a line added in feature-branch."
测试
```
git add .
git commit -m "feat commit "
# 创建feat-branch 分支
git checkout -b feat-branch
vim example.txt
```
"This is a line added in feature-branch."
测试
```
git add .
git commit -m "feat commit "
git checkout master
git merge master
# 合并分支失败
git status
现在解决冲突需要修改
切换到master分支
git checkout master
vim example.txt
找到冲突的行修改的行进行修改
git add .
git commit -m "commit this a master"
切换到feat分支
git checkout feat-branch
修改冲突的位置
git add .
git commit -m "commit this a feat-branch"
最后合并冲突
git merge master
以上就是如何解决git分支冲突的方法。
回退和rebase
分支的合并可以使用git merge 命令来进行合并,并且还会保存所有的提交记录。git 还有另一种合并分支的方式就是使用rebase
git rebase feat-branch
rebase的翻译叫做变基,在git中我们可以这么理解
首先rebase只能在主分支上提交吗?其实不是的
它可以在任意分支上执行,如果是在main分支上执行
git rebase dev
则main上的提交记录会变基到dev分支的末尾
如果是在dev分支上提交
git rebase main
dev的两条提交记录都会变基到Main分支上。只是顺序不同罢了