git工作机制
git常用命令
Instead of配置
git config --global url.git@github.com:.insteadOf https://github.com/
将ssh协议替换为https协议
Git命令别名配置
git config --global alias.cin "commit --amend --no-edit"
用cin代替commit --no-edit
SSH免密配置
SSH可以通过公私钥的机制,将生成公私钥存放在服务端,从而实现免密访问
目前的Key的类型有四种,分别是dsa、rsa、ecdsa、ed25519默认使用的是rsa,由于一些安全问题,现在已经不推荐使用dsa和rsa了,优先推荐使用ed25519.
ssh-keygen -t ed25519 -C "your_email@example.com" 密钥默认存在~/.ssh/id_ed25519.pub
添加暂存区
git reset --files #撤销最后一次git add files,也可以用git reset撤销所有stage缓存
git checkout -- files #把文件从 stage 缓存复制到工作目录,用来丢弃本地修改
stash:保存现场
1.建议(规范):在功能未没有开发完毕前,不要commit
2.规定(必须)在没有commit之前,不能chekcout切换分支
如果还没有将某一个功能开发完毕,就要切换分支: 建议 1.保存现场 (临时保存,stash)2.切换
保存现场: git stash save “名字”
还原现场: git stash pop(将原来保存的删除,用于还原内容)
git stalish apply(还原内容,不删除原保存内容)
git stalish drop(删除stash内容)
查看现场: git stash list
git rm x:删除已提交的文件后,文件会被放到暂存区
彻底删除:git commit -m “删除的文件”
git reset restore --staged 文件名 #指定文件回退到最近一次执行push后的的状态,清空暂存区,同时回退工作区文件状态。
git restore 文件名 #
rm :删除后的文件不会放到暂存区
git rm等价于rm + git add
git checkout – <file_name> 丢弃工作区的修改,并用最近一次的commit内容还原到当前工作区
提交本地库
上一次的commit注释重写(重写提交说明)
git commit --amend -m '修正'
修改历史版本:
git commit --amend
//通过这个命令可以修改最近的一次commit信息,修改之后commit id会变
git rebase
//通过git rebase -i HEAD~3可以实现对最近三个commit的修改
//1.合并commit
//2.修改具体的commit message
//3,删除某个commit
git filter --branch
//该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作
git reflog 查看引用日志信息
git log 查看详细日志信息
删除commit:
GC:
可以删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的体积
Reflog:
reflog是用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期
git reflog expire --expire=now --all
指定时间:
git gc --prune=now 指定的是修剪多久之前的对象,默认是两周前
git gc --prune=now
版本穿梭
git reset --hard HEAD^ #前进一个版本
git reset --hard HEAD^^#前进两个版本
git tag v0.0.1//生成版本
git tag -a v0.0.2 -m "add feature 1"//创建版本并加备注信息
#推送标签
git push origin v1.0 v2.0
#推送所有标签
git push origin --tags
#拉取git指定标签
git fetch origin tag v4.0
#删除远程标签
git push origin :v1.0
分支
分支实际就是一个commit链,一条工作记录线
分支切换是让head直接指向切换到的分支
git branch -m <old branch name> <new branch name>
本地没有a分支,但本地却感知远端的a分支
检测:git remote prune origin --dry-run
git remote prune origin --dry-run
代码拉取
代码合并
git merge 被合并分支
git merge 被合并分支 --squash
目标分支的commit会合并成一个后再跟当前分支进行合并
不加–squash
加–squash
1.Fast-Forward
不会产生一个merge节点,合并后保持一个线性历史,如果target分支有了更新,则需要通过rebase操作更新source branch后才可以合入
2.Tree-Way Merge
三方合并,会产生一个新的merge节点
git diff
git rebase
冲突解决问题
vi ... add ...commit
git rebase 分支 --continue
git rebase 分支 --skip #rebase冲突时,用rebase对应分支的值
终止。还原成rebase之前的场景
git rebase --abort
建议:不要再master上不要直接rebase
团队协作
创建远程仓库
拉取: git pull 别名 分支
同一个Origin设置不同的Push和Fetch URL
git remote add origin git@github.com:git/git
git remote set-url --add --push origin git@github.com:MY_REPOSITY/git
git push -u origin dev #上传dev分支
git push origin dev:dev2 #本地dev推送到远端dev2
git push origin HEAD:dev #将当前分支推送到远端dev
使用git将代码上传到github
- 进入文件夹输入:git init 在本地创建git仓库
- 输入:git add . 将文件夹全部数据添加到暂存区
- 输入:git commit -m “注释内容” 将暂存区文件上传到git仓库
- 在github上创建仓库
5.输入:git remote add origin https://github.com/xxxxx/test.git,和远程仓库连接
- 输入 git branch -M main ,上传到 main 分支
- 输入 git push -u origin main 将本地项目推送到远程仓库
git冲突及其解决
git冲突的原因:
提交者的版本库<远程库
如何实现本地同步:git pull
问题及解决
kex_exchange_identification: Connection closed by remote host Connection closed by 20.205.243.166 po
ssh -T git@github.com -p 22
git的一些问题
merge和rebase区别
merge:
rebase:
merge合并时,会根据两个合并共同的父节点和两者的最新提交三者合并,形成一个最新的提交
rebase合并时,会把两个合并共同的父节点之后的节点嫁接到一起,然后接到共同节点之后
git merge 的优势:
1.日志非常详尽,可以帮助理解每次merge发生的方式和时间的完整历史
2.发现错误并解决它们很容易
git merge的缺点:
笨拙的日志/历史记录
git rebase 的优势:
1.日志是线性的
2.完成项目很容易
缺点:
无法追踪在目标分支上合并和commit的时间和方式
git cherry-pick
git cherry-pick [commit hash] 将其他分支上已提交的commit在当前分支再提交一次,产生新的commithash
git cherry-pick commit-idA…commit-idB 该指令是将从commit-idA开始到commit-idB之间的所有commit-id提交记录都合并过来
建议:
1.在共享分支上使用Git Merge
2.在私有分支上使用Git Rebase
git pull和git fetch
git fetch只会将远程仓库的代码更新到本地库,但是不会自动合并到工作目录
git pull会将远程仓库的代码更新到本地仓库,并且自动进行合并操作
git diff
git diff A…B 比较的是B的head跟A和B的公共节点的区别
git diff A…B 比较的是A的head跟B的head的不同
git diff比较的是工作区和暂存区的区别
git diff --cached sha1值 比较的是暂存区与对象区的区别
git blame 文件名 查看文件的所有提交以及每一行的作者
交互式rebase
git rebase -i
顺序调整:
squash指令:
drop指令: