git笔记-简单入门

git笔记

git是一个分布式版本控制系统,它的优点有哪些呢?分为以下几个部分

  1. 与集中式的版本控制系统比起来,不用担心单点故障问题,只需要互相同步一下进度即可。
  2. 支持离线编辑,每一个人都有一个完整的版本库。
  3. 跨平台支持
  4. 性能高效

安装和初始化配置

git的安装方式有方式

  1. 带GUI的git,带有图形化界面
  2. 命令行安装

个人比较推荐命令行安装的方式,我采用的是centos 7.x的系统

  • 添加 CentOS/RHEL 7 存储库
bash 复制代码
sudo yum -y install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm
  • yum安装git
bash 复制代码
sudo yum install git -y

初始化git

  1. 配置用户名
bash 复制代码
git config --global user.email '你的邮箱'
  1. 配置邮箱
bash 复制代码
git config --global user.email '你的密码'

创建仓库

在git中,创建仓库有两种方式

  1. 使用git init
bash 复制代码
git init
  1. git init reop name
bash 复制代码
git init name
  1. 从gitee/github已有的仓库,创建仓库(使用clone的方式)
bash 复制代码
git clone git@gitee.com:tmeermer/hnys.git

工作区和文件状态

git有三个工作区域分为工作区,暂存区,本地仓库。现在来简单解释一下这三个区域

工作区:当前的工作目录,所有的操作都在这里进行

暂存区:工作区完成工作后,将产生的文件推送到暂存区,临时保存这些文件。可以理解为一个临时的杂货铺

本地仓库:这里存放最终的成品,也就是仓库。

添加和提交文件

  1. 添加文件
bash 复制代码
git add filename

添加时后面需要添加文件名,也可使用通配符进行批量提交

bash 复制代码
git  add *.txt 

现在该命令就只会提交以txt为后缀的文件了,当然也可以使用.来提交当前文件夹下的所有文件

bash 复制代码
git add .
  1. 提交文件
bash 复制代码
git commit -m "这是第一次提交"
  • -m参数的含义是说明此次提交的主要信息,如果不加上m参数,git会默认打开vim编辑器,来输入提交的信息
  1. 查看提交状态
bash 复制代码
git status;

其中查看提交日志的命令是

bash 复制代码
git log 

也可以加上参数查看简洁的提交日志

bash 复制代码
git log --oneline

其中有邮箱和名称,都是通过我们之前使用的config命令来配置的。

git reset 回退版本

在日常开发的时候,我们通常都有进行版本回退的需求。就可以使用reset这个命令以下是它的每个参数含义

soft参数的含义是:回退到某一次的提交位置,但是工作区和暂存区的内容是保存的

·hard·参数的含义是:回到某一次的提交位置,但是工作区和暂存区的内容全部丢弃

mixed参数介于sort和hard中间,工作区的内容保留但是暂存区的内容删除

soft测试

现在来测试soft参数的命令产生的作用

bash 复制代码
echo "file1" > file1.txt
echo "file2" > file2.txt
echo "file3" > file3.txt

现在创建了三个txt的文件并且使用了以下命令进行提交,分为三次

bash 复制代码
git add file1.txt
git commit -m "第一次提交"
git add file2.txt
git commit -m "第二次提交"
git add file3.txt
git commit -m "第三次提交"

查看提交结果

现在是已经有三次提交了,现在回退到第二次提交 7b6b999

bash 复制代码
git reset --soft 7b6b999

可以发现真的回退到了第二次提交这个位置,而且暂存区和工作区的文件都没有被丢弃

在提交的过程中出现了nothing to commit, working tree clean问题,原因是:

暂存区没东西获或者东西都提交到版本库中的当前分支,且工作区

中的文件都被git跟踪了(都git add .

解决方案:修改需要提交的文件中的任何一处(空格都行),然后重新add,commit。

hard测试

现在来测试hard参数会产生什么样的效果,分为了三个文件夹进行测试

bash 复制代码
echo "file1" > file1.txt
echo "file2" > file2.txt
echo "file3" > file3.txt

先创建三个txt文件,都进行依次提交

bash 复制代码
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文件

bash 复制代码
echo "file1" > file1.txt
echo "file2" > file2.txt
echo "file3" > file3.txt

依次进行提交

bash 复制代码
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 查看差异

当需要查看工作区和暂存区的内容是否有差异时,需要使用以下命令查看差异

bash 复制代码
git diff

需要查看之前任意的几个版本的差异

bash 复制代码
git diff HEAD~X HEAD

也可直接使用来查看最后一个版本之前的差异

bash 复制代码
git diff HEAD
git diff HEAD~ HEAD

还可以在后面加上文件名,只查看该文件的差异

bash 复制代码
git diff HEAD~1 HEAD file2.txt

每次提交都有一个哈希值,也可以使用这个值来判断这两次提交之间的差异

bash 复制代码
git diff d7a1e8a 9a857be

使用git rm 删除文件

在使用git时,想删除本地工作区和暂存区的文件时,如果使用Linux的系统命令的话会比较麻烦

bash 复制代码
rm file1.txt

删除完查看状态,可以发现在工作区的文件已显示被删除了,还需要使用以下命令来更新,这里的提交是要告诉暂存区,在下一次提交的时候file1.txt已经被删除了!

bash 复制代码
git add .
git commit -m "delete file1.txt"

但是git给我们提供了 git rm 命令,可以让操作变得更简单

bash 复制代码
git rm file

测试一下、

bash 复制代码
git rm file2.txt

这次可以发现,暂存区和工作区都同步被删除了,这就是 git rm命令的作用。

.gitgnore忽略文件

这个文件的作用是,让我们忽略掉一些不应该加入到版本库中的文件,这样可以让我们的版本库变得更加干净和更小

这是我们需要忽略的文件,以免带来不必要的风险

现在向我们的本地仓库中添加.gitignore文件

bash 复制代码
echo "acess.log" > .gitignore
bash 复制代码
vim .gitignore
// 添加如下内容
access.log
*.log

添加到暂存区

bash 复制代码
git add .

提交到本地仓库

bash 复制代码
git commit -am "full submit"

查看效果

可以发现我们创建的日志文件并没有被提交到缓存区。

如果打算要忽略全部的日志文件,可以参考以下写法

bash 复制代码
*.log
# 忽略temp目录下的文件
temp/

关联本地仓库和远程仓库

之前演示的都是本地仓库进行的提交和各种测试,但是在实际的生产环境中往往都是需要连接到远程仓库进行提交和各种其他操作。但是先决条件是配置好了ssh密钥,平台可以选择github/gitee。其中gitee相当于国内的gihub,速度较快。

  • 登录gitee设置ssh公钥(已省略,具体步骤可自行查阅)

网址:gitee

  • clone远程仓库到本地,并且同步提交到远程的master分支
bash 复制代码
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,通常主分支都是用来发布重大更新的,其他开发和测试的过程都是在开发分支上完成的。测试通过后才会合并进主分支。

  1. git如何查看当前分支?
bash 复制代码
git branch
  1. git如何创建分支?
bash 复制代码
git checkout dev
git status
  1. git中如何切换分支?
bash 复制代码
git checkout branch--name
  1. git中如何合并分支?
bash 复制代码
git memger branch--name
  1. git中如何删除无用的分支?
bash 复制代码
git branch -d branch--name

git解决合并冲突

现在来模拟两个两个分支修改了同一处的情况,这样会导致git发生合并冲突,从而合并失败

在以上操作中,我们在两个分支中提交了一样的内容,导致了冲突。

bash 复制代码
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 

现在解决冲突需要修改

bash 复制代码
切换到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

bash 复制代码
git rebase feat-branch

rebase的翻译叫做变基,在git中我们可以这么理解

首先rebase只能在主分支上提交吗?其实不是的

它可以在任意分支上执行,如果是在main分支上执行

bash 复制代码
git rebase dev

则main上的提交记录会变基到dev分支的末尾

如果是在dev分支上提交

bash 复制代码
git rebase main

dev的两条提交记录都会变基到Main分支上。只是顺序不同罢了

相关推荐
圆圆滚滚小企鹅。2 分钟前
刷题记录 HOT100回溯算法-6:79. 单词搜索
笔记·python·算法·leetcode
大邳草民13 分钟前
计算机网络的基础设备
笔记·计算机网络
霸王蟹1 小时前
文本复制兼容方案最佳实现落地。
前端·javascript·vue.js·笔记·学习
dal118网工任子仪2 小时前
86.(2)攻防世界 WEB PHP2
笔记·学习
圆圆滚滚小企鹅。3 小时前
刷题记录 贪心算法-3:376. 摆动序列
笔记·python·算法·leetcode·贪心算法
霸王蟹4 小时前
http和https的区别?
网络·笔记·网络协议·学习·http·https
画船听雨眠aa4 小时前
gitlab云服务器配置
服务器·git·elasticsearch·gitlab
s_little_monster5 小时前
【Linux】从硬件到软件了解进程
linux·运维·服务器·经验分享·笔记·学习·学习方法
songyuc6 小时前
线性代数复习笔记
笔记