GIT
- SSH 配置
- 初始化仓库
- GIT四个区域
- GIT的四种状态
- git命令
- 查看仓库状态
- 把一个文件从本地工作目录移交到暂存区
- 把暂存区的内容在回滚到工作目录
- git add 撤销操作 也就是将暂存的数据删掉
- git restore 放弃工作目录中的更改
- git restore --staged…取消存储
- git deleted状态怎么处理
- 删除工作目录文件c
- 同时把本地目录和暂存区里面内容删除
- 提交本地仓库
- 直接对工作目录和暂存区的文件重命名
- 查看文件改变了什么内容 进行对比
- 当前历史git log 历史操作所有id 每次的commit的id git reflog
- 改变了工作目录 暂存区和本地仓库没有改变
- 现在是工作目录和暂存区改变一致了 但是错误 我用本地仓库回退,覆盖暂存区和工作目录
- 我要回退某一次 commit
- 分支
- 删除分支
- 基本操作
- 全部删除,你改的也没有了
SSH 配置
git安装克隆提示Cloninginto项目
git clone git@gitee.com:yyds123/ll.git
创建用户
git config --global user.name “名称”
git config --global user.email “邮箱”
git 生成秘钥 并连接 码云
1, ssh-keygen -t rsa -C “xxxxx@xxxxx.com” 注册码云的邮箱
按三次回车,不用添加任何东西
2, cat ~/.ssh/id_rsa.pub
查看秘钥 并复制 到 码云上
3, ssh -T git@gitee.com
出现 (Welcome to Git@OSC, yourname!) 证明链接成功
初始化仓库
GIT四个区域
最底层工作目录
第三层面、第一次暂存文件,是会在.git的目录下生产index文件
第二层面 本地仓库
第一层面 远程仓库
如果代码提交到本地仓库,在对文件做任何的增删改查操作都会对
操作进行记录
GIT的四种状态
未跟踪文件:只是存在工作目录(区域) Untracked files:
未被修改:已经存在本地仓库了,但是我没有对文件修改(都在工作,暂存区,本地仓库都有一份)
被修改状态:在本地仓库进行了修改
由于git是分布式版本控制工具,存在着本地仓库和远程仓库,所以我们在本地工作副本进行的编辑,要先提交到本地仓库,再从本地仓库推送到远程仓库。
git命令
查看仓库状态
git status
在master分支下 ,初始化commit ,没有任何事情commit
把一个文件从本地工作目录移交到暂存区
使文件状态从Untracked 变成Staged状态
git add a
把所有文件提交到暂存区
暂存区是在.index
把暂存区的内容在回滚到工作目录
git rm --cached c
git add 撤销操作 也就是将暂存的数据删掉
git reset HEAD projectApp/vhall_backend_frame/app/vendor/vhall-component/room/src/services/InavService.php
git restore 放弃工作目录中的更改
git restore projectApp/vhall_backend_frame/app/vendor/vhall-component/room/src/services/InavService.php
git restore --staged…取消存储
git restore --staged vendor/vhall-component/roo.room.sql
git deleted状态怎么处理
一种是 git rm --cached "文件路径",不删除物理文件,仅将该文件从缓存中删除;
一种是 git rm --f "文件路径",不仅将该文件从缓存中删除,还会将物理文件删除(不会回收到垃圾桶)
然后再推送到仓库
删除工作目录文件c
同时把本地目录和暂存区里面内容删除
删除c文件
git rm -f b
提交本地仓库
git commit -m "commit a"
直接对工作目录和暂存区的文件重命名
b.txt 改成 a
git mv b.txt a
查看文件改变了什么内容 进行对比
对比的是本地目录和暂存区
git diff a
本地目录提交到 暂存区
这样本地目录提交到 暂存区是一致的了文件内容
暂存区和本地仓库进行对比
git diff --cached a
当前历史git log 历史操作所有id 每次的commit的id git reflog
git log
git log --oneline --decorate
改变了工作目录 暂存区和本地仓库没有改变
用暂存去覆盖了工作目录
git checkout -- a
现在是工作目录和暂存区改变一致了 但是错误 我用本地仓库回退,覆盖暂存区和工作目录
说明 git diff a 说吗本地目录不一致了
我要回退某一次 commit
回退哪个commit 的id
git reset --hard (回退哪个commit 的id)
每一次的commit 的id 的历史记录
git reflog
分支
分支就是指向快照的一个指针
分支总是落在最后一个提交 HEAD(当前分支)
git log --online --decorate
创建分支
git branch testing
git branch
查看分支
查看本地分支 git branch
查看远程分支 git branch -r
查看本地和远程分支 git branch -a
清理本地无效分支(远程已删除本地没删除的分支): git fetch -p
如果分支太多,还可以用此命令进行分支模糊查找: git branch | grep 'branchName'
删除分支
删除本地分支 git branch -d 本地分支名
删除本地已合并的分支: git branch -d [branchname]
某些情况下可以用 git branch -D [branchName] (使用时应注意是否已合并)
删除远程分支 git push origin --delete 远程分支名[branchname]
推送空分支到远程(删除远程分支另一种实现)git push origin :远程分支名
提交数据
合并 谁合并谁
把testing命令合并的master上 ,当前是master
git merge testing
基本操作
设置用户名和邮箱
$ git config --global user.name "用户名"
$ git config --global user.email "邮箱"
- 其中,–global 是全局设置,如果想对特定项目使用不同配置,可取消该参数
- git config 还可以设置其他选项,因为平时不怎么用,所以详细可以参考 git config --help
查看配置
$ git config --list
# 查看 Git 的某一项配置
$ git config user.name
创建 SSH Key
$ ssh-keygen -t rsa -C "邮箱"
# 然后会在用户主目录下,发现 .ssh 目录,其中包含 id_rsa 和 id_rsa.pub 两个文件
# id_rsa.pub 是 SSH Key 公钥,将其添加到 github 的 SSH keys 中,就可
创建本地仓库,进行基本源代码管理
# 克隆
$ git clone 仓库地址
# 远程仓库
$ git remote
# 分支
$ git branch 分支名 // 创建
$ git checkout 分支名 // 切换
# 合并
$ git merge 分支名
# 拉取更新
$ git fetch 主机名 分支名 // 不合并
$ git pull 主机名 分支名 // 合并
# 推送
$ git push 主机名 分支名
# 打标签
$ git tag -a 版本号 -m "版本说明"
忽略 SSL 证书错误
通过 HTTPS 访问 Git 远程仓库时,如果服务器的 SSL 证书未经过第三方机构签署,那么 Git 就会阻止这一操作
$ env GIT_SSL_NO_VERIFY=true git clone 仓库地址
$ cd 仓库名称
$ git config http.sslVerify "false"
- 使用 env 命令保证了忽略证书错误只应用于此次克隆
储藏
当有未提交的修改,执行 切换分支 或 拉取更新 需要仓库状态保持 clean 的一些操作时,可以使用 git stash 将目前的修改临时储藏起来
# 储藏
$ git stash
# 查看储藏
$ git stash list
# 应用最近储藏并删除
$ git stash pop
# 应用指定储藏不删除
$ git stash apply [储藏名]
# 移除储藏
$ git stash drop 储藏名
撤消操作
对于 工作区 和 暂存区 的修改,我们不能保证上次操作是完美的,git 就是这么强大,提供了很多 反悔 的操作
# 丢弃暂存区的文件,放回工作区
$ git reset HEAD 文件
# 丢弃工作区的修改
$ git checkout -- 文件
- 修改后没添加到暂存区,则撤销到 git commit 时的状态
- 修改后添加到暂存区,则撤销到 git add 时的状态
# 覆盖上次提交
$ git commit --amend [-m "本次提交说明"]
版本回退
# 回退到之前的某次提交
$ git reset --hard commit_id
- HEAD 指向当前版本
- git log 可以查看提交历史,以便确定要回退到哪个版本
- git reflog 可以查看命令历史,以便确定要回到未来的哪个版本
# 撤销一个已经提交
$ git revert commit_id
- 并没有从项目历史中移除这个 commit, 而是生成一个新的 commit
分支
Git 有很多优点,其中 分支使用方便 就是很显著的一条,创建仓库的时候,master 是默认的分支,一般,我们会创建其他的分支在上面进行开发,完后再将它们合并到主分支上来
# 创建开发分支
$ git branch dev
# 创建并切换到开发分支
$ git checkout -b dev
# 切换回主分支
$ git checkout master
# 快速检出上一个分支
$ git checkout -
# 查看所有分支
$ git branch -a
# 查看合并到当前分支的分支列表
$ git branch --merged
# 查看还没合并到当前分支的分支列表
$ git branch --no-merged
# 删掉临时分支
$ git branch -d fix
# 将开发分支推送到远程仓库
$ git push origin dev
# 重命名分支
$ git branch -m dev develop
# 删除远程分支
- $ git push origin --delete 分支名
- $ git push origin :分支名
标签
软件要发布一个新的版本的时候,我们通常给它打个 tag
# 打标签
$ git tag [-a] 标签名 [-m 附注信息 某次提交的id]
# 推送标签到远程仓库
$ git push origin 标签名
$ git push origin --tags // 推送所有标签
# 删除本地标签
$ git tag -d 标签名
# 删除远程标签
$ git push origin --delete 标签名
$ git push origin :refs/tags/标签名
提交
# 花式查看提交
$ git log --pretty=oneline // 只显示一行
$ git log --abbrev-commit // 只显示 SHA-1 的前几个字符
$ git log --graph // 显示 ASCII 图形表示的分支合并历史
$ git log --relative-date // 使用较短的相对时间显示
$ git log --name-only // 仅在提交信息后显示已修改的文件清单
$ git log -n // 显示最近的 n 条提交
$ git log --author=fengshangwuqi // 仅显示指定作者相关的提交
$ git log --grep // 仅显示含指定关键字的提交
# 没有任何改动的提交
git commit -m "a no chnage commit" --allow-empty
主要用于一下情形:
- 标记新的工作或一个新功能的开始
- 记录对项目的跟代码无关的改动
- 跟使用你仓库的其他人交流
- 作为仓库的第一次提交,因为第一次提交后不能被 rebase
git pull 与 git pull --rebase 的区别
$ git pull = git fetch + git merge
$ git pull --rebase = git fetch + git rebase
git merge 与 git rebase 的区别
# 相同点
整合的最终结果所指向的快照是一样的
# 不同点
## 提交历史不同
- merge 会生成一个新的 commit 节点,提交历史忠实地记录了实际发生过什么
- rebase 不会产生额外的 commit 节点,提交历史反映了项目过程中发生了什么
## 冲突处理策略不同
- merge 遇见冲突后会直接停止,等待手动解决冲突并重新提交后,才能再次 merge
- rebase 遇见冲突后会暂停当前操作,开发者可以选择手动解决冲突,然后 git rebase --continue 继续,或 --skip 跳过,或 --abort 停止
# 注意事项
## 推荐 git merge 结合 --no-ff 一起使用
- git merge 默认是 fast forward(快速合并),适用于分支 B 从分支 A 从 checkout 出来后,分支 A 没有 commit
- 如果分支 B 被 checkout 出来后,分支 A 也有修改,那么就没法快速前进合并,会额外建立一个 merge commit,对分支 A 和分支 B 做一个合并操作,即 --no-ff,它的好处是保持了分支的结构
#1/ 工作区代码(文件被修改了,但未执行git add操作)
git checkout <filename>
#或
git checkout .
#2/ 文件执行了git add到缓存区,并未commit提交
# 取消暂存
git reset HEAD <filename>
# 撤销修改
git checkout <filename>
#3/ git commit到本地,没有git push到远端
git reset --soft HEAD~1 撤回最近一次的commit(撤销commit,不撤销git add)
git reset --mixed HEAD~1 撤回最近一次的commit(撤销commit,撤销git add)
git reset --hard HEAD~1 撤回最近一次的commit(撤销commit,撤销git add,还原改动的代码)
#4/ git push提交到远端
#删除最后一次远程提交
#使用revert 会有新的 commit 记录
git revert HEAD
git push origin master
#使用reset 不会产生新的 commit 记录
git reset --hard HEAD^
git push origin master -f
#回滚某次提交
git log
git revert <commit_id>
#其他补充,冲突解决
#merge 冲突
git checkout test
git merge b1
git status
git add .
git commit -m 'conflict fixed'
#本地提交冲突
git stash #暂存
git stash list #查看暂存列表
git pull #拉取
git stash pop stash@{0} #还原暂存的内容
git status #冲突文件
vim readme.txt #解决冲突<<< === >>>
git stash drop stash@{0} #删除暂存
git stash clear #清理所以暂存
git add readme.txt
git commit -m "conflict fixed"
全部删除,你改的也没有了
git fetch --all && git reset --hard origin/分之名字
git 拉取远程代码
Git拉取远程代码
git 从远程拉取代码、推代码的步骤
Git 分支合并代码
Git恢复之前版本的两种方法reset、revert(图文详解)
git所划分成几个区域,各区域的作用以及各区域之间的联系
真的解决了我的问题!!!git配置ssh时报错:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
git教程