#yyds干货盘点# 超全面Git知识总结!

Posted 程序员大彬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# 超全面Git知识总结!相关的知识,希望对你有一定的参考价值。


Git 简介

Git 是一个开源的分布式版本控制系统,可以有效、快速的进行项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git工作流程

Git工作流程如下:

  • 从远程仓库中克隆资源作为本地仓库;
  • 在本地仓库中进行代码修改;
  • 在提交本地仓库前先将代码提交到暂存区;
  • 提交修改,提交到本地仓库。本地仓库中保存修改的所有历史版本;
  • 在需要和团队成员共享代码时,可以将修改的代码push到远程仓库。

Git 的工作流程图如下:

#yyds干货盘点#

图片来源:

https://blog.csdn.net/ThinkWon/article/details/94346816

存储原理

Git 在保存项目状态时,它主要对全部文件制作一个快照并保存这个快照的索引,如果文件没有被修改,Git 不会重新存储这个文件,而是只保留一个链接指向之前存储的文件。

Git 快照

快照就是将旧文件所占的空间保留下来,并且保存一个引用,而新文件中会继续使用与旧文件内容相同部分的磁盘空间,不同部分则写入新的磁盘空间。

三种状态

Git 的三种状态:已修改(modified)、已暂存(staged)和已提交(committed)。已修改表示修改了文件,但还没保存到数据库。已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。已提交表示数据已经安全的保存到本地数据库。
基本的 Git 工作流程:在工作目录修改文件;暂存文件,将文件快照放到暂存区域;提交更新到本地库。暂存区保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。

#yyds干货盘点#

图片来源:

​https://img2018.cnblogs.com/blog/1252910/201907/1252910-20190726163829113-2056815874.png​

#yyds干货盘点#

配置

设置用户名和邮箱地址:

git config --global user.name "dabin"
git config --global user.email xxx@xxx.com

如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
查看配置信息:

git config --list

查看某一项配置:

git config user.name

获取帮助

获取 config 命令的手册:

git help config

Git 基础

获取 Git 仓库

在现有目录中初始化仓库:进入项目目录并输入​​git init​
克隆现有的仓库:

git clone https://github.com/...

文件状态

查看文件状态:​​git status​

#yyds干货盘点#

图片来源:

​https://img2018.cnblogs.com/blog/1252910/201907/1252910-20190726163854195-886320537.png​

状态说明:

新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记,如下图,​​MM Rakefile​​出现两个M,其中出现在靠左边的 M 表示该文件被修改了并放入了暂存区,出现在右边的 M 表示该文件被修改了但是还没放入暂存区。

$ git status -s
M README # 右边的 M 表示该文件被修改了但是还没放入暂存区
MM Rakefile # 左边的 M 表示该文件被修改了并放入了暂存区;右边的 M 表示该文件被修改了但是还没放入暂存区
A lib/git.rb # A表示新添加到暂存区中的文件
?? LICENSE.txt # ??表示新添加的未跟踪文件

配置别名

有些人可能经常敲错命令,通过配置别名可以简化命令:
通过命令 ​​git config --global alias.st status ​​ 将 命令​​git status​​ 简化为 ​​git st​​:

$ git config --global alias.st status

$ git st
On branch master
Your branch is up to date with origin/master.

nothing to commit, working tree clean

工作区

查看工作区修改:​​git diff​

$ git diff
diff --git a/md/leetcode刷题笔记.md b/md/leetcode刷题笔记.md
deleted file mode 100644
index 63a7c90..0000000
--- a/md/leetcode刷题笔记.md
+++ /dev/null

撤销工作区修改:

git checkout -- file_name

此命令会撤销工作区的修改,不可恢复,不会撤销暂存区修改。
撤销修改还可以使用 restore 命令(git2.23版本引入)。

git restore --worktree demo.txt //撤销文件工作区的修改
git restore --staged demo.txt //撤销暂存区的修改,将文件状态恢复到未add之前
git restore -s HEAD~1 demo.txt //将当前工作区切换到上个 commit 版本,-s相当于--source
git restore -s hadn12 demo.txt //将当前工作区切换到指定 commit id 的版本

暂存区

通过​​git add filename​​ 将工作区的文件放到暂存区。

git add README.md

查看暂存区修改:

$ git diff --staged
diff --git a/README.md b/README.md
index ecd6c7a..653f001 100644
--- a/README.md
+++ b/README.md

可以看到暂存区中有 README.md 文件,说明README.md文件被放到了暂存区。
撤销暂存区修改使用unstage:

git reset HEAD file_name

将文件修改移出暂存区,放到工作区。

git reset 加上 --hard 选项会导致工作目录中所有修改丢失。

提交

任何未提交的修改丢失后很可能不可恢复。提交命令:

git commit -m "add readme.md"

​git commit -a -m "xxx"​​ 相当于​​git add​​和​​git commit -m "xxx"​​,将 tracked 的文件直接提交。untracked 的文件无法使用此命令直接提交,需先执行 git add 命令,再执行 git commit。

单独执行​​git commit​​,不带上-m参数,会进入 vim 编辑器界面:

#yyds干货盘点#

此时应该这么操作:

  1. 按下字母键​​i​​或​​a​​或​​o​​,进入到可编辑状态
  2. 输入commit信息之后,按下​​Esc​​键就可退出编辑状态,回到一般模式
  3. 输入:wq (保存退出)或 :wq!(强行退出,不保存)

修改commit信息

如果提交后发现漏掉某些文件或者提交信息写错,使用​​git commit --amend​​重新提交:

git commit -m initial commit
git add forgotten_file
git commit --amend

查看提交历史

​git log​​列出所有提交的更新。

​git log -p -2​​,-p 用来显示每次提交的内容差异,-2表示显示最近两次提交。

​git log --stat​​每次提交下面都会列出所有被修改的文件、有多少文件被修改和哪些行被修改等。

​git log --pretty=oneline​​将每个提交放在一行显示。

​git log --pretty=format:"%h %s" --graph​​ format 表示格式化输出,%h 提交对象的简短哈希串,%s 是提交说明,--graph 可以更形象的展示分支、合并历史。

$ git log --pretty=format:"%h %s" --graph
* 75f8b36 update
* cd72e4f 删除查询性能优化
* 6bddc95 mysql总结整理
* f8ace0e java常见关键字总结
* 0c4efeb 删除android
* 4844de5 mysql执行计划
* 635c140 redis分布式锁
* 7b65bc3 update
* e563eec update
* 67e1cf7 update readme
* 218f353 调整目录结构
* 9428314 整理Java基础内容

​git log --since=2.weeks​​ 按照时间作限制。

版本回退

版本回退使用​​git reset​​命令。

git reset --hard commit_id
git reset --hard HEAD^ # 回退所有内容到上一个版本
git reset --hard HEAD^^ # 回退所有内容到上上一个版本
git reset --hard HEAD~100 # 回退到之前第100个版本
git reset HEAD readme.txt # 把暂存区的修改撤销掉(unstage), 重新放到工作区

stash

将未提交的修改保存起来。用于后续恢复当前工作目录。

git stash
git stash pop stash@id //恢复后删除
git stash apply stash@id //恢复后不删除,需手动删除
git stage drop
git stash list //查看stash 列表
git stash show -p stash@0 //查看stash具体内容,-p查看diff,stash@0可以省略

rm和mv

​git rm readme.md​​:文件未被修改过,从暂存区移除文件,然后提交,相当于 ​​rm readme.md​​和​​git add .​​。如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changes not staged for commit”。

​git rm --cached README.md​​:让文件保留在工作区,但是不想让 Git 继续跟踪。可以使用 --cached 选项来实现。文件被修改过,还没有放进暂存区,则必须要用强制删除选项 -f ,以防止误删还没有添加到暂存区的数据,这样的数据不能被 Git 恢复。
git rm 支持正则表达式:

git rm log/\\*.log

对文件改名:

git mv README.md README

相当于运行一下三条命令:

mv README.md README
git rm README.md
git add README

忽略文件

.gitignore 只能忽略未跟踪状态的文件。
如果远程仓库已经有了logs文件夹,使用以下命令可以删除文件的跟踪状态。

git rm --cached logs/xx.log

此时本地工作区修改还在。然后更新 .gitignore 文件,最后使用下面的命令删除远程仓库对应的文件。

git add . & git commit -m "xx" & git push

skip-worktree和assume-unchanged

skip-worktree:

  • skip-worktree 可以实现修改本地文件不会被提交,但又可以拉取最新更改的需求。适用于一些不经常变动,但是必须本地化设置的文件。
git update-index --skip-worktree [file]
  • 取消skip-worktree:
git update-index --no-skip-worktree [file]
  • 查看 skip-worktree 列表:
git ls-files -v | grep ^S\\ 

assume-unchanged:

  • 该命令只是假设文件没有变动,使用reset时,会将文件修改回去。当远程仓库相应的文件被修改时,pull更新之后,--assume-unchanged 会被清除。
git update-index --assume-unchanged [file]
  • 取消忽略:
git update-index --no-assume-unchanged file/path
  • 查看忽略了哪些文件:
git ls-files -v | grep ^h\\ 

远程仓库

远程仓库是指托管在网络中的项目版本库。

查看远程仓库

查看远程仓库地址:

$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)

添加远程仓库

运行 ​​git remote add <shortname> <url>​​ 添加远程 Git 仓库,同时指定一个简写名称。

git remote add pb https://github.com/paulboone/ticgit

如上命令,可以在命令行中使用字符串 pb 来代替整个 URL。如​​git fetch pb​​。
如果使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 origin 为默认简写名称。
取消关联Git仓库:

git remote remove origin

如果想要给origin设置两个远程仓库地址(git add会报错),可以使用​​git remote set-url --add origin url​​来设置。

$ git remote add origin  xxx.git
fatal: remote origin already exists.

$ git remote set-url --add origin xxx.git
#success

修改远程仓库

修改远程仓库地址:

git remote set-url origin git@github.com:Tyson0314/Blog.git

pull 和 fetch

从远程仓库获取数据:

git fetch [remote-name]

git fetch 命令将数据拉取到本地仓库,但它并不会自动合并到本地分支,必须手动将其合并本地分支。
git pull 通常会从远程仓库拉取数据并自动尝试合并到当前所在的分支。

git pull = git fetch + git merge FETCH_HEAD 
git pull --rebase = git fetch + git rebase FETCH_HEAD

本地仓库上传git服务器

git init # 将目录变成本地仓库
git add .
git commit -m xxx # 提交到本地仓库
git remote add origin https://github.com/Tyson0314/profile # 关联远程仓库
git branch --set-upstream-to=origin/master master # 本地分支关联远程分支
git pull origin master MYSQL数据库超全知识总结#yyds干货盘点#

#yyds干货盘点# 前端模块化的全面总结

常用Git命令总结#yyds干货盘点#

#yyds干货盘点#我对Redis持久化 做了一个全面的总结

⭐万字长篇超详细的图解Tomcat中间件方方面面储备知识⭐ #yyds干货盘点#

#yyds干货盘点#MySQL主从复制原理分析与实践