git问题清单

1. 通过 41 个 问答方式快速了解学习 Git
2. 关于 Git 的 20 个面试题
3. 11个Git面试题目,你会多少
4. git flow

git配置全局用户名和密码
在这里插入图片描述
git config --global user.email " "

git最常用命令(忽略)

# 将工作区文件提到暂存区
git add 
# 将暂存区文件提交到本地仓库
git commit -m “description” 
# 拉取远程仓库的代码到本地仓库并与本地仓库代码合并
git pull origin master
# 将本地仓库的代码提交到远程仓库,并和远程仓库代码合并
git push origin master
# 查看状态
git status

.gitignore文件

# 这是注释
# 以斜杠“/”开头表示目录;
# 以星号“*”通配多个字符;
# 以问号“?”通配单个字符
# 以方括号“[]”包含单个字符的匹配列表;
# 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录【例如!/src 指定要将src目录下的所有文件添加到版本管理中】;
# 1)/catalogue-name/               过滤整个文件夹
# 2)*.zip                过滤所有.zip文件
# 3)/catalogue-name/do.c         过滤某个具体文件
# 忽略所有生成的 html文件,

# *.html

# 忽略所有.o和 .a文件.

# *.[oa]

git本地仓库文件的crud

# 从git中删除该文件,-f是强制执行操作的意思
# 【再commit提交就是将git仓库的文件进行删除了】
pull和push加上 -f就是强推
git rm hello.java -f 

git远程仓库的crud

git remote 远程地址的crud
补充:

# 查看远程仓库的信息
 git remote show origin
# 添加远程仓库
git remote add origin
# 添加远程仓库--带账号名/密码
git remote add origin [email protected]:djqiang(github帐号名)/gitdemo(项目名).git
# git删除远程分支
git remote remove origin master

git分支的crud

git 命令 创建分支并推送到远程仓库

git 一次解决多个冲突

在pull时拉取了target里面的多个.class,导致多个冲突,但这个冲突并不需要解决。所以直接git add . 再使用git commit -m “hi” 这样相当于标记了多个冲突已解决,再push 到远程仓库就可以了

git拉取远程仓库代码并合并提交历史

git pull origin master --allow-unrelated-histories

git配置的crud

# 查看设置
git config --list 
# 查看全局设置
git config --list --global
# 编辑本次仓库的配置
vi .git/config

# 编辑全局仓库的信息
 git config --global user.email "[email protected]"
 
 git config --global user.name "Your Name" 

git日志以及版本回退

git log --oneline
git reflog [参考日志:记录了移动指定版本需要的标号]

基于索引值进行版本回退
hard仓库,暂存区,工作区版本都回退
mixed,只回退仓库和暂存区

git reflog --hard [hash值] 前进或回退到任意版本的位置
git reset --hard HEAD~1 版本回退n步

git diff [HEAD] hello.java

git命令

git add 将工作区文件提到暂存区
git commit -m “description” 将暂存区文件提交到本地仓库
.git 用来存放仓库所有数据信息的
git remote show origin查看远程仓库的信息
git config --list 查看设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
touch hello.java
touch hi.java
git status就会看到如下状态
在这里插入图片描述

hello.java和hi.java在工作区,属于未追踪的文件(工作区的文件就是未追踪的文件–追踪:将文件交给git去管理)。
除了未追踪的文件外,当前没有可提交(commit)的文件(说明当前暂存区没有文件可提交)

git add hello.java
git status
在这里插入图片描述

工作区的文件是hi.java
暂存区的文件是hello.java/.gitignore

扫描二维码关注公众号,回复: 8732152 查看本文章

git commit hello.java -m “13:40 COMMIT hello.java”
git status
在这里插入图片描述

hello.java文件被提交到了仓库中

在这里插入图片描述

.git文件夹详解

# 这是注释
# 以斜杠“/”开头表示目录;
# 以星号“*”通配多个字符;
# 以问号“?”通配单个字符
# 以方括号“[]”包含单个字符的匹配列表;
# 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录【例如!/src 指定要将src目录下的所有文件添加到版本管理中】;
# 1)/catalogue-name/               过滤整个文件夹
# 2)*.zip                过滤所有.zip文件
# 3)/catalogue-name/do.c         过滤某个具体文件
# 忽略所有生成的 html文件,

# *.html

# 忽略所有.o和 .a文件.

# *.[oa]

修改文件
vim hello.java
git status
在这里插入图片描述
rm hi.java 从本地文件中删除该文件

git rm hello.java -f 从git中删除该文件,-f是强制执行操作的意思
【再commit提交就是将git仓库的文件进行删除了】

vi .git/config 编辑本仓库的配置信息
在这里插入图片描述
在这里插入图片描述
git log --oneline
在这里插入图片描述
git reflog [参考日志:记录了移动指定版本需要的标号]

基于索引值进行版本回退
hard仓库,暂存区,工作区版本都回退
mixed,只回退仓库和暂存区

git reflog --hard [hash值] 前进或回退到任意版本的位置
git reset --hard HEAD~1 版本回退n步
在这里插入图片描述

git help reset 查看文档

index file指的是暂存区
working tree指的是工作区
–soft不会碰暂存区和工作区,仅仅在本地库移动指针HEAD

–soft 仅仅在本地库移动 HEAD 指针

–mixed 在本地库移动 HEAD 指针  重置暂存区

–hard 在本地库移动 HEAD 指针  重置暂存区  重置工作区

git只会对任何一个版本增加

git以行为单位进行文件的管理。
git diff [文件名] 按行来进行文件的比较

git diff

 LF will be replaced by CRLF in hello.java
 需要提交的文件是在windows下生成的,windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时出现提示,解决办法:

 

git config --global core.autocrlf false

再执行git 提交
2)LF和CRLF区别

LF: Line Feed换行

feed v.喂养,供给;将(信息)输入     line feed直译是”将行输入”,再意译”换行”

CRLF: Carriage Return Line Feed 回车换行

Carriage n.马车,火车车厢;运输费用    在carriage return中,carriage译为“车”,return译为“回”

在过去的机械打字机上有个部件叫「字车」(Typewriter carriage),每打一个字符,字车前进一格,打完一行后,我们需要让字车回到起始位置,而“Carriage Return”键最早就是这个作用,因此被直接翻译为「回车」。尽管后来回车键的作用已经不止” 倒回字车”那么简单,但这个译名一直被保留下来。

在这里插入图片描述

git diff [HEAD]
在这里插入图片描述
在这里插入图片描述

git bash -v 查看所有分支
git bash 分支名 (创建分支----此时它会自动与当前分支同步)

git checkout [分支名] (切换到某一分支)
在这里插入图片描述
合并分支的时候,它会进行代码的合并操作。

svn冲突后会产生新的文件,git则不会
在这里插入图片描述
在这里插入图片描述
手动修改,保留主分支的内容(删除特殊符号,再删除不要的那个分支的代码即可)
在这里插入图片描述
合并的状态下不能带文件名,直接git commit -m “resolve conflict” 即标记冲突已解决

git原理
底层使用的是SHA-1算法来进行文本的一行一行的比对

git底层使用的是不可逆的SHA-1(hash算法的一种)
SHA1算法也是哈希算法的一种

哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下 几个共同点: ①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。 ②哈希算法确定,输入数据确定,输出数据能够保证不变 ③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大 ④哈希算法不可逆

md5是32位16进制数,每两位一字节,

svn是增量式的保存各个版本(即只保存每个版本变化的那部分。最后统一进行合并成最终的版本)

git是基于快照的方式去管理版本

git的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前 的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改, Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的 工作方式可以称之为快照流。
快照就是对实际仓库所存储的数据建立一个索引(参考map<key/value>),通过这个索引就会找到相应的文件,快照就是保存一个状态,是后悔药
在这里插入图片描述

每个文件都会hash,得到一个hash值

每次提交都会常见提交对象(包含每个文件hash后的hash值),所有文件的hash值构成一个树对象(里面包含文件和文件的hash值),树对象本身也有一个hash值。提交对象里包含树对象,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

比特币管理交易和比特币管理文件有很大的相似点。git的每个文件相当于比特币的每笔交易。它会两两作hash,这是一个区块,最后再合并成一个hash,每个区块要保存上下区块的hash
这些区块就通过hash构成了一个完整的链条

svn创建分支会把文件和目录都复制一遍,git创建一个分支就是新建一个指针指向原版本

版本管理就是一个链条,在这个链条的基础上,创建分支是创建新的指针,切换分支是切换指针的位置

跟新文件后,
可以直接git commit,省略git add,跳过暂存区,直接提交到本地库

在这里插入图片描述
在这里插入图片描述
切换到主分支进行合并

在这里插入图片描述
在这里插入图片描述
Saved working directory and index state WIP on master: 7d27bc2 本地仓库(保存的主目录和索引状态是:7d27bc2的分支的)---------stash是将当前状态存入栈上,可使用stash pop 恢复

昨天我提交了我写的接口。今天我正在写新的接口。接口正写一半(此时提交会有很多的bug)不巧的是老板这是打电话过来说我昨天的接口有问题,让现在马上修复了提交上去。此时就可以先git stash,把这个写了一半的代码先找个分支存起来(注意是git stash,而不是git add/commit之后再stash,不提交去拉取远程的代码就不会有冲突),然后在pull远程代码进行接口的修复提交。完成后再切换到stash的那个临时分支继续工作,写完再和主分支进行合并
创建分支,合并分支,删除分支,同步分支,暂存代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
git总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

merge vs rebase - Git的合并与变基

在feature分支上执行: git rebase master

这句命令的意思是:以master为基础,将feature分支上的修改增加到master分支上,并生成新的版本。(就是让你的分支提交历史不分叉,保证提交历史的干净性)
在这里插入图片描述

使用merge将newBranch合并到master的仓库网络图
在这里插入图片描述

在这里插入图片描述

我从newBranch中创建了oldBranch分支
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
git cherry-pick 选择性的合并某几次commit

发布了437 篇原创文章 · 获赞 82 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_41063141/article/details/103642039