soufal's Home.

Git笔记

Word count: 2,126 / Reading time: 8 min
2018/06/16 Share

Git分布式版本控制系统:

学习廖雪峰的git教程 笔记( 图片转自廖雪峰 )。

一、简介

  • 随时掌握工作区的状态,使用git status命令。
  • 如果git status 告诉你有文件被修改过,可以用git diff 查看修改内容。
  • git中进行修改后可以保存一个快照,称为commit,如果文件被删除,可以通过最近一个commit恢复。
  • 使用git log命令来查看历史记录。
    • --pretty=oneline参数简要输出相关信息。
  • 回退到上一个版本:
    • git中,HEAD表示当前版本,上一个版本就是HEAD^,上上个版本就是HEAD^^。(上100个版本HEAD~100
    • 把当前版本回退分层上一个版本,使用git reset --hard <HEAD^>命令。
    • 回到未来的版本,使用git reset --hard <commit ID>(前提是命令行窗口未关闭,版本号可以写前几位即可)
    • git reflog可以记录操作的每一条命令。

二、工作区和暂存区

  • 工作区(working directory)
    创建的文件夹就是一个工作区。
  • 版本库(Repository):
    工作区中隐藏的目录.git是Git的版本库。
    版本库中存有(隐藏目录):
    • stage(index)暂存区
    • Git自动创建的第一个分支:master.
    • 指向master的一个指针HEAD
    • 在往Git版本库中添加文件时,分两步执行:
      • 1、用git add把文件加进去,实际上就是把文件修改添加到暂存区;
      • 2、用git commit提交更改,实际上就是把暂存处的所有内容提交到当前分支master

需要提交的文件修改后通通放到暂存区,然后,一次性提交暂存区的所有修改。

三、管理修改

  • Git跟踪并管理的是修改,而非文件。
    每次修改文件过后,如果不用git add将文件提交到暂存区,同样的文件也不会加入到commit中。

    1、撤销更改

    git add 之前发现文件修改有错,可以使用git checkout -- [filename]丢弃工作区的修改。
    命令git checkout -- readme.txt有两种情况:
    1、文件readme.txt自修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态。(还未使用git add
    2、文件已经被添加到暂存区后,又做了修改,撤销修改就回到添加到暂存区后的状态。(已经使用了git add后对文件进行了修改)
    也就是让文件回到最近一次git commitgit add状态

    如果git checkout -- file命令没有使用--,就会变成“切换到另一个分支”的命令。

  • 在修改文件并使用了git add将文件放到了暂存区后,可以使用git reset HEAD <file>命令可以把暂存区的修改撤销掉(unstage),重新将文件放回工作区。

四、删除文件

当需要删除已给文件时,在工作区将文件删除后,需要从版本库删除文件git rm <file>。然后使用git commit -m ""进行提交,这样工作区和版本库都将该文件删除了。
如果在工作区中删错了文件,可以使用git checkout -- <file>将误删的文件恢复到最新版本实际上该命令是用版本库里的版本替换工作区的版本

五、远程仓库

  • 关联github
  1. 创建SSH Key:使用ssh-keygen -t rsa -C "youremail@example.com"创建秘钥。
  2. 进入.shh文件夹复制id_rsa.pub公钥中的内容到Github中的Add SSH Key中。
    如果有多台电脑,则可以在每一台电脑中生成一个新的Key并添加到github中。
  • 添加远程库:
    • 在github上新建一个仓库后,同本地已有的仓库关联,然后把本地仓库推送到Github库:使用git remote add origin https://github.com/soufal/my_git.git,这样添加后的远程库的名字就为origin,是git的默认叫法。
  • 推送:
    • 使用git push -u origin master把本地库的所有内容推送到远程库。
      这里使用加-u的命令是因为第一次推送master分支时,Git不但会吧本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或拉取时就可以简化命令了。
  • 从远程库克隆
    • 可以现在Github上创建一个远程库new,再从远程库克隆到本地。使用git clone https://github.com/soufal/new.git或者git clone git@github.com:soufal/new.git
    • 两者的不同在于:前者使用的是https协议,速度较慢,每次推送都需要输入口令。后者使用的是SSH协议,其速度较快。
    • 六、分支管理

      可以创建一个属于自己的分支,其他人看不到,还可以在原来的分支上继续工作,自己可以在自己的分支上继续工作。需要提交后再提交,可以一次性合并到原来的分支上。

1、创建于合并分支:

Git中,每一次的提交,Git都会把这些提交串成一条时间线,这条时间线就是一个分支。一直在使用的默认分支叫做主分支。即master分支。HEAD严格来说是指向master的,master才是指向提交的。所以可以说:HEAD指向的就是当前分支。
一开始,master分支就是一条线,Git用master指向最新的提交,再用HEAD指向master,就可以确定当前分支以及当前分支的提交点:
image1

当创建新的分支时dev时,git新建一个指针叫做dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
image2

因此可以看出git创建一个分支很快,只需要增加一个指标dev,并修改HEAD的指向即可。修改过后,对工作区的修改和提交就只是针对dev分支了,而master指针不变:

image3

如果在dev上的工作完成了,就可以将dev合并回master上。可以直接将master指向dev的当前提交(正如最开始创建分支一样),就完成了合并:

image4

合并同样也很快,也只需要改指针。
合并完成后,可以删除dev分支,也就是把dev指针删除,删除后就值剩下一个master分支。
image

2、相关命令:

  • 创建dev
    git checkout -b dev
    git checkout命令加上-b参数表示创建并切换。相当于:
1
2
git branch dev  
git checkout dev
  • 可以使用git branch查看当前分支。会列出所有的分支,当前分支前有一个*
    当完成工作提交后,通过git checkout master命令返回master分支。
    然后使用git merge devdev上的工作合并到master上。
    该指令用于合并指定分支到当前分支。
  • 合并完成后使用git branch -d dev删除dev分支。
  • 使用git log可以查看分支合并情况。
  • 使用git log --graph乐意查看分支合并图。

3、分支管理策略

  • 合并分支时,Git会用Fast forward模式,在这种模式下,删除分支后,会丢掉分支信息。
  • 使用--no-ff方式的git merge会强制禁用Fast forward,这样git会在merge时生成一个新的commit,这样可以从分支历史上看出分支信息。 (创建新的commit可以用过加上-m参数实现

在实际开发中,管理分支的几种原则:

  • master分支应该是稳定的,也是仅仅用来发布新版本,平时不在其上进行工作。
  • 工作都在dev分支上,因为dev是不稳定的。
  • 可以在dev上再创建新的分支,和别人协同工作,最后再合并到dev上。如下图所示:
    image5

  • Bug分支:
    Git提供了一个stash功能,可以把当前工作现场“储存”起来,等当前临时工作做完后再恢复现场继续工作: git stash
    • 确定bug需要在哪个分支上修复,就在那个分支上创建新的临时分支。
    • 恢复工作区:使用git stash list查看之前隐藏的工作区。恢复方法有两种:
      • 使用git stash apply恢复,但是恢复后,stash的内容并不删除,需要再使用git stash pop来删除。
      • 使用git stash pop,恢复的同时会把stash的内容也删了。
      • 可以多次stash,使用git stash list查看,然后恢复指定的stash。
        使用git stash apply stash@ {id}
CATALOG
  1. 1. Git分布式版本控制系统:
    1. 1.0.1. 一、简介
    2. 1.0.2. 二、工作区和暂存区
    3. 1.0.3. 三、管理修改
      1. 1.0.3.1. 1、撤销更改
    4. 1.0.4. 四、删除文件
    5. 1.0.5. 五、远程仓库
    6. 1.0.6. 六、分支管理
      1. 1.0.6.1. 1、创建于合并分支:
      2. 1.0.6.2. 2、相关命令:
      3. 1.0.6.3. 3、分支管理策略