No more than code.
Git 指令整理
echo "# 项目名" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin http:~~~ // 链接到本地仓库
git push -u origin master // 将本地库推送到 master 分支
git push origin master --force // 强制提交
| git clone 指定用户名密码
git clone http://username:password@remote
例用户名是abc@qq.com,密码是abc123456,git地址为git@xxx.com/www.git
执行git clone http://abc@qq.com:abc123456@git.xxx.com/www.git
执行报错:
fatal: unable to access 'http://abc@qq.com:abc123456@git.xxx.com/www.git/':
Couldn't resolve host 'qq.com:abc123456@git.xxx.com'
报错原因是因为用户名包含了@符号,所以需求要把@转码一下
<?php $userame=’abc@qq.com’; echo urlencode($userame); ?> abc%40qq.com
@符号转码后变成了%40,所以只需在clone时将username变为abc%40qq.com即可,再次执行就ok
| 解决报错
fatal: unable to access '***.git/': Failed to connect to 127.0.0.1 port 8087: Connection refused
问题原因:git 可能被代理,查看是否使用代理 git config --global http.proxy
解决:取消代理 git config --global --unset http.proxy
Failed to connect to github.com port 443: Operation timed out
$ git config –global user.name “username” $ git config –global user.email “email”
| 分支开发规范
-
master 分支
master 为主分支,也是用于部署生产环境的分支,确保 master 分支稳定性 master 分支一般由 develop 以及 hotfix 分支合并,任何时间都不能直接修改代码
-
develop 分支
develop 为开发分支,始终保持最新完成以及 bug 修复后的代码 一般开发的新功能时,feature 分支都是基于 develop 分支下创建的
-
feature 分支
开发新功能时,以 develop 为基础创建 feature 分支 分支命名: feature/ 开头的为特性分支, 命名规则: feature/user_module、 feature/cart_module
-
release分支
release 为预上线分支,发布提测阶段,会release分支代码为基准提测
当有一组feature开发完成,首先会合并到develop分支,进入提测时,会创建release分支。 如果测试过程中若存在bug需要修复,则直接由开发者在release分支修复并提交。 当测试完成之后,合并release分支到master和develop分支,此时master为最新代码,用作上线。
-
hotfix 分支
分支命名:hotfix/ 开头的为修复分支,它的命名规则与 feature 分支类似 线上出现紧急问题时,需要及时修复,以 master 分支为基线,创建 hotfix 分支,修复完成后,需要合并到 master 分支和 develop 分支
———————————常见任务———————————
- 增加新功能
(dev)$: git checkout -b feature/xxx # 从dev建立特性分支
(dev)$: git merge feature/xxx --no-ff # 把特性分支合并到dev
- 修复紧急bug
(master)$: git checkout -b hotfix/xxx # 从master建立hotfix分支
(master)$: git merge hotfix/xxx --no-ff # 把hotfix分支合并到master,并上线到生产环境
(dev)$: git merge hotfix/xxx --no-ff # 把hotfix分支合并到dev,同步代码
- 测试环境代码
(release)$: git merge dev --no-ff # 把dev分支合并到release,然后在测试环境拉取并测试
- 生产环境上线
(master)$: git merge release --no-ff # 把release测试好的代码合并到master,运维人员操作
(master)$: git tag -a v0.1 -m '部署包版本名' #给版本命名,打Tag
详见:Git分支管理策略
| Git存储数据的原理
Git 是一个内容寻址文件系统,也就是说它实际上是一个键值对数据库(key-value data store)。Git 存储一份数据,然后返回一个40位的 Hash 值作为键值,通过这个键值,我们就能找到所存储的数据。
详见:Git存储数据的原理
| git revert 和 git reset 的区别
先看图:
sourceTree 中 revert 译为提交回滚
,作用为忽略你指定的版本,然后提交一个新的版本。新的版本中已近删除了你所指定的版本。
reset 为 重置到这次提交,将内容重置到指定的版本。git reset
命令后面是需要加2种参数的:–-hard
和 –-soft
。这条命令默认情况下是 -–soft
。
执行上述命令时,这该条commit号之 后(时间作为参考点)的所有commit的修改都会退回到git缓冲区中。使用git status
命令可以在缓冲区中看到这些修改。而如果加上-–hard
参数,则缓冲区中不会存储这些修改,git会直接丢弃这部分内容。可以使用 git push origin HEAD --force
强制将分区内容推送到远程服务器。
代码回退
默认参数 -soft
,所有commit的修改都会退回到git缓冲区
参数--hard
,所有commit的修改直接丢弃
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard commit_id 退到/进到 指定commit_id 推送到远程
$ git push origin HEAD --force
版本穿梭
当你回滚之后,又后悔了,想恢复到新的版本怎么办?
用git reflog
打印你记录你的每一次操作记录
$ git reflog
输出:
c7edbfe HEAD@{0}: reset: moving to c7edbfefab1bdbef6cb60d2a7bb97aa80f022687
470e9c2 HEAD@{1}: reset: moving to 470e9c2
b45959e HEAD@{2}: revert: Revert "add img"
470e9c2 HEAD@{3}: reset: moving to 470e9c2
2c26183 HEAD@{4}: reset: moving to 2c26183
0f67bb7 HEAD@{5}: revert: Revert "add img"
找到你操作的id如:b45959e
,就可以回退到这个版本
$ git reset --hard b45959e
ls =>查看当前文件夹中的目录 mkdir ‘自定义文件夹名’ =>创建一个新的子文件夹 pwd =>显示当前文件夹的路径
| git 解决冲突
-
保存本地拉取最新,手动merge
- git stash 暂存代码
- git stash list 查看暂存标记
- git pull 拉取最新代码
- git stash pop stash@{0} 还原暂存代码; stash@{0} -> 暂存标记
- 手动解决冲突
- git stash drop stash@{0} / git stash clear 删除指定标记/删除所有
- 提交代码
- git pull
手动解决冲突: pull 内容 -> Updated upstream 和 ===== 之间 本地修改的内容 -> ==== 和 stashed changes 之间 编辑冲突文件,删除冲突标记,自定确定需要内容后提交代码
-
回退更新
- git reset –hard
- git pull
| 删除暂存区文件
git rm –cached txt.txt 若报错:fatal: not removing ‘xxx/xxx’ recursively without -r 解决:git rm -r –cached txt.txt
| git reflog 和 git cherry-pick
问题:提交6次 feature-1 至 feature-6,执行强制回滚:git reset --hard 2216d4e
,回滚到了feature-1 上,并且回滚的时候加了–hard,导致之前 feature-2 到 feature-6 的所有代码全部没了,小白还在这个基础上新添加了一个 commit 提交,信息叫 feature-7。请问 如何把丢失的代码 feature-2 到 feature-6 全部恢复回来,并且 feature-7 的代码也要保留?
git cherry-pick 会获取某一个分支的单笔提交,并作为一个新的提交引入到当前分支上。
- git reflog
这时候要记好两个值:4c97ff3和cd52afc,他们分别是feature-7 和 feature-6 的 hash 码。然后执行回滚,回到feature-6上:git reset --hard cd52afc
回到了feature-6上,但是feature-7没了,如何加上来呢?
- git cherry-pick,刚刚我们知道了 feature-7 的hash码为 4c97ff3,
git cherry-pick 4c97ff3
期间可能会有一些冲突,按照提示解决就好,feature-1 到 feature-7的代码就合并到了一起,以前的代码也都回来了。
628221deda4c47751cd8861db0a1692517cc555b - bookmarks
| 参考链接
Git 分支管理策略 | Git Book | |
Git Cheat Sheet | Git使用入门教程(全) | git可视化入门教程 |