Git - 基本使用

 我们从一点一滴开始学习Git.满足我们日常的开发需求

 

 1. 安装

  1)Windows下的安装

    到Git for Windows上下载git bash 即可在命令行中愉快的使用git了

  2)Linux下的安装

    源码安装:

http://git-scm.com/ 或github上下载源代码

wget -c https://github.com/git/git/archive/v2.23.0.tar.gz

tar zxvf v2.23.0.tar.gz

// 可根据 目录下的安装文件进行安装 INSTALL

make prefix=/usr all doc info

make prefix=/usr/local install


git安装完毕。/usr/local/bin

  yum安装:

yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

$ yum -y install git-core

$ git --version
git version 1.7.1

 

 

 

 

2.基础概念

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库

 

  图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。

  图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

  图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

  当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

  当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

  当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

  当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。

  当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

  当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

 

3. 配置信息

   git config 的工具,专门用来配置或读取相应的工作环境变量

  这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

  1)查看配置信息

git config --list

  编辑配置内容

vim ~/.git/gitconfig

  查看某个配置

git config user.name  

  2)配置个人名称和邮箱地址

1 $ git config --global user.name "name"
2 $ git config --global user.email email@email.com

  3)设置使用的编辑器

$ git config --global core.editor vim

  4)差异分析工具

$ git config --global merge.tool vimdiff

  

  

 4.常用使用

  1)查看git版本

    git --version

 

  2)将工作区中的文件添加到暂存区

    git add 文件名称/*(提交所有)

 

  3) 将暂存区中的文件退回到未添加的状态

    git rm --cached 要退回的文件

 

  4)创建版本库

    使用当前目录为GIT仓库,则直接使用    git init 就会在当前目录下产生一个.git目录   该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。

    制定目录为Git仓库,   则  git init 目录名称

 

  5)已有版本库的情况

    直接将现有的版本库克隆到本地      

1 git clone <repo>//仓库
2 
3 git clone <repo> <directory>  //指定目录
4 
5 
6 //事例
7 $ git clone git://github.com/xing/test.git test
//可以指定用户名/邮箱+密码
git clone git://用户名:密码@github.com/xing/test.git test

 

  6)显示版本信息(状态)

1 git status  //显示代码完整状态信息(相当于git status --long)
2 
3 git status -s //显示代码简短状态信息(只显示变化的文件)

  ??: 新增加的状态但是还没有提交到缓存中

       A:已经将工作区的文件提交到了缓存中

       AM: 已经提交过缓存文件但是又进行了修改,   (这种情况: 修改之后  再次执行git add 即可)

 

  7)查看执行 git status 的结果的详细信息(都是针对已经进行add的文件)

    git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别

    •   尚未缓存的改动:git diff
    •   查看已缓存的改动: git diff --cached
    •   查看已缓存的与未缓存的所有改动:git diff HEAD
    •   显示摘要而非整个 diff:git diff --stat

  8)将缓存区中的内容提交到版本库(使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中)

    git commit 命令 提交到版本库

    Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址

    对于已经添加过缓存区的文件,由于后期的修改,需要进行重新add 并提交  所以可以进行简化处理

    

git commit -am '修改 hello.php 文件' // -a 直接进行提交 -m 注释信息

  

      9取消已缓存的内容

    

git reset HEAD   // 使用  git reset HEAD -- 文件名称

   git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存。

 

5. 版本分支

 1) 创建分支

git checkout -b 分支名称     创建分支 并切换到该分支之下

or

git brank 分支名称
git checkout 分支名称


git push origin 分支名。# 提交分支到远程仓库
 

 

 2)删除分支

git branch -d 分支名称

git branch -D 分支名称 # 强制删除

git push origin --delete 分支名。# 删除远程分支

3)查看分支

git branch # 查看当前分支

git branch -a # 查看所有分支

 

 

 

 

 6.忽略文件

  一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。来看一个实际的例子:

  

$ cat .gitignore
*.[oa]
*~

第一行告诉 Git 忽略所有以 .o.a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。此外,你可能还需要忽略 logtmp 或者 pid 目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。

文件 .gitignore 的格式规范如下:

  • 所有空行或者以注释符号 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。

我们再看一个 .gitignore 文件的例子:

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为 txt 的文件
doc/**/*.txt

 

6. 版本回退

1. 查看历史提交的版本
git log 

格式化: git log --pretty=oneline


2.版本回退
根据ID回退到指定的版本

git reset --hard 7222c8f6be2d663982faa98dffe2647966b438b1


3. 推送本地到远程仓库

git push origin HEAD --force


4. 查看命令操作历史

git reflog

5. 查看远程代码库信息
git remote show origin

更多撤销相关操作:  https://zhuanlan.zhihu.com/p/468307735

 

posted @ 2018-04-12 16:16  X-Wolf  阅读(302)  评论(0编辑  收藏  举报