《GitHub 入门与实践》阅读笔记(第4章)

1. 基本操做

git init

$ mkdir git-tutorial # 新建目录
$ cd git-tutorial # 进入目录
$ git init # 初始化仓库
  1. 执行初始化操做会生成一个 .git 目录(该目录存储着管理当前目录内容所需的仓库数据);
  2. 文件的编辑等操做在工做树中进行,而后记录到仓库中,以此管理文件的历史快照;
  3. 若是想将文件恢复到原先的状态,能够从仓库中调取以前的快照,在工做树中打开。

git status

$ git status    # 显示 Git 仓库的状态

git add

$ git add README.md     # 向暂存区添加文件
  1. 若是这是用 Git 仓库的工做树建立了文件,那么该文件并不会被记入 Git 仓库的版本管理对象当中(Untracked files);
  2. 要让文件成为管理对象,须要加入到暂存区(Stage 或者 Index);
  3. 暂存区是提交以前的一个临时区域。

git commit

$ git commit -m "First commit" # 保存仓库的历史记录
  1. 该命令将当前暂存区中的文件实际保存到仓库的历史记录中;
  2. 经过这些记录,咱们能够在工做树中复原文件;
  3. -m 参数后面的字符串称做提交信息,是对这个提交的概述;
  4. 若是要记述详细信息,请不加 -m,直接执行 git commit 命令。

git log

$ git log # 查看提交日志
$ git log --pretty=short # 只显示提交信息的第一行
$ git log README.md # 只显示指定目录、文件的日志(README.md)
$ git log -p # 显示文件的改动
$ git log -p README.md # 查看README.md 文件的提交日子以及提交先后的差异

git diff

$ git diff # 查看工做树和暂存区的差异
$ git diff HEAD # 查看工做树和最新提交的差异
PS:不妨养成这样一个好习惯:在执行 git commit 命令以前先执行 git diff HEAD 命令,查看本次提交与上次提交之间有什么差异,等确认完毕后再进行提交。这里的 HEAD 是指向当前分支中最新一次提交的指针。

2. 分支的操做

master -----> master
        |---> feature-A
        |---> fix-B
  1. 建立分支后,每每会存在多个最新代码状态;
  2. master 分支是 Git 默认建立的分支,基本上全部开发都是以这个分支为中心进行的;
  3. 不一样分支进行不一样的做业,等该分支完成以后再与 master 分支合并。
/---\ fix-B
master ---------------> master
        \--------/ feature-A

git branch

$ git branch # 显示分支一览表
* master # master 分支左侧标有 `*`(星号),表示当前所在分支

git checkout -b

$ git checkout -b # 建立、切换分支

$ git checkout -b feature-A # 切换到 feature-A 分支并进行提交(下面两条命令等同该条命令)

$ git branch feature-A # 建立 feature-A 分支
$ git checkout feature-A # 将当前分支切换为 feature-A 分支

$ git checkout master # 切换到 master 分支

$ git checkout - # 切换回上一分支
  1. Git 与 SVN 不一样,建立分支时不须要链接中央仓库,这让建立分支变得相对轻松;
  2. 当今大部分工做流程都用到了 特性(Topic)分支,即集中实现单一特性(主题),除此以外不进行任何做业的分支;
  3. 平常开发中,每每会建立数个特性分支,同时在此以外再保留一个随时能够发布软件的稳定分支;
  4. 稳定分支一般由 master 分支担当;
  5. 基于特定主题的做业在特性分支中进行,主题完成后再与 master 分支合并。只要保持这样一个开放流程,就能保证 master 分支能够随时供人查看。这样一来,其余开发者也能够放心大胆地从 master 分支建立新的特性分支;
  6. 主干分支是特性分支的原点,同时也是合并的终点。一般人们会用 master 分支做为主干分支;
  7. 有时咱们须要让这个主干分支老是配置在正式环境中,有时又须要用标签 Tag 等建立版本信息,同时管理多个版本发布。拥有多个版本发布时,主干分支也有多个。

git merge

下面演示如何将分支 feature-A 合并到 mastergit

首先,切换到 master 分支:github

$ git checkout master 
Switch to branch 'master'

而后合并 feature-A 分支:编辑器

为了在历史记录中明确下本次分支合并,咱们须要建立合并提交。所以在合并时加上 --no-ff 参数。
$ git merge --no-ff feature-A

随后编辑器会启动,用于录入合并提交的信息。随后,feature-A 分支的内容就合并到 master 分支中了。学习

git log --graph

$ git log --graph # 用图表形式输出提交日志
该命令能够清楚看到特性分支的建立以及合并。

3. 更改提交的操做

git reset

/------> fix-B
master ---------------> master
        \------------/ feature-A
$ git reset --hard fd0cbf0d4a234f67sjdkfjklbj6786a # 回溯历史版本
HEAD is now at fd0cbf0 Add index
  1. 要让仓库的 HEAD、暂存区、当前工做树回溯到指定状态,须要用到 git reset --hard 命令,只要提供目标时间点的哈希值,就能够彻底恢复至该时间点的状态;
  2. 使用 git reflog 命令能够查看当前仓库执行过的操做日志,只要不进行 Git 的 GC (Garbage Collection,垃圾回收),就能够经过日志随意调取近期的历史状态,就像给时间机器指定一个时间点,在过去将来中自由穿梭通常;
  3. 即使开发者错误执行了 Git 操做,基本也均可以利用 git reflog 命令恢复到原先的状态,请务必牢记!(由于 git reflog 命令打印出来的操做前面都有版本哈希码,能够拿来使用)

git commit --amend

$ git commit -amend # 修改提交信息

git rebase -i

$ git rebase -i # 压缩历史

4. 推送至远程仓库

git remote add

$ git remove add origin git@github.com:github-book/git-tutorial.git # 添加远程仓库

git push

$ git push -u origin master # 推送至 master 分支

$ git checkout -b feature-D # 建立 feature-D 分支
$ git push -u origin feature-D # 推送至 feature-D 分支
  1. 参数 -u 能够在推送的同时,将 origin 仓库的 master 分支设置为本地仓库当前分支的 upstream(上游);
  2. 添加了这个参数,未来运行 git pull 命令从远程仓库获取内容时,本地仓库的这个分支就能够直接从 originmaster 分支获取内容,省去了另外添加参数的麻烦。

5. 从远程仓库获取

git clone

$ git clone git@github.com:github-book/git-tutorial.git # 获取远程仓库
$ git branch -a # 查看当前分支的相关信息
PS:参数 -a 能够同时显示本地仓库和远程仓库的分支信息。

git pull

git pull origin feature-D # 获取最新的远程仓库分支

6. 帮助深刻理解 Git 的资料

  • Pro Git 由就任于 GitHub 公司的 Scott Chacon 执笔,是一部零基础的 Git 学习资料。
  • LearnGitBranching 是学习 Git 基本操做的网站。注重树形结构的学习方式很是适合初学者,点击右下角的地球标志还可切换各类语言进行学习。
  • tryGit 可让咱们正在 Web 上一边操做一边学习 Git 的基本功能(只有英文版)。
相关文章
相关标签/搜索