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 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 一次解决多个冲突
在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文件被提交到了仓库中
# 这是注释
# 以斜杠“/”开头表示目录;
# 以星号“*”通配多个字符;
# 以问号“?”通配单个字符
# 以方括号“[]”包含单个字符的匹配列表;
# 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录【例如!/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总结
在feature分支上执行: git rebase master
这句命令的意思是:以master为基础,将feature分支上的修改增加到master分支上,并生成新的版本。(就是让你的分支提交历史不分叉,保证提交历史的干净性)
使用merge将newBranch合并到master的仓库网络图
我从newBranch中创建了oldBranch分支
git cherry-pick 选择性的合并某几次commit