使用git 一段时间了,做了不少零星的笔记,总结整理

概要:

  • 安装(系统:archlinux)
  • 初始化一个环境
  • 对.git 目前系统介绍
  • 基本代码管理使用
  • 分值的创建与合并
  • 解决冲突
  • 其他学习
  • 扩展

安装:

$  apt-get install git     # ubuntu环境
$  sudo pacman -S git  # archlinux

初始化一个环境

新建一个文件夹,进入该文件夹,运行:

$ git init     #会在你的当前目录中创建一个 .git 的子目录

对.git 目录介绍

我们先看看此目录系统都有一些什么,运行tree命令得结果:

        byronlee@byronlee:~/workspace/ruby/temp/tem/.git$ tree
        .
       ├── branches      # 新版的Git已经不再使用这个目录,所以大家看到它 一般会是空的
       ├── config               # 项目的配置信息

       ├── COMMIT_EDITMSG   # 保存着上一次提交时的注释信息

       ├── description   # 项目的描述信息
       ├── HEAD    # 项目当前在哪个分支的信息
       ├── hooks   # 默认的“hooks” 脚本文件
       │   ├── applypatch-msg.sample
       │   ├── commit-msg.sample
       │   ├── post-update.sample
       │   ├── pre-applypatch.sample
       │   ├── pre-commit.sample
       │   ├── prepare-commit-msg.sample
       │   ├── pre-rebase.sample
       │   └── update.sample

       ├── index   # 索引文件,git add 后把要添加的项暂存到这里

       ├── info  / # 里面有一个exclude文件,指定本项目要忽略的文件 #,看一下这里
       │   └── exclude
       ├── log   #各个refs的历史信息

       ├── objects  # 这个目录非常重要,里面存储都是Git的数据对象# 包括:提交(commits), 树对象(trees),二进制对象 #(blobs),标签对象(tags)。
       │   ├── info
       │   └── pack
       └── refs    # 标识着你的每个分支指向哪个提交(commit)
            ├── heads
            └── tags

       9 directories, 12 files

对相应的主要文件的作用一一介绍:

  1. HEAD 文件 , 该文件的 内容:
  ref: refs/heads/master
  索引指向: 项目根目录/.git/refs/heads/master文件
   =》HEAD 文件中的内容其实只是包含了一个索引信息,并且,这个索引将总是指向你的项目中的当前开发分支。
  
  1. config 文件
    • 包含你为本git 项目配置的信息,如用户名,邮箱,分支名称,以及对应的url,等,如:
  [user]    //本项目git用户
      email = lbyronlee@gmail.com
      name = Byronlee
  [alias]    // 常用命令的别名
     lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --
     ls = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short
     ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
     rl = reflog ; 查看所有git操作日志
     gl = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr,%an)%Creset' --abbrev-commit --date=relative ;查看日志
,包含路线图
     l = shortlog -s -- ; 查看各成员所提交日志
     st = status -s
     cl = clone
     ci = commit -a
     ca = commit --amend
     co = checkout
     br = branch
     mt = mergetool ; Run merge conflict resolution tools to resolve merge conflicts
     merge = merge --no-ff ; 需要保持清晰的路线图需要使用这个合并
     rsh = reset --hard ; 舍弃本地所有修改
  [remote "origin"]   //各种分支
     url = git@github.com:Byronlee/yicheng-checkon.git
     fetch = +refs/heads/*:refs/remotes/origin/*
  [branch "master"]
     remote = origin
      merge = refs/heads/master
  [remote "task"]
     url = git@task.zhiyisoft.com:/yicheng/yicheng-checkon.git
     fetch = +refs/heads/*:refs/remotes/task/*
  [remote "yichen"]
     url = git@github.com:zhiyisoft/yicheng-checkon.git
     fetch = +refs/heads/*:refs/remotes/yichen/*
  
  1. objects 子目录
    • 它包含了你的项目中的所有对象,我们不必直接地了解到这些对象内容,我们应该关心是存放在这些对象中的项目的数据。
  2. refs 子目录
    • 它用来保存指向对象的索引。子目录 refs 包含着两个子目录叫 heads 和 tags,就像他们的名字所表达的意味一样:他们存放了不同的开发分支的头的索引, 或者是你用来标定版本的标签的索引。
    • 请注意 :master 是默认的分支,这也是为什么 .git/HEAD 创建的时候就指向 master 的原因,尽管目前它其实并不存在。 git 将假设你会在 master 上开始并展开你以后的工作,除非你自己创建你自己的分支。
  3. 这只是一个约定俗成的习惯而已
    • 实际上你可以将你的工作分支叫任何名字,而不必在版本库中一定要有一个叫 master 的分支,尽管很多 git 工具都认为 master 分支是存在的。

现在已经创建好了一个 git 版本库,但是它是空的,还不能做任何事情

基本代码管理使用

对一个文件进行一次完整的git 基本操作:

  • 新建一个文件 byronlee.rb
  • 用git 跟踪此文件  * $git add byronlee.rb // 也可以 git add . (表示跟踪但前文件夹下的全部文件)
  • 查看当前git 状态 $ git status
  • 可以用编辑器,编辑 byronlee.rb 文件。再执行步揍3操作。可以看出,git 给你罗列出了那些已跟踪的文件发生了改变
  • 将发生改变的文件进行一次提交 $ git commit -m " //你提交时需要注释的内容”

以上就基本完成一次简单的git 跟踪一个文件操作

当然最好每发生一次改变就提交一次。当你提交过后,在用步凑3去查看状态,就会提示没有内容改变。

但是commit 提交只是提交到你的本地git仓库,如果你是远程开发,需要提交到远程仓库。需要在步凑5之后 在执行:

$ git push origin master // origin 表示远程仓库的名称,master表示远程仓库的分支

拉远程仓库的代码

$ git pull origin master

注意:

  • git add 实际上是个脚本命令,它是对 git 内核命令 git update index 的调用。因此上面的命令和下面的命令其实是等价的:$ git-update-index(但是 我测试,不能用,需要探讨)
  • 应该建立一个清晰的概念就是,git addgit update index 只是刷新了 git 的跟踪信息,新添加的跟踪文件中的内容并没有提交到 git 的内容跟踪范畴之内。
  • 我们可以随意使用 $ git status 来查看当前状态
  • 每次我们修改我们的一追踪的文件后提交 都要先 git add “changeg file”后才能 使用 git commit ,其实,如果要提交的文件都是已经纳入 git 版本库的文件,我们不必那样做,下面的命令是等价:$ git commit -a -m “new day for git”

常用命令:

  • 所有文件以及跟踪,且都发生了改变,这是可以用$ git add -u 把所有的跟踪且改变的文件刷新内容。
  • 提交内容到版本库:$ git commit // git commit -m “your description”
  • 比较两个文件或者分支的不同:git diff
  • $ git diff file_name1 file_name2 // 查看他们的不同
  • 查看修改、提交记录 : $ git log
  • 创建分支:$ git branch branch_name
  • 查看当前分支状态: $ git branch
  • 切换分支:$ git checkout branch_name
  • 配置开发者自己的签名和email
      $ git config --global user.name "roredu"
      $ git config --global user.email "roredu@gmail.com"
      注意:这个是全局变量,写在家目录下面的.gitconfig 文件里面的。会影响你本机上的每个一个Git项目,附带提交作者信息,如log。 可以为没有git 项目配置不同的信息,去掉 –global , 为每一个git项目配置的信息就在.git目录中的config 文件中!
      $ git config user.name "roredu"
      $ git config user.email  "roredu@gmail.com"
      注意: 以上这两条命令会写入项目根目录的 .git 目录中的config 文件中
            Git的全局配置文件是存放在”~/.gitconfig”(用户目录下的.gitconfig)文件中
  
  • 修改文件名:$ git mv old_name new_name
  • 删除文件: $ git rm file_name
  • 为你的git 定制编辑器( 每次用 :$ git commit ,而不用 $ git commit -m “msfg” 或者 $ git gommit -a -m “msg” 提交项目时都会弹出编辑器,让你编辑此次提交的说明或者备注,默认是VIM,编辑器): $ git config --global core.editor emacs // 会被写入 "~/.gitconfig"(用户目录下的.gitconfig)文件中
  • 一个Git项目中文件的状态大概分成下面的两大类
    • 未被跟踪的文件(untracked file)
    • 已被跟踪的文件(tracked file),(而这类又分为三小类)
      • 被修改但未被暂存的文件(changed but not updated或modified)
      • 已暂存可以被提交的文件(changes to be committed 或staged)
      • 自上次提交以来,未修改的文件(clean 或 unmodified)

分支创建和使用:

  • 查看分支: $ git branch
  • 创建分支: $ git branch branch_name
  • 切换分支: $ git checkout branch_name
  • 查看分支之间的差异: $ git diff branch_name // 查看但前分支和 分支 branch_name 的差异
    • 注意:
    • 当我们使用 $ git branch branch_name 创建一个名branch_name的分支后,在 ./git/refs/heads/ 文件夹下 就会自定增加一个 名为 branch_name 的文件夹。文件夹里的内容是一条索引
    • 当没有切换分支之前,默认为主分支master,
    • 没有切换分支钱:./git/HEAD 文件里 内容是: ref: refs/heads/master // 指向主分支
    • 当使用$ git checkout branch_name切换分支过后./git/HEAD文件里的内容是:ref: refs/heads/branch_name // 指向新建分支
  • 对./git/refs/heads/master 内容详解
    • 查看 ./git/refs/heads/master 文件的内容为一SHA1哈希串值:8aab2d4318840b4f95cc15edcf48d8b3ce1cf2f5也就是一个对象名
    • 我们再看看这是一个什么类型的对象:$cat refs/heads/master | xargs git cat-file -t 得到 commit
    • “master”文件里面存有主分支(master)最新提交的“对象名”;我们根据这个“对象名”就可以可找到对应的树对象(tree)和二进制对象(blob),简而言之就是我能够按“名”索引找到这个分支里所有的对象。

分支的合并:

查看当前分支 是否已经全部没提交

$ git commit -a -m "msg"

// 或者 $ git diff 都通过 // 但是 $ git diff branch_name 与其他分支比较可能就不能通过

就可以分支合并了,分支合并必须在主分支上, 运行

 $ git merge branch_name

然后在 $ git diff branch_name 都全部通过了。分支已经合并!

$git branch -d branch_name 再删除分支

注意: 如果你想要删除的分支还没有被合并到其它分支中去,那么就不能用git branch -d来删除它,需要改用git branch -D来强制删除。

git 的基本使用就到这了

但这就只是入门,更深入学习:


声明:未经申明,所有文章,皆为原创,版权均属@Byronlee所有。若需转载,请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!



blog comments powered by Disqus