小白教你用Git(含常用场景)

作为一个码代码的小白,人人都应该使用版本控制工具来管理自己的代码,这样才能有条不紊的写bug 写代码

理论知识部分(嫌麻烦的直接拉到最下面实践部分)

版本控制系统的核心

版本控制/主动提交/中央仓库

分布式版本控制系统和中央式的区别

中央式的版本控制系统:保存版本信息/同步团队代码
分布式:通过本地仓库来保存版本信息,中央仓库用来同步代码,不过依然会保存版本信息,但这份历史版本更多的是作为团队间的同步中转站。

分布式版本控制系统(VCS)的优缺点

优点

  1. 大多数操作是在本地进行,速度更快,且不用联网。
  2. 可以分布提交代码,可以把代码提交做得更细,而不是一个提交包含很多代码。导致难以回溯(review)

缺点

  1. 由于每个机器都有完整的本地仓库,所以初次获取(Git:clone)会比较耗时。
  2. 由于每个机器都有完整的本地仓库,所以本地存储会比中央式要高。

Git最基本的工作模型

  1. 从GitHub/Gitee把中央仓库clone到本地(git clone
  2. 把写完的代码提交
    • git add 文件把文件添加到缓存区
    • git commit 提交到本地仓库
    • 在此过程中使用git status来查看工作目录的状态
    • 每个文件有"change/unstaged"(已修改)/"staged"(已修改并暂存)/"commited"(已提交)/"untracked"(未追踪)
  3. 提交一次或多次后,把本地提交push到中央仓库(git push)

Git中的引用

  1. HEAD:当前commit的引用
  2. branch 分支
  3. master默认的branch

branch

  1. 创建branch(git branch branch1xx)
  2. 切换branchgit checkout branch1xx
  3. 创建并切换到branch(git checkout -b branch1xx)
  4. 删除branchgit branch -d branch1xx

扔物线大神的小结:

  1. HEAD 是指向当前 commit 的引用,它具有唯一性,每个仓库中只有一个 HEAD。在每次提交时它都会自动向前移动到最新的 commit 。
  2. branch 是一类引用。HEAD 除了直接指向 commit,也可以通过指向某个 branch 来间接指向 commit。当 HEAD 指向一个 branch 时,commit 发生时,HEAD 会带着它所指向的 branch 一起移动。...
  3. master 是 Git 中的默认 branch,它和其它 branch 的区别在于
  • 新建的仓库中的第一个 commit 会被 master 自动指向;
  • 在 git clone 时,会自动 checkout 出 master。
  1. branch 的创建、切换和删除:
  • 创建 branch 的方式是 git branch 名称 或 git checkout -b 名称(创建后自动切换);
  • 切换的方式是 git checkout 名称;
  • 删除的方式是 git branch -d 名称。

merge: 合并commits

  1. 适用场景
    • 合并分支
    • pull的内部操作
  2. 放弃解决冲突,取消merge(git merge --abort)

扔物线大神的小结

  1. merge 的含义:从两个 commit「分叉」的位置起,把目标 commit 的内容应用到当前 commit(HEAD 所指向的 commit),并生成一个新的 commit;
  2. merge 的适用场景:
  • 单独开发的 branch 用完了以后,合并回原先的 branch;
  • git pull 的内部自动操作。
  1. merge 的三种特殊情况:
  • 冲突
    原因:当前分支和目标分支修改了同一部分内容,Git 无法确定应该怎样合并;
    应对方法:解决冲突后手动 commit。
  • HEAD 领先于目标 commit:Git 什么也不做,空操作;
  • HEAD 落后于目标 commit:fast-forward。...

Feature Branching:最流行的工作流

  1. 核心内容:
    1. 任何新功能或者bug修复都创建新的branch来写/
    2. branch写完后,合并到master,然后删掉这个branch

git add . 直接将工作目录下的所有改动全部放进暂存区。

git log 查看历史记录

参数配置:

  • git log -p 查看详细历史
  • git log --stat查看简要统计
  • git show查看具体的commit
  • git diff查看未提交的内容

git rebase 改变commit序列的基础点

git rebase 目标基础点
rebase是站在需要被rebase的commit上进行操作的,这点和merge不同

commit --amend 对最新的一条commit进行修正

注意:commit --amend不是直接修改原commit内容,而是生成一条新的commit

rebase -i 交互式rebase

使用方式是 git rebase -i 目标commit;
在编辑界面中指定需要操作的 commits 以及操作类型;
操作完成之后用 git rebase --continue 来继续 rebase 过程。

撤销最新的提交

git reset --hard 目标commit

撤销不是最新的请求

  1. git rebase -i在编辑界面中删除想撤销的 commits
  2. git rebase --onto在 rebase 命令中直接剔除想撤销的 commits
    方法有两种,理念是一样的:在 rebase 的过程中去掉想撤销的 commit,让他它消失在历史中。

实践部分

创建本地仓库

git init

将本地仓库关联到远端仓库

git remote add origin git@github.com:michaelliao/learngit.git

提交本地更新并提交到远端仓库

git add . //提交本地所有
git commit -m 'commit'
git push -u origin master

p.s. 这里可能有同学会问怎么提交所有文件但又忽略某些文件呢?

可以通过修改.gitignore 文件文件来过滤你不要上传的文件

具体看这

具体场景分析

本地提交的分支覆盖到远端主分支上 如何回退远端分支呢

  1. 通过git log查看本地提交记录
  2. 通过git reset --hard <id>重设本地的记录为之前某一时刻的记录
  3. 通过git push -f origin master强制覆盖远端分支
  4. 这时候你想保留之前自己本地的记录可以使用git relog查看自己的记录
  5. git reset --hard <id>修改本地记录为之前保存的本地记录即可

参考资料:抛物线大佬的git小册
如果朋友们还是不太理解清楚,可以自己动手实验一下,古语有云:“好记性不如烂笔头”,祝大家都有所收获。
Git在线练习地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • 查看、添加、提交、删除、找回,重置修改文件 git help # 显示command的help git sho...
    Swiftor阅读 2,111评论 0 2
  • 1. GIT命令 git init在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个re...
    江边一蓑烟阅读 798评论 0 0
  • 朋友整理的,放这里偶尔过来看看 一、基本介绍 首先,Git作为版本控制系统,他的原理与SVN为首的集中式版本控制系...
    allenzhan阅读 994评论 0 3
  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,767评论 0 10
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,827评论 0 9