多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Git是现在最流行的版本管理工具, 其实学习的成本挺高的, 很多的入门的教程讲的都非常的坑, 比如`尽量用的rebase代替pull`, 当时我在想, 你说的我都懂, 但是具体应该怎么做呢, 我看了好久终于搞懂了, 我希望的教程都把看的人当sb一样来看, 该写的命令, 一句不落, 而不是一笔带过, 本文大概分为以下几部分 # Git软件下载地址 ## Git 这是git的核心工具 官网: git-scm.com 下载: 在官网下载, 若官网不能访问, [点击这里][1] ## TortoiseGit 这是git的辅助工具 官网: tortoisegit.org 下载: windows: 在官网下载 ## SourceTree 也是git的辅助工具, 和TortoiseGit二选一 官网: www.sourcetreeapp.com # Git在项目中的流程 一般来说都是项目管理人员`新建仓库`(一般都会`新建两个保护分支` 主分支*master*和开发分支*develop*, 既然是保护分支对项目的其他人员都是只读的, 甚至是不可见的) 然后`推送到远程仓库`, 项目的其他人员, 从`远程仓库clone`, 项目参与人员根据任务的编号`建立任务分支`(任务分支一般都是以*develop*分支为基础建立, 我们公司是以'#'+任务编号, 来确定任务分支名称, 如40号任务, 任务分支名称就为"*#40*"), 任务做好测试之后, 把分支推送到项目仓库, 项目管理人员就把`任务分支合并`到*develop*分支进行整合测试, 确定没有问题之后合并到*master*分支, 生产环境直接拉取*master*分支就行了 当然还有其他的项目人员肯定要和远程仓库同步了, 就是`重新拉取远程仓库`的内容, 以develop保证内容最新, 减少`冲突` # Git常用的操作 上面的项目流程中,特殊标记的就是常用的操作 我工作中基本上就只用到这些, 这些还是比较熟练的, 上面已经说明了使用的场景需求 远程仓库以osc(git.oschina.net/)为远程仓库 ## 新建一个仓库 在osc上面新建一个仓库 ![图片描述][2] 右键 > `git bash` ``` // 自己在本地新建仓库 git init // 新建项目的说明文件 echo "this is a demo" >> README.md // 把说明文件添加并提交 git add README.md git commit -m "first commit" // 新建master,develop分支 git checkout -b master git checkout -b develop // 添加远程的仓库 git remote add origin https://git.oschina.net/xsu/demo.git // 推送分支到远程, 会弹出验证框让你输入帐号和密码 git push origin master git push origin develop ``` ![图片描述][3] 项目开发人员: 从远程仓库克隆, 再操作 ``` // 克隆, 需要输入有权限的帐号和密码 git clone https://git.oschina.net/xsu/demo.git // 这步是查看clone下来的分支的, 可以看到包含刚才新建的master和develop分支 $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/develop remotes/origin/master // 新建任务是以origin/develop为基准, 命令会新建并切换到任务(#40) git checkout origin/develop -b "#40" // 查看本地的分支, 当前分支是新建的分支 $ git branch * #40 master // 就在任务分支上作业 // 添加修改的文件 git add <filename> / git add * // 提交修改, 提交是提交到本地 git commit -m "你的注释" // 然后推送到远程 $ git push origin "#40" Total 0 (delta 0), reused 0 (delta 0) To https://git.oschina.net/xsu/demo.git * [new branch] #40 -> #40 ``` 项目管理人员: 合并删除刚才推送上来的分支 ``` //合并: rebase和merge都可以完成合并, 区别请参考progit, 合并的时候推荐不推荐用命令行, 使用gui工具更方便 git checkout develop git rebase/merge origin/#40 git push origin develop // 删除, 这语法可能非常扯, 这tmd竟然是删除 $ git push origin :#40 To https://git.oschina.net/xsu/demo.git - [deleted] #40 ``` 项目开发人员: 从远程更新 ``` // 远程把作业分支合并到develop分支之后, 本地需要更新 $ git fetch -p origin From https://git.oschina.net/xsu/demo x [deleted] (none) -> origin/#40 // 手动删除自己本地的分支 git branch -d "#40" ``` 然后又是新建任务分支, 推送, 合并, 项目就这样推进了 项目管理人员和项目开发都可以是同一个人, 上面的步骤就少了更新的步骤 # Git常用的概念 参考[progit](http://git.oschina.net/progit/) # 使用密钥代替密码 上面的操作中是需要输入帐号密码的, 这种方式非常的不方便, 其实可以用密钥代替 ## osc端 打开git bash ``` cd ~/.ssh ssh-keygen -t rsa -C "999999@163.com" ``` ![图片描述][4] 在红框处输入你想取的名称, 我输入`osc`, 然后在我的电脑的地址栏中输入 `%userprofile%/.ssh` 是不是看到了`osc`和`osc.pub`两个文件 打开`osc.pub`, 全选,复制到`个人资料`这里 ![图片描述][5] ## pc端 新建文件,取名为config, 内容如下 ``` # oschina Host oschina HostName git.oschina.net User jaime IdentityFile ~/.ssh/osc ``` ## 测试 我那里的hostnam是oschine, 以后所有用到`git.oschina.net`的地方都改为`oschina`. https改为git 成功就是 ``` $ ssh -T git@oschina Welcome to Git@OSC, xsu! ``` 失败如下 ``` $ ssh -T git@oschina Permission denied. ``` ``` // 添加远程的仓库 git remote add origin https://git.oschina.net:xsu/demo.git 修改为 git remote add origin git@oschina:xsu/demo.git ``` 之前是clone的仓库改为 ``` git clone git@oschina:xsu/demo.git ``` 如果已经克隆, 修改远程仓库地址为 ``` git remote remove origin git remote add origin git@oschina:xsu/demo.git ``` 当然这些的前提是 你要有这个仓库的权限 如果TortoiseGit想使用密钥的话, 必须右键 > TortoiseGit > settings ![图片描述][6] ssh.exe的地址为 `git的安装目录/usr/bin` # 工作中常用的命令 ``` git init git add <file> git comit -m "<msggggg>" git status git log从最近到最远的提交日志, git log --pretty=oneline 显示到一行 git reset版本回退 git reset --hard HEAD^ 回退到上一个版本,几个^回退到上几个版本 git reset --hard 80fed6a 回退到hash开头为 80fed6a 的那个版本, 版本号没必要写全,前几位就可以 git diff查看修改的内容, 使用TortoiseGit来查看, 不要使用这个命令查看 git push origin <branch_name> git fetch 获取remote内容 git fetch -p origin 获取的时候删除已经删除的分支 git rebase/merge <branch> 把<branch>合并到当前分支 git branch <branch> 新建分支 git checkout <branch> 切换到分支 git checkout -b <branch> 新建并且切换到分支, 可以代替上面2条命令 ``` 本文不是git的完全教程, git的基础一定要看啊 [1]: https://git-scm.com [2]: https://segmentfault.com/img/bVEzbq [3]: https://segmentfault.com/img/bVEzbt [4]: https://segmentfault.com/img/bVEziY [5]: https://segmentfault.com/img/bVEzjB [6]: https://segmentfault.com/img/bVEzlX