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 revertgit reset 的区别

先看图:

sourceTreerevert 译为提交回滚,作用为忽略你指定的版本,然后提交一个新的版本。新的版本中已近删除了你所指定的版本。

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 解决冲突

  1. 保存本地拉取最新,手动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 之间 编辑冲突文件,删除冲突标记,自定确定需要内容后提交代码

  2. 回退更新

    • 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 会获取某一个分支的单笔提交,并作为一个新的提交引入到当前分支上。

  1. git reflog

这时候要记好两个值:4c97ff3和cd52afc,他们分别是feature-7 和 feature-6 的 hash 码。然后执行回滚,回到feature-6上:git reset --hard cd52afc

回到了feature-6上,但是feature-7没了,如何加上来呢?

  1. 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可视化入门教程