git4个的区域
git 是版本控制工具
工作区
当前工作的地方个(git status 看到的文件是红色的)
缓存区
git add之后的是缓存区,(git status 看到的文件是绿色的)
本地仓库
commit 之后的区域
远程仓库
远程的仓库 比如码云,github
git的初始化:
git init . // 可以是点 或者文件名(点是当前文件夹的意思) 将当前目录变成git发的仓库 初始化 会产生.git的隐藏的文件
git add . 文件夹或者文件 . 是当前文件
当执行git add . 是出现以下警告是因为windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时出现提示
warning: LF will be replaced by CRLF in .idea/workspace.xml. The file will have its original line endings in your working directory
git commit -m '提交信息' 写的多的,尽量写的多点 git remote add origin https://url.git 将本地仓库和远程仓库做关联,第一次上传的时候需要写 git push origin master 将本地的master分支的文件,推到码云上(远程的仓库)
git的配置信息的查看和修改
git config -l 查看所有的配置信息 git config --global -l 查看邮箱用户名 git config --global --unset user.email 取消邮箱 git config -- global user.emali "邮箱" 设置邮箱 git config --global --unset user.name 取消用户名 git config --global user.name ''用户名"
git的提交记录
git log 查看提交记录(之前的提交记录) git reset --hard 哈希值(在git log中可以看到回退的地方)本地仓区到工作区 git reflog 看之前的回退后的之前的版本的提交日志(查看所有的提交记录) git reset --hard 哈希值(在git reflog中可以看到哈希值,黄色的) 本地仓区到工作区 git status 看看当前的状态, git diff 对比当前文件中的所有的文件 本地仓库和工作区的文件的的区别,只有在add 和commit的文件才能看出区别 git diff 文件名 (仅对比这个文件) 本地仓库和工作区的文件的的区别 git diff --cached 文件名(或者都不加,对比当前文件中的所有的文件) 本地仓库和缓存区的区别 git checkout 文件名 将工作区的内容回退到最近一次提交的地方 git reset HEAD 文件名 将缓存区的文件回退到工作区(不会覆盖工作区的内容)
补充:
-p 用来显示每次提交的内容差异
你也可以加上 -2
来仅显示最近两次提交
[Derek@git]git log -p -2 commit 86d801bbaa4cc560acc7c8f79a65cac85201f170 (HEAD -> master) Author: wangfeng7399 <wangfeng17399@163.com> Date: Tue Feb 19 18:48:48 2019 +0800 update diff --git a/README.md b/README.md index e69de29..a34691f 100644 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ +this is new line commit 88a09aa009af29e9a784d6dbb68589f70f1c51be Author: wangfeng7399 <wangfeng17399@163.com> Date: Tue Feb 19 18:48:04 2019 +0800 create diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29
另外一个常用的选项是 --pretty
。 这个选项可以指定使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如用 oneline
将每个提交放在一行显示,查看的提交数很大时非常有用。 另外还有 short
,full
和 fuller
可以用,展示的信息或多或少有些不同,请自己动手实践一下看看效果如何。
[Derek@git]$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
但最有意思的是 format,可以定制要显示的记录格式。 这样的输出对后期提取分析格外有用 — 因为你知道输出的格式不会随着 Git 的更新而发生改变:
git log --pretty=format
常用的选项 列出了常用的格式占位符写法及其代表的意义。
选项 | 说明 |
---|---|
%H |
提交对象(commit)的完整哈希字串 |
%h |
提交对象的简短哈希字串 |
%T |
树对象(tree)的完整哈希字串 |
%t |
树对象的简短哈希字串 |
%P |
父对象(parent)的完整哈希字串 |
%p |
父对象的简短哈希字串 |
%an |
作者(author)的名字 |
%ae |
作者的电子邮件地址 |
%ad |
作者修订日期(可以用 --date= 选项定制格式) |
%ar |
作者修订日期,按多久以前的方式显示 |
%cn |
提交者(committer)的名字 |
%ce |
提交者的电子邮件地址 |
%cd |
提交日期 |
%cr |
提交日期,按多久以前的方式显示 |
%s |
提交说明 |
git log
的常用选项
选项 | 说明 |
---|---|
-p |
按补丁格式显示每个更新之间的差异。 |
--stat |
显示每次更新的文件修改统计信息。 |
--shortstat |
只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only |
仅在提交信息后显示已修改的文件清单。 |
--name-status |
显示新增、修改、删除的文件清单。 |
--abbrev-commit |
仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 |
--relative-date |
使用较短的相对时间显示(比如,“2 weeks ago”)。 |
--graph |
显示 ASCII 图形表示的分支合并历史。 |
--pretty |
使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
在 限制 git log
输出的选项 中列出了常用的选项
选项 | 说明 |
---|---|
-(n) |
仅显示最近的 n 条提交 |
--since , --after |
仅显示指定时间之后的提交。 |
--until , --before |
仅显示指定时间之前的提交。 |
--author |
仅显示指定作者相关的提交。 |
--committer |
仅显示指定提交者相关的提交。 |
--grep |
仅显示含指定关键字的提交 |
-S |
仅显示添加或移除了某个关键字的提交 |
git的快照
快照:适用一个人开发的时候,快照不需要拍摄太多 git stash 快照 (在工作区中有修改才能做快照),做完快照,文件恢复到你最近提交的状态 git stash pop 恢复快照 = git stash apply + git stash drop git stash list 查看快照 $ git stash list stash@{0}: WIP on master: 768d893 33333 git stash apply 快照的版本号 恢复快照 git stash apply stash@{0} git stash drop 快照的版本号 删除快照 冲突: 快照的内容和做完快照后修改的文件内容的内容有冲突,会将快照的内容个修改的内容同 同一行修改,只能通过人工来决定保留什么 删除快照 git stash drop stash@{0}
快照使用的场景: 想把文件恢复最近一次提交的状态,保留从提交后的写的内容.
git的分支
切换分支前所有的代码都提交
分支:
git branch 查看分支 git brabch 分支名 新建分支 git checkout 分支名 切换分支 $ git checkout dev error: you need to resolve your current index first test: needs merge git checkout -b 分支名 (新建分支+切换分支) 合并分支 git merge name(分支名) 合并分支,在合并到分支上做合并,先切换到要合并的分支,合并分支的时候有可能代码有冲突,同事讨论怎么留代码 git brabch -d 分支名 删除分支
工作中,有多个分支
. master分支(线上的代码)
. dev 分支 (正在开发的代码,没上线的,测试用)
. review分支 (代码审核)
审核:
. 谁审核: 组长
. 审核什么: 逻辑 质量 PEP8规范
. 一个人一个分支
一般情况:
. 一般一个小功能,开发完成之后做一个合并
. 合并代码,大家都在
git 和github一样吗
git 做版本控制 linux的创始人
github 就是一个网站 全球最大的同性交友网站
码云
gitlab 私有化部署
git 无中心化
svn 中心化
区块链
因为没有权限
remote: Permission to 417685417/zdh.git denied to xiadongzhi1988. fatal: unable to access 'https://github.com/417685417/zdh.git/': The requested URL returned error: 403控制面板-凭据管理-windows凭据 把这个里面的都删掉
git push origin name 把本地分支上传到远程
git clone https://url.git 下载远程仓库的文件 克隆下来的代码只有master分支
git checkout -b dev origin/dev = git branch dev origin/dev + git checkout dev
git checkout -b dev origin/dev 这个命令可以切换分支,并以远程仓库的dev分支做母版创建一个dev分支’
以远程仓库的dev分支做母版创建一个dev分支’
git pull origin name 将远程仓库的文件拉取到本地
tag标签
标签的意义
-
bug修复以后
-
新增重要的功能 里程碑
git tag 查看标签 git show 查看标签的详细信息 git tag -a v1.0 -m "信息" 对当前位置打标签 git tag -a v1.0 -m "信息" hash值 对之前的位置打标签 git tag -d name 删除标签 git push origin --tags 将本地的tag推送到远程仓库 git push origin :refs/tags/name 删除远程的tags
忽略文件
上传文件的时候可以将一些你不想上传的文件忽略掉:
如果是是github上新建的项目,可以做如下操作:
会在你的项目中出现一个.gitignore 的文件,里面写的是你想忽略的内容
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
举个例子:
假设你在Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有Desktop.ini
文件,因此你需要忽略Windows自动生成的垃圾文件:
# Windows: Thumbs.db ehthumbs.db
然后,继续忽略Python编译产生的.pyc
、.pyo
、dist
等文件或目录
# Python: *.py[cod] *.so *.egg *.egg-info dist build
加上你自己定义的文件,最终得到一个完整的.gitignore
文件,内容如下:
# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
最后一步就是把.gitignore
也提交到Git,就完成了!当然检验.gitignore
的标准是git status
命令是不是说working directory clean
。
使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore
文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore
了。
有些时候,你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore
忽略了
$ git add App.class The following paths are ignored by one of your .gitignore files: App.class Use -f if you really want to add them.
如果你确实想添加该文件,可以用-f
强制添加到Git:
$ git add -f App.class
.gitignore忽略规则的优先级
在 .gitingore 文件中,每一行指定一个忽略规则,Git检查忽略规则的时候有多个来源,它的优先级如下(由高到低):
1)从命令行中读取可用的忽略规则
2)当前目录定义的规则
3)父级目录定义的规则,依次递推
4)$GIT_DIR/info/exclude 文件中定义的规则
5)core.excludesfile中定义的全局规则
.gitignore忽略规则的匹配语法
在 .gitignore 文件中,每一行的忽略规则的语法如下:
1)空格不匹配任意文件,可作为分隔符,可用反斜杠转义
2)以“#”开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义。
3)可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式。
4)以斜杠"/"开头表示目录;"/"结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件;"/"开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录。
5)以星号"*"通配多个字符,即匹配多个任意字符;使用两个星号"" 表示匹配任意中间目录,比如`a//z`可以匹配 a/z, a/b/z 或 a/b/c/z等。
6)以问号"?"通配单个字符,即匹配一个任意字符;
7)以方括号"[]"包含单个字符的匹配列表,即匹配任何一个列在方括号中的字符。比如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配。比如[0-9]表示匹配所有0到9的数字,[a-z]表示匹配任意的小写字母)。
8)以叹号"!"表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果文件的父目录已经被前面的规则排除掉了,那么对这个文件用"!"规则是不起作用的。也就是说"!"开头的模式表示否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用"!"也不会再次被包含。可以使用反斜杠进行转义。
需要谨记:git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;