我在工作中使用Git的心得以及常见问题的解决
1. 如何将本地项目上传到远程仓库
场景:搭建项目之初,一般都是先在本地写个demo,一步一步逐渐完善,但是往往经常写的告一段落之后需要借助git工具进行留存,这个时候就需要将本地项目上传到远程仓库。
实现:
- 现在github建立一个空的仓库,然后找到仓库地址
- 在本地项目的根目录下执行如下命令
# 初始化git
git init
# 提交项目全部内容
git add .
# 将提交的内容暂存
git commit -m "创建项目"
# 关键步骤,将本地仓库和远程仓库关联
git remote add origin https://gitee.com/vue3-series/vue3-todolist.git :
# 推送到远程master分支
git push -u origin master
2. 如何追加当前的修改到最新一次commit
场景:一个功能开发完成之后,发现自己有遗漏的提交,或者每次迭代只想提交一个commit,那么就可以把本次迭代的全部内容分次提交到一起,就可以通过这种方式,这样可以节省最后整理以及合并提交记录的时间,
实现:
- 一个功能的开发,首次提交就把commit提交记录写好,这样后面的每次提交都可以合并到这次commit,当然后面想改commit的描述也是随时可以改的
- 在项目中执行如下命令
git add .
# 会通过 core.editor 指定的编辑器进行编辑
git commit --amend
# 不会进入编辑器,直接进行提交
git commit --amend --no-edit
# 强制推送到上一次commit
git push --force
3. 如何合并远程分支上的最近几个commit
注意⚠️:只适用于合并最近几个提交记录,不是最近几次的不适用
场景:每个迭代开发过程中,通常一个功能会有一个commit,但是最后发版时,需要对本次迭代的全部内容进行合并,那么就可以通过这个方法对远程的提交进行合并
方法如下:
git reset commit_id
git add .
git commit -am "feature:1.1.3"
git push --force
commit_id
为合并的所有的提交的前一个commit的值,假如提交顺序为: feat: 功能3 feat: 功能2 feat: 功能1 feat:1.1.2 需要合并feat: 功能3,feat: 功能2,feat: 功能1为一个commit(feature:1.1.3),那么commit_id为feat:1.1.2所在的commit_id
4. git pull时遇到冲突
场景:本地开发到一半,需要获取同事在本地远程分支上的提交,执行git pull时遇到冲突提醒
解决方法:
# 1.先将本地修改存储起来
git stash
# 2. 再次拉取代码
git pull
# 3.还原暂存的内容
git stash pop stash@{0}
# 4.解决冲突 然后正常提交
git add .
git commit -m 'xxx'
git push
5. 将开发分支上的commit通过cherry-pick的方式合并到master分支
场景:多人协同开发时,为了保证提交记录的时间线始终为一条线,那么可以采用cherry-pick
的方式合并代码
基本用法(cherry-pick一个提交)
feature分支的代码应用到master分支,先切换到master
分支
git checkout master
git cherry-pick <commitHash>
commitHash
为feature分支需要应用到master分支的commit-id
如果是feature分支最新一次的提交也可以使用
# feature为具体的分支名称
git cherry-pick feature
cherry-pick多个提交
git cherry-pick <HashA> <HashB>
如果是多个连续的提交可以使用
git cherry-pick A..B
注意⚠️:提交 A 必须早于提交 B;使用上面的命令,提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的语法。
git cherry-pick A^..B
代码冲突
解决冲突之后,执行
git add .
<!--git cherry-pick --continue-->
git -c core.editor=true cherry-pick --continue
之后会进入到vim编辑器页面,,要跳过编辑提交消息,您只需将编辑器设置为不执行任何操作并报告成功的命令.类Unix系统的理想选择就是true命令.因此使用下面的命令替换git cherry-pick --continue
:
git -c core.editor=true cherry-pick --continue
冲突解决完毕,推送到远程分支:
git push
tip1:push之前,cherry-pick之后,放弃合并,回到操作前的样子
git cherry-pick --abort
tip2:push之前,cherry-pick之后,放弃合并,不回到操作前的样子
git cherry-pick --quit
6. 下载github的项目到本地遇到权限问题
场景:执行下载命令时报错:
Please make sure you have the correct access rights and the repository exists.
解决方案:
- 执行ssh-keygen -t rsa -C "你的git账号"
然后一直回车,直到出现下图:
- 执行:cat ~/.ssh/id_rsa.pub
会出现一堆码:
ssh-rsa AAAAB3NzaC1tP1ui5bnQVG1lyVLGXOCjtlLsjzIUfcY0LkhSZbIwibEqpR80QLfk8c1t10wNlg6Ok33AayWM63KcHuiCBgEKYgfhEBdDXYl6NVhkWn0wp93UrD1/orKzYIyeZutXnmxtorPdCpVcmbQ4XZ8WBR0OOnGBUm3XmX9XROwMTqBZ/ssZuyeDPmENEKdP8+tOhhpdhLiHtOeHAxf9uUX1D5ZUc4Wi0Ai0QB46eRRgcpOLetA36jJwpSKmjv3XOYVP7+yaUJ27HGCKq1TEdXtgnBK0mY2g+nj6nHoJmZS6jRGJN1Pi1 [xxx@163.com](mailto:macuiling1995@163.com)
然后将这个码保存到个人的github上的SSH keys
然后再执行clone命令,即可成功
7. 使用rebase删除远程分支的某个提交记录
场景:
假如现有的提交记录是:
feat: 功能3
feat: 功能2
test: 测试代码
feat: 功能1
想要删除《test:测试代码》这条记录的话,使用如下命令:
# commit_id为要删除的记录的前一个记录的commit_id
git rebase -i commit_id
# 然后会进入一个vim编辑器模式,点击键盘上的字母i进入编辑模式 把要删除的commit记录前面的pick改为d
# 然后点击esc退出编辑,输入:wq进行保存
# 查看当前的日志是否为想要的日志
git log
# 强推到远程
git push -f
转载自:https://juejin.cn/post/7205111603464732730