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 "you@example.com"
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 "you@example.com"
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远程分支上
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 安装Git Git的下载地址:Git官网下载地址 Git本地仓库和命令 配置用户 下载完Git后,右键会有一个Gi...
    TokyoZ阅读 4,494评论 1 7
  • Git for windows 本文只是自己的一些学习总结,方便自己查看,如果对您阅读不适,抱歉!!! 常用命令(...
    Lxs_597阅读 332评论 0 0
  • (参照莫烦教程morvanzhou.github.io/tutorials/others/git/) 1.wind...
    忆江南_1569阅读 244评论 0 1
  • Part 1 Git基本介绍 版本控制基本功能 所有的版本控制系统,只能跟踪文本文件的改动,比如TXT文件,网页,...
    妖国阅读 293评论 0 0
  • 一 git简介 1. 概念 git 是一种分布式版本管理工具。 git 支持的平台: 2. git与svn的区别 ...
    lishy009阅读 237评论 1 1