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

276 阅读5分钟

作为一个码代码的小白,人人都应该使用版本控制工具来管理自己的代码,这样才能有条不紊的写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在线练习地址