Table of Contents
- github
- 合并add和commit
- 版本穿梭(回退commit)
- troubshot
- git的三种状态
- 恢复
- git log
- 标莶
- git stash
- git blame a.txt
- 起别名: git config –global alias.ch checkout
- git gc 压缩
- git裸库(没有工作区的工作仓库,存在于服务端)
- submodule(子模块)
- subtree
github
-
git remove add origin https://github.com/*/*.git
为网站取一个origin别名- ssh格式: [email protected]:用户名/仓库名.git
-
git remove show 查看所有远程仓库的别名
-
git remove show origin 查看别名origin的信息
- HEAD branch: main
远程仓库就是本地的main
- HEAD branch: main
-
git push -u origin master
本地的master分支与远程做关联,仅初次使用,以后只用git push就行了- -u: –set-upstream
-
本地感知远程分支
origin/master -
生成ssh密钥(ssh keys)
- ssh-keygen
- ~/.ssh
- knownhosts显示已登录的网站
- 远程增加ssh的公钥时 1. 删除回车符 2.可写权限
-
将本地push到远程失败
error: failed to push some refs to ’[email protected]:*/*.git’
- 原因: 远程的提交链更前(有人已经推送过),导致本地分支与远程分支冲突
- 先拉取下来: fetch/pull,再提交解决冲突
- 这时git status会显示现分支比远程分支多两次提交
第二个人冲突代码的提交,第二个人解决冲突的提交- 这里假设有两个人pull了相同的远程库,第一个人提交了自已的代码到远程库,此时远程库和第一个人一致,第二个人提交了自已的代码到本地库,这里是一次本地的提交,此时若提交到远程库会冲突,因此只能先pull/fetchAndmerge,并解决冲突,这里有一次本地的提交,就有了两次本地的提交,若再push,会再第二个人的本地提交前插入第一个人的提交,若第一个人再pull,就为fast forward(与远程库在同一条提交链上,且远程在前)
- 总结:
- 第二个人push完成后的远程log为: 第一个人的提交->第二个人的提交->解决冲突的提交
- 这时git status会显示现分支比远程分支多两次提交
- git fetch
将远程拉到本地的origin/master(本地感知远程分支)- 此时git status会显示落后几个提交点
- fetch拉取到origin/master,merge本地分支和origin/master
-
推送新分支dev,test
- git push -u origin dev
- git push –set-upstream origin test
- git push origin dev:dev #本地:远程
-
拉取新分支dev,test
- 二步
- git pull 会拉取远程分支到本地感知远程分支
- 关联本地分支和本地感知远程分支
- git checkout -b dev origin/dev
创建并切换到dev,并关联到origin/dev - git chechout [-b test] –track origin/test
省略本地分支名: git checkout –track origin/test
- git checkout -b dev origin/dev
- 一步
- git pull origin dev:dev
- git fetch origin master:refs/removes/origin/master #远程分支为master,本地分支为helloworld
- 二步
-
删除远程分支
- git push origin :test
- git push origin –delete dev
- 删除本地没有的追踪分支
- 检测: git remove prune origin –dry-run
- git remove prune origin
-
本地:远程
-
git push origin src:dest
HEAD分支是当前分支,git push origin HEAD:dest- .git/head文件是指向refs的当前分支
把本地src分支推送到远程的dest分支
-
git push origin :dest
把本地src分支推送到远程的空(删除分支) -
推送标签
- git push origin v3.0:v3.0
- git push origin refs/tags/v3.0:refs/tags/v3.0
-
-
清理无效的本地感知远程分支(本地没有)
prune – delete all stale tracking branches for a remote
- 检测: git remove prune origin –dry-run
- git remove prune origin
合并add和commit
git commit -am ’注释’
不能用于第一次提交
版本穿梭(回退commit)
- git reset –hard HEAD^^ 回退二次
- git reset –hard HEAD~n 回退n次
- git reset –hard sha1 通过sha1值回退
- git checkout sha1
- 进入游离状态(detached HEAD)
- 修改必须提交
- 创建分支的好时机
git chechout mybranch sha1
为已提交的commit创建一个分支,sha1是已提交的commit,即mybranch指向sha1
troubshot
-
未commit之前,不能切换分支
Please commit your changes or stash them before you switch branches.
Aborting- 在功能未开发完毕前,不要commit,别人拿到代码运行不了
- 临时保存现场再切换分支
git stash- 恢复现场
- 查看:git stash list
- git stash pop
- git stash apply(还原现场但不删除现场)
- 恢复现场
-
重写最后一次提交说明
git commit –amend -m -
分支fast forward
- 如果一个分支靠前(dev),另一个落后(master).则台果不冲突,master可以通过merge直接追赶上dev,称为fast forward
- 跳过的中间commit,仍然会保存
- 两个分支归于一点(丢失分支信息)
- 没有分支信息
- 禁止fast forward: git merge –no-ff(no fast forward)
- 两个分支,不会归于一点(主动合并的分支 会前进一步)
- git log –graph 查看分支信息
- 分支信息完整(不丢失分支信息)
- 两个分支,不会归于一点(主动合并的分支 会前进一步)
- 禁止fast forward: git merge –no-ff(no fast forward)
-
合并分支冲突(git merge dev)
两个分支不在同一提交链上- git add 告知git,冲突已解决
- master在merge时,如果遇到冲突,并解决,则解决冲突会进行2次提交: 1次是最终提交,1次是将对方dev的提交信息也拿来了
-
回退之后,git log就不见了
查看所有操作记录: git reflog -
查看最近一次提交
git log -1 -
分支重命名
git branch -m master main -
git diff
- 不加文件名: 比较暂存区和工作区的差异
- 加sha1值: 比较对象区和工作区的差异
- git diff head: 比较对象区和最新一次工作区的差异
- git diff –cached sha1: 比较对象区和暂存区的差异
- git diff –cached head: 比较最新对象区和暂存区的差异
-
切换到本地感知远程分支
- git chechout origin/master
- 游离分支(detached HAED),一般建议,不要修改,是一个只读分支
- 换完之后,它不会用分支名,只是一个提交点(sha1)
- 杳看: cat .git/head
- 查看本地及远程分支
- git branch -a[v]
- 绿色本地,红色远程(代表只读)
- -av: 查看本地及远程分支各自的提交点
- git branch -a[v]
- git chechout origin/master
-
git status出现远程信息
Your branch is ahead of ’origin/master’ by 1 commit
- git branch -av: 查看名自的commit
- git push将本地更新到远程
-
clone仓库不需要git init
远程自带.git- git clone [email protected]:用户名/仓库名.git
- 默认将仓库名作为项目名
- 指定项目名
git clone [email protected]:用户名/仓库名.git 项目名 - 通过git clone下的项目第一次提交可以直接git push
- 之前的git push -u已经被纳入版本库
- git clone [email protected]:用户名/仓库名.git
-
查看本地是否过期(是否是最新)
-
git remote show origin
master pushes to master (local out of date)
- local out of data说明本地过期
- 吏新本地: git pull
-
-
冲突可能原因
-
git merge 分支名(两个本地分支的冲突)
不同分支merge,同时分支不在同一个提交链 -
git pull(本地分支和远程分支的冲突) pull = fetch + merge
当本地分支与远程分支不在同一个提交链(之前被push,导致远程分支前进了提交链) -
git stash pop/apply(两个被modified文件的冲突)
git stash会回到未修改状态(上一个提交点)
当修改过文件(git status有modified)
-
前三种都需要解决冲突
- 修改冲突文件并add
- commit已经解决冲突的文件
-
-
查看远程sha1值
- git log origin/master
路径是.git/refs,origin代表远程仓库地址 - git log remotes/origin/master
- git log refs/remotes/origin/master
- .git/refs: 本地分支和远程分支的sha1值,还有标签(tags)
- git log origin/master
git的三种状态
- modified
- staged
- commited
恢复
- 放弃暂存区staged -> modified
- git reset HEAD
- git restore –staged
- git reset HEAD
- 放弃工作区modified -> commited
- git checkout –
git checkout – * 放弃全部工作区 - git checkout
- git restore
- git checkout –
git log
- -num: 查看n个log
- –pretty=oneline
- –graph
查看图形日志
标莶
在 git show v1.0 两种标签指向都是commit的sha1值
- 查询
- git tag -l ’v2.0’
- 模糊查询: git tag -l ’v*’
- 创建
- 简单标签: git tag v1.0
.git/refs/tags/v1.0中是commit的sha1值 - 带注释标签: git tag -a v2.0 -m “”
.git/refs/tags/v2.0保存的是一个对象,包含了当前的commit的sha1值
- 简单标签: git tag v1.0
- 推送标签
- git push origin v1.0
- 同时推送多个: git push origin v1.0 v2.0 v3.0
- 全部推送: git push origin –tags
- 完整写法
git push origin v3.0:v3.0
git push origin refs/tags/v3.0:refs/tags/v3.0
- 拉取
- git pull
git push不同推送标签,git pull可以拉取标签
如果远端新增标签,则pull可以将新增的标签拉去到本地;如果远程是删除标签,则pull无法感知,只能git tag -d手动删除 - git fetch origin tag v4.0
- git pull
- 删除远程标签
git push origin :v6.0 - 删除本地标签
git tag -d
git stash
git stash会回到未修改状态(上一个提交点)
- 查看: git stash list
- 恢复: git stash pop
- 恢复: git stash apply(还原现场但不删除现场)
- 指定恢复现场: git stash apply stash@{0}
- 起名: git stash save ’mystash’
- 删除: git stash drop stash@{0}
git blame a.txt
查看a.txt的所有提交的sha1值,以及每一行的作者
起别名: git config –global alias.ch checkout
不同于alias名令
git gc 压缩
- 压缩并删除.git/refs到.git/packed-refs
- 压缩之前 .git/objects 是保存的是commit植的两个前缀,压缩之后,多了一个pack文件夹,里面的文件是二进制
- 带注释标签在packed-refs中占两行,commit值在第二行(以开头)
git裸库(没有工作区的工作仓库,存在于服务端)
git init –bare
submodule(子模块)
应用场景: 在一个仓库中,引用另一个仓库的代码
- git submodule add [email protected]:*/B.git
在A库引用B库(A文件夹套B文件夹)- 通过远端联系
- 同步子械块
- 如果B库修改,需要在B文件夹 git pull 后,才能同步了模块,推到远程还需要add commit
- git submodule foreach git pull
遍历pull所有子模块并,推到远程还需要add commit
- git clone
~
–recurisive
克隆带子模块的版本库 - 删除子模块
- git rm –cached B
删除暂存区 - rm -rf B
- rm -rf .gitmodules
- git add .
- git commit -m ’删除B子模块’
- git push
- git rm –cached B
subtree
- 起别名: git remote add subtree-origin [email protected]:*/*.git
- git subtree add -P subtree subtree-origin master
增加名为subtree的子工程,它的仓库地址是subtree-origin,它的master分支 - 同步: git subtree pull -P subtree subtree-origin master