文章目录

  • 上手 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 管理代码,怎么快速上手?

  1. 安装git;
  2. 在github上创建一个仓库,用来练习,创建完成后,复制仓库地址;
  3. 打开git bash,创建一个放本地仓库的目录,如mkdir myGitProjects;
  4. 进入该目录,执行命令:
git clone 仓库地址
  1. 拉取代码完成之后,在myGitProjects目录下就出现刚创建的项目,进入之后,创建一个shoppingList.txt,在其中写一些内容。
  2. 查看本地仓库的状态,执行命令:
git status


文字信息:

  • 你当前在master branch;
  • 当前branch没有落后于origin/master;
  • 本地仓库有untracked files(未追踪的文件),文件名是shoppingList.txt;
  • 可以使用git add来开始追踪文件。

7.追踪文件

git add 文件名

这里使用git add shoppingList.txt,追踪,然后再次执行git status命令,可以看到状态变了。


文字信息:

  • staged表示文件已经进入了暂存区
  1. 文件提交:
git commit -m "备注信息"

这里使用git add -m “Add “shoppingList.txt””,后,再次执行git log可以看到两次提交记录。

说明暂存区里的文件已经提交到本地仓库了。

  1. 注意:每次提交之前,都执行一次git status,看一下文件的状态,这是一个好习惯。

  2. 把本地仓库的修改提交到中央仓库

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

  1. HEAD 是指向当前 commit 的引用,它具有唯一性,每个仓库中只有一个 HEAD。在每次提交时它都会自动向前移动到最新 的 commit 。

  2. branch 是一类引用。HEAD 除了直接指向 commit,也可以通过指向某个 branch 来间接指向 commit。当 HEAD 指向一个 branch 时,commit 发生时,HEAD 会带着它所指向的 branch 一起移动。

  3. master 是 Git 中的默认 branch,它和其它 branch 的区别在于:

    1. 新建的仓库中的第一个 commit 会被 master 自动指向;
    2. 在 git clone 时,会自动 checkout 出 master。
  4. branch 的创建、切换和删除:

    1. 创建 branch 的方式是 git branch 名称 或 git checkout -b 名称(创建后自动切换);
    2. 切换的方式是 git checkout 名称;
    3. 删除的方式是 git branch -d 名称。

总结:
git branch 分支名 创建分支
git checkout 分支名 切换分支
git branch -d 分支名 删除分支

进阶2:push的本质

  1. push 是把当前的分支上传到远程仓库,并把这个 branch 的路径上的所有 commits 也一并上传。
  2. push 的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用 git push origin branch_name 的格式,而不能只用 git push;或者可以通过 git config 修改 push.default 来改变 push 时的行为逻辑。
  3. push 的时候之后上传当前分支,并不会上传 HEAD;远程仓库的 HEAD 是永远指向默认分支(即 master)的。

进阶3:merge:合并commits

把目标branch上的所有commit合并到当前branch上:

-----------------(master)
git merge branch1

特殊情况1:冲突

  1. 解决冲突
    找到有冲突的文件,打开,修改,注意删掉提示线和间隔线
    git add .
    git commit -m “message”
    git push
  2. 撤回合并
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:看看都改了什么?

  1. 查看历史中的多个 commit:log

    1. 查看详细改动: git log -p
    2. 查看大致改动:git log --stat
  2. 查看具体某个 commit:show
    1. 要看最新 commit ,直接输入 git show ;要看指定 commit ,输入 git show commit的引用或SHA-1
    2. 如果还要指定文件,在 git show 的最后加上文件名
  3. 查看未提交的内容:diff
    1. 查看暂存区和上一条 commit 的区别:git diff --staged(或 --cached)
    2. 查看工作目录和暂存区的区别:git diff 不加选项参数
    3. 查看工作目录和上一条 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上去了才发现写错?

  1. 如果出错内容在私有 branch:在本地把内容修正后,强制 push (push -f)一次就可以解决;
git push origin branch1 -f
  1. 如果出错内容在 master:不要强制 push,而要用 revert 把写错的 commit 撤销。
git revert HEAD^ #反转倒数第二个commit,两个commit互相抵消

高级7:reset的本质–不止可以撤销提交

三种参数:

  1. –hard:重置位置的同时,清空工作目录的所有改动;
  2. –soft:重置位置的同时,保留工作目录和暂存区的内容,并把重置 HEAD 的位置所导致的新的文件差异放进暂存区。
  3. –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原理详解与实用指南相关推荐

  1. Git 原理详解及实用指南

    Git 原理详解及实用指南 什么是版本控制系统(VCS) 很多人认为 Git 难以理解的第一个门槛在于:所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚.其实分布式版本控制系统(Di ...

  2. git 原理详解及实用指南_如何编写良好的提交消息:实用的Git指南

    git 原理详解及实用指南 To create a useful revision history, teams should first agree on a commit message conv ...

  3. 一天彻底搞懂 Git 《Git 原理详解及实用指南》

    我是扔物线,Android 开发者,开源贡献者,在 GitHub 上有 4.9k followers 和 7.8k stars ,个人的 Android 开源库 MaterialEditText 被全 ...

  4. git原理详解与实操指南_全网最精:学git一套就够了,从入门到原理深度剖析

    以上资源收集至互联网 如有侵权请联系删除 资源获取方式 扫码关注资源库公众号 回复密码'20190812' 即可获得 截图展示 课程信息 课程难度:中级 学习人数:148352 课程状态:已完结 时长 ...

  5. git原理详解与实操指南_基于dockercompose的Gitlab CI/CD实践amp;排坑指南

    长话短说 经过长时间实操验证,终于完成基于Gitlab的CI/CD实践,本次实践的坑位很多, 实操过程尽量接近最佳实践(不做hack, 不做骚操作),记录下来加深理解. 看过博客园<docker ...

  6. zzz KVC/KVO原理详解及编程指南

    前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模 ...

  7. KVC/KVO原理详解及编程指南

    作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注 ...

  8. Git的原理详解与使用-臧雪园-专题视频课程

    Git的原理详解与使用-3人已学习 课程介绍         2018 Git的原理详解与使用视频教程,该课程主要从四个部分进行讲解:第一部分主要讲解了Git的基本使用.比如安装和git基本命令使用, ...

  9. LVS原理详解(3种工作方式8种调度算法)--老男孩

    一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...

最新文章

  1. Elasticsearch入门Demo(一)
  2. GPT-2的大规模部署:AI Dungeon 2 如何支撑百万级用户
  3. 关于WM_NCHITTEST消息(移动无标题对话框多个)
  4. javascript”面向对象编程”- 1万物皆对象
  5. Visual Studio 2013开发 mini-filter driver step by step 内核代码段分页alloc_text的使用(9)
  6. Java基础学习巩固3--重载和重写分析及区别
  7. c语言程序员写贪吃蛇代码28,厉害了,程序员28行代码写贪吃蛇游戏,附源码!...
  8. Linux系统安全及应用(账号控制、su、sudo、开关机安全控制、终端登录安全控制等)
  9. ubuntu14.04的键盘失灵解决方案
  10. layui datetimepicker 只日期范围到当前时间的前一天_浪琴手表如何正确调整日期?手表调日期的方法...
  11. java中双引号和单引号_Java中的单引号和双引号之间有区别吗?
  12. 这五个有用的 CSS 属性完全被我忽视了
  13. arnold官方帮助文档_Python用不好英语水平不够?这里有官方中文文档你看不看
  14. android跑马灯源码,Android跑马灯的简单实现方式
  15. 红警代码开源了 来瞅瞅源码 文内送Win10可联机的红警2标准版游戏
  16. 计算机断网后怎么连接网络连接,win7系统中网络经常掉线断网后又自动连接上怎么办...
  17. java 生成二维码后叠加LOGO并转换成base64
  18. 用Html+css写一个渐变背景的个人名片
  19. UOS-----本地YUM源配置
  20. 树-树的遍历(先序、中序、后序)

热门文章

  1. 计算机网络基本知识教学设计,计算机网络基础知识教学设计.doc
  2. 碰到ORA-00911: invalid character错误提示
  3. matlab实现贝叶斯分类,朴素贝叶斯分类matlab实现
  4. doctype html的作用是什么,DOCTYPE的作用
  5. 死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的
  6. 分析句子成分及句子顺序
  7. html js引用本地资源,了解使用JavaScript读取本地文件的方法
  8. SQL基础知识 思维导图
  9. undo表空间误删后的恢复
  10. 微信小程序开发之——网络请求封装