【git实际应用填坑解决】
工作中git填坑之路,有时候用小乌龟,有时候也用git命令。
整理哈git相关内容。 时间不充足,就懒的把每个知识点抽出来细分了。
- git 如何管理多个项目仓库?
1. git subtree 实现管理多仓库
A、 B 、 lib 都是仓库,其他lib是公共模块,在A,B中都有使用
优点: 提交方便,直接在当前项目目录就可修改公共模块lib并提交
在项目A 和 B 中创建公共模块Common
git subtree add --prefix=src/Common https.xxx.git master
在项目中A 修改公共模块Common后提交
git subtree push --prefix=src/Common https.xxx.git master
在项目B中 拉取公共模块Common,此时也同步了commit修改的内容
git subtree pull --prefix=src/Common https.xxx.git master
操作例子:
2. git submodule 实现管理多仓库
缺点: submodule添加子模块lib,如修改了lib ,提交子模块必须在子模块lib的项目如lib中才行。
git submodule add http://xxx.xxx/lib.git
git submodule add http://xxx.xxx/module.git
3. git subtree 与 git submodule区别?
subtree与submodule的作用是一样的,但是subtree出现得比submodule晚,它的出现是为了弥补submodule存在的问题:
submodule不能在父版本库
(project1,project2)中修改子版本库的代码,只能在子版本库(lib)中修改,是单向的;
submodule没有直接删除子版本库的功能;
- git版本回退
注意!!!: 当然操作需慎重,避免万劫不复...
注意!!!: head^^ 或 head~2 形式可指定回退多少
git reset 回退版本,移除不要的版本。 head指针往前移
结果:直接删除指定的commit
hard回退
- 版本回退后,
暂存区和工作区一致
。 再推到远程。覆盖度之前不要的版本。并且不保留记录
。
git reset --hard head
soft回退
-
版本回退后,
暂存区依旧有原来的commit,实际工作区的内容依旧存在
。 -
实质:就是删除最近(某个)的写错或者不想要的commit信息,但不影响工作区
-
场景:删除最近的commit信息
git reset --soft head
git revert 撤销某次提交【回滚提交】,新建一个提交。 head指针往后移 。
结果:用一次新的commit来回滚之前的commit,在创建一个新的commit
优点:会保留完整的历史提交记录
git revert --hard head
git revert --soft head
- 将feature分支的某个文件f.txt合并到master分支上。
git checkout master
git checkout --patch feature f.txt
- 修改历史提交代码的commit信息
1. git 如何修改最近一次的commit信息
-
git commit --amend
-
进入vim操作界面之后, 点击字母键 i 然后进入INSERT模式,然后对commit信息进行修改,然后ESC 然后 :wq 保存退出
-
然后执行 git log 会发现最近的一次commit信息被修改成功了
2. git 修改已经提交到git远程仓库的commit信息
-
首先回撤到上一次提交,不修改本次提交的改动
git reset --soft HEAD~1
-
重新做一次提交
git commit -m “重新提交commit信息” -
强推本地分支到远程仓库 git push -f origin master
-
查看远程仓库中的是否已经修改commit信息
git恢复 stash丢失的内容
找回丢失的STASH~
如果执行git stash pop之后将恢复的内容被手动删掉了(比如手贱点了vsCode的Discart All Changes,刚恢复的所有东西都消失了~~)
由于git stash pop恢复的同时把stash内容也删掉, 所以stash list不再会有之前的stash。
但是git stash pop出的change是可以找回的,因为每次git stash都会生成一个新的commit,只要知道commitID, 通过git stash apply commitID 就可以应用之前的stash
寻找commitID有两种方法:
1、git stash pop 最后会打印出pop掉的commitid值,若这个记录还存在直接使用即可。
2、git fsck --lost-found, 会打印出所有dangling commit,慢慢找就行了。一般是最近的几个
- git取消合并
git merge --abort
-git打标签tag
git tag
git tag -a Test1.0 -m "发布Test1.0正式版本"
git tag
git push origin Test1.0
- git 本地仓库 与 远程仓库关联遇到报错
git remote add origin https://gitee.com/xxx.git
git branch --set-upstream-to=origin/master
git push -u origin master
1.遇到报错 failed to push some refs to 'https://gitee.com/xxx.git'
根本原因:本地 和 远程 内容不匹配 或 权限不足问题
解决:最好保证代码一定是最新的。
git push -f -u origin master(master为指定分支)
2. git pull时报错fatal: refusing to merge unrelated histories
解决:
git pull origin master --allow-unrelated-histoories