git学习总结

前言:使用了这么久的git,一直懵懵懂懂,之前使用source tree进行无脑操作,如今不能依赖source tree,还是得踏踏实实学习一下git 命令行,以及git的工作原理。

声明:本文是根据网上大神教程的总结整合。
原文链接:
https://www.cnblogs.com/qdhxhz/p/9757390.html 大部分来源于本篇文档
http://www.softwhy.com/article-8499-1.html

一、git工作区域和工作流程

  • 工作区:本地存放代码的地方
  • 暂存区:临时存放改动的地方
  • 仓库区(版本库):提交代码存放的地方
  • 远程仓库:托管代码的服务器

二、git工作状态

1、什么是版本控制?

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

2、git如何对比两个版本差异?

GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。


此图描述git中文件的状态转换
  • 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


    看此图观察文件的状态

三、什么是HEAD?

1、很多指令都用到了HEAD,那HEAD是什么呢?

HEAD是指向正在工作中的本地分支的指针,通常情况下它可以与当前分支等同。

(1) 由此图可以看出HEAD指向master分支,master分支指向sha-1值为93dd8e(缩写)的commit提交



(2) .git目录中有一个为HEAD的文件,它记录着HEAD的内容,查看其中内容代码如下:



(3) 可以看到HEAD指向master分支,下面再来看一下refs/heads/master中的内容:master分支也只是一个存放40位sha-1值的文件而已,正是当前分支所指向commit的sha-1值。
image.png
2、什么是sha-1 ?
  • sha-1是一种密码学的哈希算法,此算法的特点是,如果被加密的内容相同,得出的sha-1值也是相同,如果被加密的值不同,那么得到的sha-1也绝对不会相同,于是可以利用sha-1值唯一标识指定内容。
  • 多数时候,我们看到的sha-1值并不是40位。

四、用户名和邮箱地址的作用

初次安装git,需要配置用户名和邮箱,作用是什么呢?

  • 用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变。
  • 每次commit都会用用户名和邮箱纪录。
  • github的contributions统计就是按邮箱来统计的。

五、.gitignore文件

作用:

  • 大量与项目无关的文件全推到远程仓库上,同步的时候会非常慢,且跟编辑器相关的一些配置推上去之后,别人更新也会受其影响。所以,我们使用该文件,对不必要的文件进行忽略,使其不被git追踪。
  • 一般情况下,.gitignore文件,在项目一开始创建的时候就创建,并推送到远程服务器上。这样大家初次同步项目的时候,就是用到该文件,避免以后,团队成员把与项目无关的文件,传到远程服务器上。
*.log           #表示忽略项目中所有以.log结尾的文件
123?.log        #表示忽略项目中所有以123加任意字符的文件
/error.log      #表示忽略项目中根目录中的error.log 这个文件
src/main/test/* #表示忽略/src/main/test/目录下的所有文件
**/java/        #匹配所有java目录下的所有文件
!/error.log     #表示在之前的匹配规则下,被命中的文件,可以使用!对前面的规则进行否定

六、git指令

1、新建代码库
# 在当前目录新建一个Git代码库
 git init
# 新建一个目录,将其初始化为Git代码库
 git init [project-name]
# 下载一个项目和它的整个代码历史
 git clone [url]
2、查看文件状态
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
3、工作区<-->暂存区
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
git add .
#当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用(⚠️)
git rm file_path
#当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 这个时候直接push那边这个文件就没有,如果push之前重新add那么还是会有。
git rm --cached file_path
#直接加文件名   从暂存区将文件恢复到工作区,如果工作区已经有该文件,则会选择覆盖
#加了【分支名】 +文件名  则表示从分支名为所写的分支名中拉取文件 并覆盖工作区里的文件
git checkout

4、工作区<-->资源库(版本库)
#将暂存区-->资源库(版本库)
git commit -m '该次提交说明'
#如果出现:将不必要的文件commit 或者 上次提交觉得是错的  或者 不想改变暂存区内容,只是想调整提交的信息
#移除不必要的添加到暂存区的文件
git reset HEAD 文件名
#去掉上一次的提交(会直接变成add之前状态)   
git reset HEAD^ 
#去掉上一次的提交(变成add之后,commit之前状态) 
git reset --soft  HEAD^
5、远程操作
# 取回远程仓库的变化,并与本地分支合并
git pull
# 上传本地指定分支到远程仓库
git push
6、分支操作
# 显示当前的Git配置
git config --list
# 编辑Git配置文件
git config -e [--global]
#初次commit之前,需要配置用户邮箱及用户名,使用以下命令:
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
#调出Git的帮助文档
git --help
#查看某个具体命令的帮助文档
git +命令 --help
#查看git的版本
git --version
git branch     # 列出所有本地分支
git branch -r  # 列出所有远程分支
# 新建一个分支,但依然停留在当前分支 这个时候本地已经有新分支了,但远程还没有,只有切换到新分支push后,远程就有了
git branch [branch-name]
git checkout -b [branch]     # 新建一个分支,并切换到该分支 
git branch -d [branch-name]  #删除分支 已合并的分支 *不能删除当前所在的分支
git branch -D dev            #强行删除分支  分支未合并
git push origin --delete [branch-name] # 删除远程分支
git merge [branch] #合并指定分支到当前分支
7、解决冲突
git diff HEAD  #比较当前工作区和上一次提交时文件的差异
git diff HEAD^ #比较上一次提交和上上次提交的文件差异
git diff 分支名 #查看当前分支跟指定的分支的差异
git diff 分支名1 分支名2  #查看两个指定分支(已提交的)的差异,分支2 跟分支1的差别
git diff --name-only --diff-filter=U #查看冲突文件 这个太有用啦

8、git版本回退
语法:git reset --hard 版本号 注意:回退只是在本地进行回退,远程仓库还是最新的,所以之后要先pull
git reset --hard HEAD^   #将 Git 回退到上一个版本 也就是上上次提交的时候,这样就可以撤销当次提交的信息
git reset --hard 4b2a0c8 #版本号(commit id)没必要写全,一般写前七位就够了,Git会自动去匹配。
9、其他常用命令
# 显示当前的Git配置
git config --list
# 编辑Git配置文件
git config -e [--global]
#初次commit之前,需要配置用户邮箱及用户名,使用以下命令:
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
#调出Git的帮助文档
git --help
#查看某个具体命令的帮助文档
git +命令 --help
#查看git的版本
git --version
git log -数字    #表示查看最近几次的提交
git log -p -2    #显示最近两次提交的不同点
git log --author #查看具体某个作者的提交
git log --online #输出简要的信息

七、命令行细节

1、git commit --amend 应用场景?
  • git commit -m 提交之后,发现-m的说明文字写的有问题,想要重新写一次,也就是想撤销上次的提交动作,重新提交一次这个时候可以用命令 git commit --amend;
  • commit 后,发现代码有问题,修改后提交到上一次的commit信息
  • git commit --amend 相当于上次提交错误的信息被覆盖了,gitk图形化界面上看不到上次提交的信息,git log上也看不到之前的信息
2、删除和合并分支如何操作?

场景:当前有两个分支:dev(团队开发分支)和 jizhi(我自己的分支)

  • 合并两个分支:
    Sept1:先切换到dev分支,站在dev分支上,拉下dev分支最新的代码
    Sept2:切换回自己的分支,站在自己的分支上,合并dev分支的代码,如果有冲突,解决冲突。
    Sept3:没有冲突,切换到dev分支,把自己的代码合并到dev分支,push到远程。
  • 删除分支:
    不能在当前分支删除当前分支,需要在别的分支上删除。

八、使用案例

完全引用大神案例 =>原文在这里

1、commit后,需要回到上一个版本,这个版本数据全部不要
2、你在master修改代码,却需要把修改后代码推送到dev远程分支上

你可能感兴趣的:(git学习总结)