GIT
ssh初始化仓库GIT四个区域GIT的四种状态git命令查看仓库状态把一个文件从本地工作目录移交到暂存区把暂存区的内容在回滚到工作目录git add 撤销操作 也就是将暂存的数据删掉git restore 放弃工作目录中的更改git restore --staged…取消存储git deleted状态怎么处理删除工作目录文件c同时把本地目录和暂存区里面内容删除提交本地仓库直接对工作目录和暂存区的文件重命名查看文件改变了什么内容 进行对比当前历史git log 历史操作所有id 每次的commit的id git reflog改变了工作目录 暂存区和本地仓库没有改变现在是工作目录和暂存区改变一致了 但是错误 我用本地仓库回退,覆盖暂存区和工作目录我要回退某一次 commit
分支创建分支查看分支
删除分支提交数据合并 谁合并谁
基本操作设置用户名和邮箱查看配置创建 SSH Key创建本地仓库,进行基本源代码管理忽略 SSL 证书错误储藏撤消操作版本回退分支标签提交git pull 与 git pull --rebase 的区别git merge 与 git rebase 的区别
ssh
ls
~/.ssh
初始化仓库
GIT四个区域
最底层工作目录
第三层面、第一次暂存文件,是会在.git的目录下生产index文件
第二层面 本地仓库
第一层面 远程仓库
如果代码提交到本地仓库,在对文件做任何的增删改查操作都会对 操作进行记录
GIT的四种状态
未跟踪文件:只是存在工作目录(区域) Untracked files:
未被修改:已经存在本地仓库了,但是我没有对文件修改(都在工作,暂存区,本地仓库都有一份)
被修改状态:在本地仓库进行了修改
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
$ git log
--graph
$ git log
--relative
-date
$ git log
--name
-only
$ git log
-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 拉取远程代码 Git拉取远程代码 git 从远程拉取代码、推代码的步骤 Git 分支合并代码 Git恢复之前版本的两种方法reset、revert(图文详解) git所划分成几个区域,各区域的作用以及各区域之间的联系 真的解决了我的问题!!!git配置ssh时报错:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).