git介绍

本文从git的架构入手,介绍git的基本概念和常用命令

还没有安装git的同学可以参考《git安装》

架构图

git架构图
从架构图可以清晰的看到,git的存储空间整体分为4部分。

  1. 本地仓库,也就是图中的workspace,这里是我们操作文件的地方
  2. index,这其实是在.git文件夹下的一个子文件夹,内部存储了git add后的文件,被称为stage
  3. repository,也就是本地的git仓库,通俗点说就是你git clone下来的那个路径
  4. remote,远程仓库,比如最著名的github

生命周期命令

下面从文件的生命周期的调度来看git的命令

  • 最常用的从git仓库down下工程
    git clone xxxx.git

  • 将本地工程转换成git工程
    git init

  • 如果你本地有一个git工程,想要同步到remote repo
    git remote add origin https://github.com/xxxx/xx.git
    但是你想要过滤掉一些文件或者文件夹,name可以创建一个.gitignore文件,文件里添加需要过滤的配置,比如过滤.idea文件夹
    /.idea

  • 如果你本地有个git工程,但是想更换remote仓库
    首先查看remote仓库名称git remote,假如是origin,那么移除此仓库git remote rm origin,再添加新的仓库git remote add origin http://url.git,验证一下git remote -v

  • 对比stage空间和工作空间的文件
    git diff

  • 将工作空间的文件提交到stage空间
    git add xxx.file

  • 对比stage空间和本地仓库的文件
    git diff --cached

  • 提交stage到本地仓库
    git commit -m "your comments"

  • 对比本地和远程仓库
    git diff --stat origin master

  • 整个生命周期跟踪,包括当前工作空间的状态,add的文件,commit的文件
    git status

  • 上传commit到远程仓库
    origin表示远程仓库
    master1表示本地分支名称
    master2表示远程仓库分支名称,如果不写则默认和master1一样
    git push origin master1:master2

  • 查看已经commit的内容

    commitId 可以通过 git log 看到

    git show commitId

分支类命令

  • 创建分支
    git branch $name

  • 切换当前分支
    git checkout $name

  • 合并创建分支和切换当前分支的命令
    git checkout –b $name

  • 检查本地的分支数和当前分支
    git branch

  • 提交新分支到远程仓库
    git push origin $newbranchname

  • clone指定分支
    git clone -b $branchname $url

  • 分支合并
    假如当前分支是branch1,那么使用下面命令可以让branch1合并到master里,如果没有冲突的话,合并后master就包括了branch1的文件
    git merge master

  • 分支删除
    git branch -d xxxx

  • rebase
    分支合并的方式有两种,一种是merge,另一种就是rebase。rebase可以改写commit的历史,一般用来做清理,使得整个commit历史很干净。

数据回滚类操作

  • 回滚到某一次的commit
    git reset --hard $commit
    其中commit id可以通过git log查看,或者直接看.git/logs/refs/heads/master文件

其他

  • git修改全局配置
    比如修改请求的缓冲区
    git config --global http.postBuffer 524288000
    修改用户邮箱
    git config --global user.email xxx@xxx.com

  • 移除git提交的文件
    比如移除idea的工程文件
    git rm -r --cached .idea

安全类

  • 为某台机器添加git秘钥
    流程为 1) 在机器上创建秘钥ssh-keygen -t rsa -C "你的关键字"; 2) 把秘钥,比如在/root/.ssh/id_rsa.pub 复制到github/gitlab; 3) ok了
    参考git创建秘钥

问题

  1. 修改已经commit的邮箱
    有时候在commit后发现,邮箱信息是错的,无法push到git的remote repo,需要修改已经commit的代码。下面通过一个shell脚本,解决这个问题。在主目录下创建一个脚本,然后用shell执行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    git filter-branch --env-filter '

    OLD_EMAIL="你之前commit使用的邮箱"
    CORRECT_NAME="你正确的名称"
    CORRECT_EMAIL="你正确的邮箱"

    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
    ' --tag-name-filter cat -- --branches --tags
  2. git在push中出现failed to push some refs问题
    这种问题一般是由于本地commit了新的补丁,远程仓库也有新的补丁没有被本地同步,导致本地push失败。
    git pull --rebase origin master
    pull的意思是把远程库中的更新合并到本地库中,–-rebase的作用是取消掉本地库中刚刚的commit,并把他们接到更新后的版本库之中。

  3. Please commit your changes or stash them before you merge
    这是由于你在pull之前,本地修改了和pull数据相同的地方,导致冲突,无法将远程的数据merge到本地。
    最好的解决的方法就是先备份本地修改的内容,然后将远程的数据merge到本地,再讲本地备份的内容还原,这些操作对应到git的命令如下

    1
    2
    3
    4
    5
    6
    # 将工作区恢复到上次提交的内容,并备份已修改的内容
    git stash
    # merge远程的数据
    git pull
    # 将备份的内容还原到工作区
    git stash pop
  4. 当merge出现冲突,选定一个分支的代码为准
    参考下面命令,将b2分支合并到b1,当遇到冲突时以b2分支为准

    1
    2
    git checkout b1
    git merge -s recursive -X theirs b2
  5. 当merge出现冲突,假设我们需要把develop分区合并到master,而某些文件需要保留master的

    1
    2
    3
    4
    5
    git checkout develop
    git checkout master -- xxx.file
    git commit -m "xx"
    git checkout master
    git merge develop

git入门小游戏

推荐一个网站,通过交互的方式体验git命令的功能

git在线小游戏

参考

git官网文档

ulysses wechat
订阅+