前言

几个月前看完了git文档,但是在实际开发中对很多git命令的具体影响仍有疑惑,比方说pull、fetch和rebase三个命令和检出位置拎不清。

Git - Book​git-scm.com

安利一个git可视化练习的网站,画俩小时把所有题目都做完就足以掌握多人开发中git的主要用法,对各种git操作的影响也可以通过可视化一览无遗。

Learn Git Branching​learngitbranching.js.org

遂又花了一个小时整理了一些操作的可视化细节,有时间的话推荐直接在网站上刷一下题目。

基础

# 提交commit
git commit -m "msg"# 创建并切换到分支
git checkout -b bugFix# merge分支
git checkout -b bufFix
git commit
git checkout master
git commit
git merge bugFix # 把bugFix分支merge到master上

其中merg分支的可视化:

高级

移动分支

# 使用提交记录上的标签(哈希值)来指定提交记录
git checkout C4
git checkout HEAD^
git checkout HEAD~4# 强制移动master分支
git branch -f master HEAD~3

撤销分支

git reset通过把分支记录回退几个提交记录来实现撤销改动。但是这种方法对大家一起使用的远程分支是无效的。需要使用git revert。

git reset HEAD~1
git revert HEAD

移动提交记录

将本地分支的指定commit工作复制到其他分支上

git cherry-pick C2 C4

交互式的rebase

git rebase -i HEAD~4

杂项

只取一个提交记录

适用于bufFix中有多个无效提交记录(比如打印debug日志),我们只需要取一个提交记录到主分支上即可。

git rebase -i 和 git cherry-pick均可实现

tag

tag可以指向某个提交记录的标识,比如软件发布新的大版本,或者修正一些重要的bug或者是增加了某些新特性。

git tag v1 C1

git describe

用于帮助你在提交历史中移动了多次后找到方向

# 语法:
git describe <ref>
# <ref>是任意能被git识别成提交记录的引用,如果你没有指定的话,git会以你目前所检出的位置(HEAD)。
# 输出结果:
<tag>_<numCommits>_g<hash>
# tag表示离<ref>最近的标签,numCommits表示这个ref和tag之间相差有多少个提交记录,hash表示你所指
# 定的ref所表示的提交记录哈希值的前几位。当ref提交记录上有某个标签时,只输出标签名称。

多分支全都rebase到master上

多个父节点时

使用git checkout HEAD^1中的^符号可以指定第几个父节点。 而且^~操作符支持链式操作:

git checkout HEAD~1^2~3

远程仓库操作

克隆远程仓库

# 克隆远程仓库
git clone

获取远程仓库更新

当远程仓库(虚线)更新了C2和C3两次提交时,本地仓库可以通过git fetch将C2和C3更新下载到本地仓库,同时本地的o/master分支也会更新。
需要注意的是,此时本地的master分支并不会更新。也就是git fetch并不会更新本地的master分支,只会更新本地的o/master指针。

更新前:

更新后:

git pull

相当于先git fetch获取远程仓库o/master更新后merge到本地的master分支上。

注意当本地分支和远程分支有分歧时也可以使用。

git push

  • 将更新传递到远程仓库,远程仓库更新master分支
  • 本地的远程分支o/master也会更新

偏离的工作

举个例子,当你完成自己的功能开发后,你的同事写了一堆提交并且改变了许多你功能中使用的API,这些改变使得你新开发的功能不可用,但是他已经将代码推送到远程仓库上了。此时如果git是不会允许你执行git push的,你只能先合并远程最新的代码,然后才能提交你的工作。

git fetch
git rebase o/master
git push

另外,我们也可以使用merge

注意,使用rebase相比于pull可以使得提交历史更简洁。

使用前本地master和远程master有分歧 :

使用pull时:

  • 本地master同步远程master的更新
  • 本地的o/master更新和远程master一致

使用fetch和rebase时:

  • 首先fetch更新o/master远程分支
  • 其次rebase会将C3的改变加在o/master

git pull --rebasefetchrebase的缩写。

良好的开发规范

工作完成后快速地更新本地master分支并推送到远程仓库:

# 拉取远程分支更新并将更新推送到本地master
git pull --rebase
# 推送本地更新到远程
git push

一个小例子:

  • 本地开发了多个功能,全部开发完成
  • 更新o/master分支
git fetch

  • 将不同功能rebase到o/master分支上
git rebase o/master side1
git rebase side1 side2
git rebase side2 side3

  • 更新本地master分支并上传到远程仓库
git rebase side3 master
git push

相同的工作用merge完成:

注意,使用rebase可以让你让你的提交历史更加干净,但是缺点是你会丢失你的部分提交历史,虽然我个人感觉是意义不大的提交历史(在快速迭代开发中)。仁者见仁,智者见智。

git checkout master # 回到本地master分支
git pull # 更新本地master分支
git merge side1
git merge side2
git merge side3
git push

跟踪远程分支

mastero/master分支是相互跟踪的,是在我们克隆远程仓库时指定的。

# 法1:
git checkout -b totallyNotMaster o/master
# 法2:
git branch -u o/master totallyNotMaster

git push的参数

# 切换到本地的master分支,获取所有的commit,再到远程仓库origin中找到master分支,将远程
# 仓库中没有的提交记录都添加上去
git push origin master
# 将本地的某个分支推送到远程中的另一个分支
git push origin <source>:<destination>
# 注意这里的destination也可以是一个新建的分支

git fetch的参数

# 一方面git fetch只会下载远程的提交记录从而更新`o/master`,但不会更新本地的非远程分支。
# 另一方面我们可以通过<source>:<destination>来设置fetch的传输来源和目的地。其中source指的
# 是远程仓库的位置,而destination指的是本地仓库的位置。
# 如果git fetch没有任何参数,那么它会下载所有的提交记录到各个远程分支中,即更新所有的远程分支

git push和git fetch的空参数

# 删除远程的foo分支
git push origin :foo# 在本地创建新分支bar
git fetch origin :bar

git pull参数

git pull不带任何参数就是fetch和merge的组合,首先更新本地的远程分支,然后再merge你抓取到的提交记录。

git pull origin foo相当于:

git fetch origin foo
git merge o/foo

git pull origin bar~1:bugFix相当于:

git fetch origin bar~1:bugFix
git merge bugFix

需要注意的是,git pull更新的是我们的检出位置,而不是一定更新本地master分支。

比如在pull之前,我们的HEAD在本地分支bar上:

当我们使用git pull之后:

git pull origin master

git 只merge部分_[Skill]俩小时掌握多人开发中git的主要用法相关推荐

  1. git推送密码_保护代码完整性(六):在 Git 上使用 PGP

    我们继续我们的 PGP 实践系列,来看看签名标签的标签和提交,这可以帮你确保你的仓库没有被篡改. 在本系列教程中,我们提供了一个使用 PGP 的实用指南,包括基本概念和工具.生成和保护你的密钥.如果你 ...

  2. iOS项目开发中Git的使用

    一.Git介绍 Git是一个项目源码管理系统,在多人合作开发过程中是至关重要的.在项目开发中,我们可以通过Git客户端(Github.Tower.Tortoise等)或者通过命令行来使用Git,关于G ...

  3. 多人开发时Git下冲突的产生和解决

    冲突的产生 很多命令都可能出现冲突,但从根本上来讲,都是merge 和 patch(应用补丁)时产生冲突. 而rebase就是重新设置基准,然后应用补丁的过程,所以也会冲突. git pull会自动m ...

  4. Git使用教程-idea系列(idea、webstorm、phpstorm、androidstudio)中git使用教程

    Git使用教程 idea.webstorm.phpstorm.androidstudio中git使用教程 aiprose 个人随笔上线,网址 aiprose.com 点击访问 首先你的安装git,wi ...

  5. freemarker中运算符_如何在Web应用系统表示层开发中应用Velocity模板技术

    软件项目实训及课程设计指导--如何在Web应用系统表示层开发实现中应用Velocity模板技术 1.分离Web表示层的数据处理和展现逻辑的常见的应用技术 分离Web表示层的数据处理和展现逻辑是目前企业 ...

  6. git 短写设置_如何在短短几分钟内设置一个Git客户端

    git 短写设置 Today we're going to talk about Git. You're going to learn what Git is and how to set up a ...

  7. easyui中的datetimebox 只显示年月日_云计算自动化运维之linux-工作中常用命令总结(中)...

    ***想看完整版请看(上).(中).(下)三篇文章*** date命令,显示系统时间 直接输入date 2.date 命令打印年月日,使用命令date +%F或者是date +%Y-%m-%d 3.d ...

  8. git拉取tag_不给队友拖后腿!团队开发中 Git 最佳实践

    来源 | 欧雷 编辑 | GitHubDaily(id:GitHubDaily) 出处 | ourai.ws/posts/working-with-git-in-team/ 前言 在 2005 年的某 ...

  9. 开发中git的常用命令

    一.git常用命令 1.创建git本地仓库 git init 2.提交代码到暂存区 git add . 3.把暂存区代码提交到本地仓库 git commit -m '本次提交代码介绍' 4.把本地仓库 ...

最新文章

  1. UA MATH524 复变函数9 柯西公式与幂级数展开
  2. samba安装与配置
  3. 计算机计算各科及格率,某两个班数学考试成绩如下,要求计算分析指标,用..._投资分析考试_帮考网...
  4. PHP Redis 集群封装类
  5. ios 图片居中裁剪_使用居中图像iOS启动屏幕故事板
  6. c语言 utf 8转字符串,如何将UTF-8字节[]转换为字符串?
  7. resnet结构_来聊聊ResNet及其变种
  8. cdn厂商 同兴万点_CDN进入牌照时代 工信部规范和清理CDN市场
  9. Linux怎么添加交换空间,如何在Ubuntu上增加swap交换空间
  10. linux中cat、more、less命令区别详解
  11. 3.9 Spark 键值对RDD编程
  12. linux 运行lammps,lammps linux运行
  13. 多维多重背包问题_多重选择背包问题,multiple choice knapsack problem,音标,读音,翻译,英文例句,英语词典...
  14. 【线性代数】P8 逆矩阵矩阵方程以及逆矩阵的性质
  15. c语言小球消砖块的游戏,求大神帮忙看看这个弹弹球消砖块的游戏代码,为什么speed只能15...
  16. 企业如何数据集成?数据集成解决方案
  17. 关于有道云笔记偶尔会抽风变换语言这回事
  18. 接到猎头电话,要招的竟是我现在的岗位!
  19. 笔记本 服务器 性能,笔记本CPU性能天梯图2021最新6月
  20. 第四章 玩转捕获数据包

热门文章

  1. 微生物组科学蓬勃发展,5大方向备受行业关注!
  2. 广东生态所孙蔚旻团队EST发表利用稳定同位素示踪-宏基因组分箱联用技术揭示砷污染土壤中的厌氧砷氧化微生物及其代谢途径...
  3. R语言进行数据聚合统计(Aggregating transforms)实战:使用R原生方法、data.table、dplyr等方案、计算分组均值并添加到可视化结果中
  4. R语言可视化包ggplot2绘制线性回归模型曲线实战( Linear Regression Line)
  5. R语言set.seed函数的意义及实战
  6. R语言Gamma分布函数Gamma Distribution(dgamma, pgamma, qgamma rgamma)实战
  7. 密度聚类OPTICS算法
  8. Python可视化(matplotlib)图像自定义图例(Legend)
  9. R方差分析(anova)以及Tukey检验
  10. R语言基本描述性统计量函数