Git原理详解与实用指南
文章目录
- 上手 1:新公司用 Git 管理代码,怎么快速上手?
- 上手2:团队工作的基本工作模型
- 进阶1:HEAD、master与branch
- 进阶2:push的本质
- 进阶3:merge:合并commits
- 进阶4:Feature Branching:最流行的工作流
- 1.代码分享
- 2.Pull Request
- 3.一人多任务
- 进阶5:关于add
- 进阶6:看看都改了什么?
- 高级1:rebase替代merge
- 高级2:刚提交的代码,发现写错了怎么办?
- 高级3:写错的不是最新的提交,而是倒数第二个?
- 高级4:比错还错,想直接丢弃刚写的提交?
- 高级5:想丢弃的也不是最新的提交?
- 用交互式rebase撤销提交
- 用rebase --onto撤销提交
- 高级6:代码已经push上去了才发现写错?
- 高级7:reset的本质--不止可以撤销提交
- 高级8:checkout的本质
- 高级9:先扔掉当前工作,立刻打包,然后再取回来
- 高级10:branch删除之后才想起来有用?
- 其他知识点
- tag:不可移动的branch
- cherry-pick:把选中的commits一个个合并进来
- git config:Git的设置
- Git Flow:复杂又高效的工作流
上手 1:新公司用 Git 管理代码,怎么快速上手?
- 安装git;
- 在github上创建一个仓库,用来练习,创建完成后,复制仓库地址;
- 打开git bash,创建一个放本地仓库的目录,如mkdir myGitProjects;
- 进入该目录,执行命令:
git clone 仓库地址
- 拉取代码完成之后,在myGitProjects目录下就出现刚创建的项目,进入之后,创建一个shoppingList.txt,在其中写一些内容。
- 查看本地仓库的状态,执行命令:
git status
文字信息:
- 你当前在master branch;
- 当前branch没有落后于origin/master;
- 本地仓库有untracked files(未追踪的文件),文件名是shoppingList.txt;
- 可以使用git add来开始追踪文件。
7.追踪文件
git add 文件名
这里使用git add shoppingList.txt,追踪,然后再次执行git status命令,可以看到状态变了。
文字信息:
- staged表示文件已经进入了暂存区
- 文件提交:
git commit -m "备注信息"
这里使用git add -m “Add “shoppingList.txt””,后,再次执行git log可以看到两次提交记录。
说明暂存区里的文件已经提交到本地仓库了。
注意:每次提交之前,都执行一次git status,看一下文件的状态,这是一个好习惯。
把本地仓库的修改提交到中央仓库
git push
总结:
git clone 把中央仓库clone到本地
git add 把文件添加到暂存区
git commit -m “message” 把文件从暂存区提交到本地仓库
git push 本地仓库提交到中央仓库
git status 查看文件状态
git log 查看提交历史记录
上手2:团队工作的基本工作模型
拉取其他人的提交
git pull
如果中央仓库的版本领先本地的版本,需要先git pull,保证本地仓库的版本和中央仓库的一致,再提交git push
进阶1:HEAD、master与branch
HEAD 是指向当前 commit 的引用,它具有唯一性,每个仓库中只有一个 HEAD。在每次提交时它都会自动向前移动到最新 的 commit 。
branch 是一类引用。HEAD 除了直接指向 commit,也可以通过指向某个 branch 来间接指向 commit。当 HEAD 指向一个 branch 时,commit 发生时,HEAD 会带着它所指向的 branch 一起移动。
master 是 Git 中的默认 branch,它和其它 branch 的区别在于:
- 新建的仓库中的第一个 commit 会被 master 自动指向;
- 在 git clone 时,会自动 checkout 出 master。
branch 的创建、切换和删除:
- 创建 branch 的方式是 git branch 名称 或 git checkout -b 名称(创建后自动切换);
- 切换的方式是 git checkout 名称;
- 删除的方式是 git branch -d 名称。
总结:
git branch 分支名 创建分支
git checkout 分支名 切换分支
git branch -d 分支名 删除分支
进阶2:push的本质
- push 是把当前的分支上传到远程仓库,并把这个 branch 的路径上的所有 commits 也一并上传。
- push 的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用 git push origin branch_name 的格式,而不能只用 git push;或者可以通过 git config 修改 push.default 来改变 push 时的行为逻辑。
- push 的时候之后上传当前分支,并不会上传 HEAD;远程仓库的 HEAD 是永远指向默认分支(即 master)的。
进阶3:merge:合并commits
把目标branch上的所有commit合并到当前branch上:
-----------------(master)
git merge branch1
特殊情况1:冲突
- 解决冲突
找到有冲突的文件,打开,修改,注意删掉提示线和间隔线
git add .
git commit -m “message”
git push - 撤回合并
git merge --abort
特殊情况2:HEAD领先或落后于目标commit
都不会报错,合并为最新版本
进阶4:Feature Branching:最流行的工作流
1.代码分享
新建分支books写一个功能,写完后推到远程仓库
git checkout -b books
git push origin books
其他人要检验代码:
git pull origin books #这种方式只是拉取了books分支的代码,使用git pull会拉取所有代码
git checkout books
检验完之后,没问题,可以合并到master分支:
git checkout master
git pull
git merge books
把结果推到中央仓库,并把books这个分支删除:
git push
git branch -d books
git push origin -d books #删除远程仓库里的books分支
2.Pull Request
这是仓库服务提供方(比如github)提供的一种便捷功能。
1.把branch push到中央仓库;
2.在中央仓库创建一个Pull Request。
其他人可以看到我的commit,并评论。
如果确定可以合并,点击Merge pull request就可以合并到master,而且还有delete按钮可以删除该分支。
3.一人多任务
每个功能都新建一个branch,保证不会对master乱修改
进阶5:关于add
git add .
进阶6:看看都改了什么?
- 查看历史中的多个 commit:log
- 查看详细改动: git log -p
- 查看大致改动:git log --stat
- 查看具体某个 commit:show
- 要看最新 commit ,直接输入 git show ;要看指定 commit ,输入 git show commit的引用或SHA-1
- 如果还要指定文件,在 git show 的最后加上文件名
- 查看未提交的内容:diff
- 查看暂存区和上一条 commit 的区别:git diff --staged(或 --cached)
- 查看工作目录和暂存区的区别:git diff 不加选项参数
- 查看工作目录和上一条 commit 的区别:git diff HEAD
高级1:rebase替代merge
切换到branch1分支,执行rebase;
git checkout branch1
git rebase master
切换到master分支,执行merge,把head移动到最新的commit上。
git checkout master
git merge branch1
master如果不merge,会导致head仍然在之前的commit位置,会丢失合并之后的一些commit。
如果是两个其他的分支,比如branch1和branch2合并,可以直接rebase,不用merge。
高级2:刚提交的代码,发现写错了怎么办?
第一步:提交错误代码
git add laugh.txt
git commit -m "laugh"
第二步:发现有问题,修改文件,再次提交
vi laugh.txt #修改文件
git add laugh.txt
git commit --amend -m "laugh2"
从git log里可以看到之前的laugh的提交已经被laugh2覆盖。
总结:
git commit --amend
高级3:写错的不是最新的提交,而是倒数第二个?
第一步:把当前commit rebase到指定的commit上
git rebase -i HEAD^^
--等同于
git rebase -i HEAD~2
^ 的用法: ^ 表示把commit往回偏移,偏移量就是 ^ 的个数。
~ 的用法: ~ 后面跟一个数,表示往回偏移,偏移量就是 ~ 后面跟着的数。
第二步:执行完上一步之后,会进入一个编辑页面,点 i 进入编辑状态,修改pick为edit,然后退出
第三步:修改完要修改的文件之后,提交
git add laugh.txt
git commit --amend
git rebase --continue
高级4:比错还错,想直接丢弃刚写的提交?
git reset --hard HEAD^ #丢弃刚提交的commit
高级5:想丢弃的也不是最新的提交?
用交互式rebase撤销提交
比如撤销倒数第二条提交:
git rebase -i HEAD^^
之前修改的时候是把pick改为edit,删除的时候是直接把那一行删除。
- 但要注意如果两次提交针对了同一个文件的修改,且有冲突,最新的提交也没了,但文件里会显示冲突。
用rebase --onto撤销提交
git rebase --onto HEAD^^ HEAD^ branch1
高级6:代码已经push上去了才发现写错?
- 如果出错内容在私有 branch:在本地把内容修正后,强制 push (push -f)一次就可以解决;
git push origin branch1 -f
- 如果出错内容在 master:不要强制 push,而要用 revert 把写错的 commit 撤销。
git revert HEAD^ #反转倒数第二个commit,两个commit互相抵消
高级7:reset的本质–不止可以撤销提交
三种参数:
- –hard:重置位置的同时,清空工作目录的所有改动;
- –soft:重置位置的同时,保留工作目录和暂存区的内容,并把重置 HEAD 的位置所导致的新的文件差异放进暂存区。
- –mixed(默认):重置位置的同时,保留工作目录的内容,并清空暂存区。
git reset --hard HEAD^
git reset --soft HEAD^
git reset HEAD^
高级8:checkout的本质
本质:签出(checkout)指定的commit
checkout的目标也可以不是branch,而是指定某个commit。
git checkout HEAD^^
git checkout master~5
git checkout 78abc
git checkout 78abc^
这些都是可以的。
另外在git status的提示语中也说明可以使用git checkout – <file> 来撤销对指定文件的修改。
checkout和reset的不同
都可以改变HEAD的位置,最大的区别在于:reset在移动时HEAD会带着它的branch一起移动,而checkout不会。当时用checkout指向其他地方的时候,HEAD会和branch分离。
checkout有一个专门分离HEAD和branch而不用移动HEAD的语句:
git checkout --detach
高级9:先扔掉当前工作,立刻打包,然后再取回来
stash:临时存放工作目录的改动
git stash
这样,工作目录就会被清空,所有改动都保存起来,然后可以切换到master分支进行打包。
打完包后,切回之前的分支,然后:
git stash pop
- 注意:没有add过的文件是不会被stash起来的,因为git会忽略他们,如果要把这部分文件也stash,加-u参数
git satsh -u
高级10:branch删除之后才想起来有用?
reflog:引用的log
它会显示HEAD的移动记录。
从图中看出,最后一次是从branch1转移到master,所以前一个commit就是在branch1被删除之前的位置,也就是第二行的c08de9a。
切回到c08de9a,重新创建branch1,就可以找回。
git checkout c08de9a
git branch -b branch1
- 注意,被删除的commit会在一定时间后被回收,所以要及时找回,不然就找不到了。
查看其他引用的reflog
git reflog master
其他知识点
tag:不可移动的branch
cherry-pick:把选中的commits一个个合并进来
git config:Git的设置
Git Flow:复杂又高效的工作流
Git原理详解与实用指南相关推荐
- Git 原理详解及实用指南
Git 原理详解及实用指南 什么是版本控制系统(VCS) 很多人认为 Git 难以理解的第一个门槛在于:所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚.其实分布式版本控制系统(Di ...
- git 原理详解及实用指南_如何编写良好的提交消息:实用的Git指南
git 原理详解及实用指南 To create a useful revision history, teams should first agree on a commit message conv ...
- 一天彻底搞懂 Git 《Git 原理详解及实用指南》
我是扔物线,Android 开发者,开源贡献者,在 GitHub 上有 4.9k followers 和 7.8k stars ,个人的 Android 开源库 MaterialEditText 被全 ...
- git原理详解与实操指南_全网最精:学git一套就够了,从入门到原理深度剖析
以上资源收集至互联网 如有侵权请联系删除 资源获取方式 扫码关注资源库公众号 回复密码'20190812' 即可获得 截图展示 课程信息 课程难度:中级 学习人数:148352 课程状态:已完结 时长 ...
- git原理详解与实操指南_基于dockercompose的Gitlab CI/CD实践amp;排坑指南
长话短说 经过长时间实操验证,终于完成基于Gitlab的CI/CD实践,本次实践的坑位很多, 实操过程尽量接近最佳实践(不做hack, 不做骚操作),记录下来加深理解. 看过博客园<docker ...
- zzz KVC/KVO原理详解及编程指南
前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模 ...
- KVC/KVO原理详解及编程指南
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注 ...
- Git的原理详解与使用-臧雪园-专题视频课程
Git的原理详解与使用-3人已学习 课程介绍 2018 Git的原理详解与使用视频教程,该课程主要从四个部分进行讲解:第一部分主要讲解了Git的基本使用.比如安装和git基本命令使用, ...
- LVS原理详解(3种工作方式8种调度算法)--老男孩
一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...
最新文章
- Elasticsearch入门Demo(一)
- GPT-2的大规模部署:AI Dungeon 2 如何支撑百万级用户
- 关于WM_NCHITTEST消息(移动无标题对话框多个)
- javascript”面向对象编程”- 1万物皆对象
- Visual Studio 2013开发 mini-filter driver step by step 内核代码段分页alloc_text的使用(9)
- Java基础学习巩固3--重载和重写分析及区别
- c语言程序员写贪吃蛇代码28,厉害了,程序员28行代码写贪吃蛇游戏,附源码!...
- Linux系统安全及应用(账号控制、su、sudo、开关机安全控制、终端登录安全控制等)
- ubuntu14.04的键盘失灵解决方案
- layui datetimepicker 只日期范围到当前时间的前一天_浪琴手表如何正确调整日期?手表调日期的方法...
- java中双引号和单引号_Java中的单引号和双引号之间有区别吗?
- 这五个有用的 CSS 属性完全被我忽视了
- arnold官方帮助文档_Python用不好英语水平不够?这里有官方中文文档你看不看
- android跑马灯源码,Android跑马灯的简单实现方式
- 红警代码开源了 来瞅瞅源码 文内送Win10可联机的红警2标准版游戏
- 计算机断网后怎么连接网络连接,win7系统中网络经常掉线断网后又自动连接上怎么办...
- java 生成二维码后叠加LOGO并转换成base64
- 用Html+css写一个渐变背景的个人名片
- UOS-----本地YUM源配置
- 树-树的遍历(先序、中序、后序)
热门文章
- 计算机网络基本知识教学设计,计算机网络基础知识教学设计.doc
- 碰到ORA-00911: invalid character错误提示
- matlab实现贝叶斯分类,朴素贝叶斯分类matlab实现
- doctype html的作用是什么,DOCTYPE的作用
- 死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的
- 分析句子成分及句子顺序
- html js引用本地资源,了解使用JavaScript读取本地文件的方法
- SQL基础知识 思维导图
- undo表空间误删后的恢复
- 微信小程序开发之——网络请求封装