首页 > 代码库 > git 学习笔记
git 学习笔记
全部参考于廖雪峰的 git 教程.
下决心掌握 git 来自一个现实的需求, 项目中用到的核心 api 只能在内网环境使用, 在笔记本开发, 在内网机器上部署, 然鹅现在还无法 tdd, 所以是边运行边改, 改完之后, 内网和笔记本的版本已经有了巨大差别, 几十个文件都复制粘贴么?
不会 tdd 的 python 程序员, 只能叫写脚本的, 算不上工程师. 目前暂时使用 git 扛一阵, 解决代码同步的问题.
1. git 是什么?
git, 分布式版本控制系统, 结构上可以分为两部分, 工作区和版本库, 工作区就是当前文件夹, 版本库就是 .git 中的内容
版本库又可以分为暂存区 stage 和分支, git 默认创建 master 分支, 当然也可以手动创建其他分支.
git 追踪的是文件的修改, 分为三种情况: 创建文件, 删除文件, 修改文件内容.
创建一个新文件, git add file 是将文件添加到版本库, 并将文件当前的内容添加到暂存区.
修改一个文件, git add file 是将修改的内容添加到暂存区.
删除一个文件, 需要 git rm file 从版本库中删除文件.
暂存区的修改, 通过 git commit 提交到分支. git commit -m "some comment" 可以在 commit 同时增加一个 comment
每一次 commit 都有一个唯一的 commit_id
HEAD 指针指向当前分支, 可以是 master, 可以是 dev, 当前分支指向当前版本, 简单讲, HEAD 指向当前版本
HEAD^ 指向前一个版本, HEAD^^ 指向前两个版本, HEAD~100 指向前100个版本
2. git 版本回退, 暂存区操作, 撤销工作区文件修改, 删除文件
git log 可以查看 commit 历史, git log --pretty=oneline 可以查看 log 的缩略版本
128c201c260dc853bb76c6a7c2a9f749e56b0b18 git tracks changes of files b96e29ff7dfc8b71e3bda9fe085d1155abdd7dd6 git tracks changes acd53b603218dca7b1b03f313d70a2e3616a515b understand how stage works 65e4280bea128ae4911690320d5eaf243be0c40c append GPL 3629ce74dfabd74eca3b04dbd62c67a3578031f8 add distributed 32bd0adb6222c1603401208f688141fb3ea2b87f wrote a readme file
git reset --hard HEAD^ 退回上一个版本
git reset --hard commit_id (前5-6位) 退回到 commit_id 所在的版本
在版本切换时, git log 的输出也会跟随变化, 简单说, 如果退回到上一个版本, 那么当前版本的 commit_id 就不会在 git log 中显示
这时候需要 git reflog, 可以查看版本切换的记录, 也就可以再次回到开始切换的版本
git add file 可以将 file 的修改添加到暂存区 stage, 但是, 如果我想删除添加到暂存区的修改, 用什么命令?
git reset HEAD file 把暂存区的修改退回到工作区
但是, 文件已经修改过了, 如果想把工作区的文件恢复到此次修改开始之前的状态, 简单讲就是最近一个 git add 或 git commit 之后的状态
git checkout -- file 该命令会用版本库中的记录替换当前文件
3. git 分支管理
前面说到, 可以有 master 分支, 可以有 dev 分支, 如果多人协作, 每个人也可以有自己的分支.
原则上, master 分支只用于发布版本, 开发在 dev 分支上做, 如果做新功能, 可以在 dev 上另开分支, 开发完成后合并到 dev 分支.
最后才合并到 master 分支, 用于发布.
git branch dev 创建 dev 分支
git checkout dev 切换到 dev 分支
或 git checkout -b dev 创建并切换到 dev 分支
git branch 可以查看分支情况
现在 dev 分支上功能开发完毕, 想要合并到 master 分支
git checkout master 切换到 master 分支
git merge dev 合并 dev 分支
git 尽量使用 Fast forward 模式合并分支, 对于存在冲突的文件, git 用 <<<<<<<<< 和 >>>>>>>>>> 标记冲突
git branch -d dev 用于删除 dev 分支
有一个问题, 分支一旦删除, 分支的信息也就丢失, no-ff 选项可以强制不使用 Fast forward 模式, 并且在每次 merge 之后进行一次 commit
git merge --no-ff -m "some comment" dev 合并 dev 的同时进行一次 commit
如果 master 版本中出现了 bug, 需要进行紧急修复, 目前在 dev 分支开发, 已经 git add 但是还无法 git commit
想保存当前暂存区的内容, 等 bug 修复之后再恢复
git stash 保存工作现场
git stash list 查看保存的工作现场列表
git stash pop 弹出最后存储的工作现场
未 merge 的分支, 可以使用 git branch -D feature-vulcan 删除
4. 标签管理
上面讲到 master 用于发布版本, 但是 commit_id 不能用来发布, 版本应该是 v1.0
git tag v1.0 打一个新标签v1.0
git tag 查看所有标签
git tag v0.9 commit_id 对特定的 commit_id 打标签
标签本身按字母排序, 不按时间排序
git show v0.9 查看标签信息
git tag -a v0.8 -m "version 0.8 released" commit_id 创建带有说明的标签
git tag -d v0.8 删除标签
5. 远程仓库
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改
git push -u origin dev 用于推送 dev 分支的所有内容
默认情况下, git clone 只有 master 分支
git checkout -b dev origin/dev 创建远程 origin 的 dev 分支到本地
之后再执行 git commit 就会把修改同步到远程 dev 分支
如果遇到 commit 失败的情况, git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联
git pull 用于从远程抓取分支, 如果有冲突就先解决冲突.
git 学习笔记