Git 学习

BASE INFORMATION

安装

  • 安装完成先设置名字和Email地址
$ git config --global user.name "your name"
$ git config --global user.email "your email"
  • config: 配置 --global: 表示这台机器所有仓库都用这个config

创建版本库(repository)

  1. 创建空目录
  • $ mkdir 目录名 --创建一个目录
  • $ cd 目录名 --将当前目录移到新建的目录名下
  • $ pwd --显示当前目录
  1. 将创建的目录变成git可以管理的仓库:
  • $ git init -- init :初始化

添加文件到缓存区

  • $ git add 文件名  --预提交,可以写多个add,然后最后一起用一个commit,看注b
  • $ git commit -m "提交说明"
  • 注: a.-m 后面接这次提交的说明,也是这个版本的描述信息
          b. $ git add a.txt
             $ git add b.txt
             $ commit -m "提交了两个文件a和b"

掌握仓库当前状态

  • $ git status -- 包括:是否有添加到缓存区的改动、是否有改动的文件。如果目录增加了文本文件也会有提示,但是如果是文件夹则没有任何提示 status:状态
  • $ git diff <文件名> -- 比较现在的文件和缓存区或者仓库里相同的文件有什么改动(若缓存区有相同文件则比较缓存区的否则比较仓库的;如果在文件的最后一行添加换行符(包括在后面增加另一行句子)则最后一句也视为被改动过)

版本回退

  • $ git log --pretty=oneline -- 查看所有版本历史,其中head指示的是当前版本。参数--pretty=oneline表示美化输出的信息,可以去掉
  • $ git reset --hard HEAD^ 或者 commit id 前几位 -- 回退到上一个版本或者commit id 对应的版本,并且工作区的内容也会跟着改
  • $ git reflog -- 查看命令历史,可以找到所有版本的commit id
  • 注:git log 与 git reflog 的区别:
    1. git log查到的是每个commit id 的形成日期和作者,且只能看到当前版本往前的版本id,版本回退后,是看不到当前版本之后的版本信息的
    2. git reflog 可以查看每一次commit id 的变动情况,且所有版本id都能查得到。

git中的三个区

  • 工作区就是我们版本库所在的电脑的目录
  • stage是缓存区,$ git add . 文件就是添加到这里,有时也被称为index区
  • master是最终区,也是放置所有分支的区
  • $ cat <文件名> -- 展示的是工作区文件的内容

撤销修改

  • $ git checkout -- <文件名> -- 将工作区的文件恢复为跟缓存区或者版本库的一样(缓存区优先)
  • $ git reset HEAD <文件名> -- 把对应文件暂存区的修改撤销掉(unstage),工作区内容不改变(例如在reset之前你还在工作区添加了句子,该句子还依然存在)

删除文件

  • $ rm <文件名> -- 删除工作区中的文件 (此时库文件不会改变)
  • $ git rm <文件名> ,然后再 $ git commit -m "描述"  -- 将删除提交到缓存区,然后再commit到master,把master中的对应文件也删除
  • $ git checkout -- <文件名> -- 工作区文件被误删时,可以用来还原( 将工作区的文件恢复为跟缓存区或者版本库的一样)
  • 猜想:$ cat 和 $ rm 都是对工作区的操作,$ git rm 是对版本库的操作,所以~~~

添加到远程库

  1. 创建、添加SSH Key(有了这个才可以推送东西到远程库)
  • 在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
    • $ ssh-keygen -t rsa -C "youremail@example.com"
    • 秘钥生成后复制id_rsa.pub(公钥)里面的内容到Github对应ssh秘钥的对应位置
  1. 链接到远程库
  • $ git remote add origin <远程库地址> -- 关联到远程库
  • $ git push -u origin master -- 将当前分支master推送到远程(第一次推送master时要加上-u参数,以后推送更改时直接写$ git push origin master便可)
  • remote -- 遥远地

克隆一个本地库

  • $ git clone 远程库ssh地址或者http地址 -- 将一个远程库完整地克隆到本地当前目录(此时本地库master与该远程库master已经自动关联了)

分支管理

  • $ git checkout -b dev -- 创建一个冰切换到名为dev的分支(注意与命令$ git checkout -- <文件名> 的区别),该命令相当于下面两个:

    • $ git branch dev
    • $ git checkout dev
  • $ git branch -- 查看分支列表

  • $ git merge dev -- 将dev分支合并到当前分支

  • $ git branch -d dev -- 删除dev分支

  • 查看分支的合并情况:
    $ git log --graph --pretty=oneline --abbrev-commit ------ graph 曲线图 abbrev 缩写,--abbrev-commit 就是让commit id 缩写的意思
    注意:如果合并分支产生冲突时,并不会生成一个新的提交,但是工作区的文件会有改变,提示那里冲突了

  • 禁用fast forward模式合并

    • $ git merge --no-ff -m "新提交的描述信息" <分支名字>
    • fast forward 模式的分支合并
    • 也就是说禁用fast forward 模式会生成一个新的提交,新的commit id
  • 在dev分支的时候add,切换到master分支时可以commit,也就是说dev分支add的内容可以到master分支commit

创建利用bug分支 -- 用以修复开发过程修复bug

  • $ git stash -- 将工作区的改动以及缓存区的东西先用一个地方保存起来,保持working  tree的干净(可多次stash)
  • $ git stash list -- 查看stash列表
  • $ git stash apply stash@{0}-- 将stash的对应内容(stash@{0})恢复到工作区以及缓存区(如果不加参数stash@{}默认是恢复最近一条)
  • $ git stash drop -- 删除 stash储存的东西
  • $ git stash pop -- 上面两个命令的合体
  • $ git cherry-pick -- 将commit id 提交所做的修改直接复制到当前分支(一般用在在master修复bug之后快速修复分支上相同的bug)

feature分支

  • $ git branch -D feature-valcan -- 强制删除还未被合并的名为feature-valcan的分支

多人协作

  • $ git push origin dev -- 将分支dev推送到远程库origin
  • $ git checkout -b dev origin/dev 创建远程origin的dev到本地
  • $ git pull -- 抓去远程库对应的文件
  • $ git branch --set-upstream-to=origin/dev dev -- 制定本地dev与远程dev间的链接

优化

one

  • $ git rebase -- 减少log分叉线
  • $ git config --global color.ui true -- 让git显示颜色,使输出更醒目

two 忽略特殊文件

  • 在git工作区的根目录下创建一个.gitignore文件,然后把要忽略的文件名字填进去,然后把.gitignore提交到git就行了
  • 可以对.gitignore做版本管理
    • $ git add -f <文件名> -- 强制添加被忽略的文件
    • $ git check-ignore -v <文件名> -- 检查.gitignore中的<文件名>规则

three 配置别名

  • $ git config --global alias.st status -- 以后st就表示status
  • 常用别名:
    cocheckout
    ci
    commit
    br==branch
    $ git config --global alias.unstage 'reset HEAD'
    $ git unstage test.py 就相当于 $ git reset HEAD test.py
    $ git config --global alias.last 'log -1' ,此时 $ git last 就显示最近的一次提交了
    $ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

four

  • 每个仓库的Git配置文件都放在.git/config文件中,而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中,配置别名也可以直接修改这个文件。

标签

  1. 切换到需要打标签的分支上
  2. 标签和commit挂钩
  3. 创建标签
  • $ git tag v1.0 -- 将标签1.0打到最新提交的commit 上
  • $ git tag -a v2.0 -m "version 0.1 released" f52c633 -- 将标签2.0打到id为f52c633的commit上。-a后面接标签名,-m后面接标签说明
  1. 标签操作
  • $ git tag -- 查看标签

  • $ git show v1.0 -- 查看标签1.0的信息

  • $ git tag -d v1.0 -- 删除标签1.0

  • 删除远程标签

    • $ git tag -d v1.0
    • $ git push origin  :refs/tags/v1.0
  • $ git push origin v1.0 -- 推送标签1.0到远程

  • $ git puh origin --tags -- 一次推送所有还没推送的本地标签到远程

PS

  • 不要用window自带的记事本编辑文件,因为在保存utf-8编码的文件时会自动在文件的开头添加0xefbbbf(十六进制的)字符
  • 中汉互译
    on branch master -- 在分枝主主枝上
    modified -- 修改
    insertion -- 添加的东西 
    deletion -- 减少的东西
    commit -- 版本 n. (head指示的是当前版本)
    commit id -- 可以翻译成版本号
    untracked files -- 未追踪的文件 (应该是指还没有提交给仓库的文件)
    master -- 主要的
    pretty=oneline -- 美化=一条线
    reflog -- 回流
    working tree clean -- 表示工作区的更改已经commit到了分支上(如果仅仅只是add到缓存区,则还不能提示working tree clean)
  • Q:如何比较现在版本与上一个版本的不同?
posted @ 2019-12-04 15:13  Mrzhozho  阅读(134)  评论(0)    收藏  举报