git命令记录

安装配置

1
2
3
4
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
# 生成私钥,公钥
$ ssh-keygen -t rsa -C "email@example.com"

自定义git

  • 让git显示颜色: git config –global color.ui true
  • 设置差异比较工具: git config –global merge.tool vimdiff
  • git编码问题

    1
    2
    3
    $ git config --system gui.encoding utf-8 # Git Gui乱码问题
    $ git config --system i18n.commitEncoding gbk # 提交的log里面可以用gbk提交
    $ git config --system i18n.logOutputEncoding gbk # 运行 git log 时将 utf-8 编码转换成 gbk 编码
  • 忽略特殊文件: 创建.gitignore文件,编写如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #windows
    Thumbs.db
    ehthumbs.db
    Desktop.ini
    #Python:
    *.py[cod]
    *.so
    *.egg
    *.egg-info
    dist
    build
    #My configurations:
    db.ini
    deploy_key_rsa

创建版本库

1
$ git init <name>

克隆及相关

  • git clone url<直接fork地址>
  • 添加upstream: git remote add upstream <原作者库地址>
  • 查看remote情况: git remote -v
  • 将原作者的修改更新到本地目录: git fetch upstream
  • 将直接fork的东西更新到本地目录: git pull origin master
  • 也可以通过checkout命令更新: git checkout master
  • 合并原作者与本地版本的区别: git merge upstream/master
    • 如果有冲突的话运行: git mergetool
  • 然后 git push origin master, 就可以将fork的版本与原作者版本进行统一

git fetch 与 git pull

  • git fetch:相当于是从远程获取最新标本到本地,不会自动merge

    • git fetch origin master
    • git log -p master origin/master
    • git merge origin/master
    • 上面的含义如下:
      • 从远程的origin的master主分支下载最新的版本到origin/master分支上;
      • 比较本地的master分支与origin/master分支的差别;
      • 合并
    • 上面的过程类似如下:
      • git fetch origin master:tmp
      • git diff tmp
      • git merge tmp
  • git pull: 获取最新版本病merge到本地

    • git pull origin master

提交更改

  • git status
  • git add 修改的文件
  • git rm 要删除的文件
  • git mv 要修改的文件名 修改后的
  • git commit -m “修改的内容”
  • git push origin master

管理修改

  • git status
  • git diff HEAD – filename(可以查看工作区与版本库里面的最新版本的区别)
  • git diff filename(查看文件的区别)
  • 如果使用git add提交修改后, 后悔了,使用git reset HEAD filename将暂存区的修改撤销掉

版本回退(git中,用HEAD表示当前版本,HEAD^表示上个版本, 上上个HEAD^^, 依次类推, 简化可以写成HEAD~100)

  • git log(查看提交的log)
  • git log –pretty=oneline(简化输出)
  • git log -p filename(查看文件所有变化)
  • git reset –hard HEAD^ (方法1)
  • git reset –hard (commit-id)

分支

  • 查看当前分支: git branch
  • 创建分支: git branch branch_name
  • 删除分支: git branch -d branch_name
  • 切换分支(如果存在): git checkout branch_name
  • 切换分支(如果不存在,创建): git checkout -b branch_name
  • 将分支上的修改合并到master: git merge branch_name
  • 克隆分支版本: git clone -b branch_name <主版本地址>

bug分支

  • 开发过程中,突然有个bug要修改,但是你当前正在工作的分支(dev)还有任务没有提交(由于未完成,无法提交)
  • 保存工作现场: git stash
  • 如果要修复master分支上的bug,则切换到master上创建分支: git checkout -b issue-101
  • 修改后: git add <修改的文件> , git commit -m “修改的内容”
    • 如果不进行这一步, 切回主分支还是能看到分支的内容的
  • 切换到主分支合并修改: git checkout master
  • 合并修改: git merge –no-ff -m “merge buf fix 101” issue-101
    • –no-ff 禁用Fast Forward模式,这样log就可以看出曾经做过合并
  • 删除分支: git branch -d issue-101
  • 切换到工作分支:git checkout dev
  • 查看工作现场列表: git stash list
  • 恢复现场
    • 方法1: git stash pop
    • 方法2: git stash apply; git stash drop
  • 可以多次恢复: git stash apply stash@{0}

标签管理

  • 标签的作用: 发布一个版本时,通常现在版本库中打一个标签, 这样就确定了打标签时刻的版本.*
  • 将来无论什么时候, 取某个标签的版本, 就可以取出历史版本.*
  • 查看标签: git tag
  • 创建标签: git tag v1.0
  • 查看标签信息: git show tag_name
  • 创建带说明的标签: git tag v0.2 -m “说明”
  • 删除标签: git tag -d v1.0
  • 删除远程标签: git push origin :refs/tags/v0.9
  • 推送某个标签到远程: git push origin v1.0
  • 或推送全部未推送的: git push origin –tags

子仓库(submodule)

1
git submodule允许一个git仓库作为另一个git仓库的子目录,并保持父项目与子项目相互独立.

添加子仓库

1
$ git submodule add <仓库地址> <本地地址>

检出(checkout)

1
2
clone一个包含子仓库的仓库,并不会clone子仓库,只会下载.gitmodule文件,需要通过
此描述文件clone子仓库。
  1. 方法1

    1
    2
    3
    4
    5
    # 初始化配置文件
    $ git submodule init

    # 检出父仓库列出的commit
    $ git submodule update
  2. 方法2

    1
    $ git submodule update --init --recursive

此时子目录在一个未命名分支,此时子仓库有改动并没有检测到。此时需要将子仓库的分支切换
到主分支,并更新到最新,然后切换到住仓库,并提交更改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看子仓库的分支
$ git branch
# 切换到主分支
$ git checkout master
# 更新
$ git pull
# 切换到主仓库并查看状态
$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。

尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
(提交或丢弃子模组中未跟踪或修改的内容)

修改: mshell/zsh/plugins/fast-syntax-highlighting (新提交)
修改: mshell/zsh/themes/powerlevel9k (新提交)
修改: oh-my-zsh (新提交)

修改尚未加入提交(使用 "git add" 和/或 "git")
# 上面的三个都是子仓库,可以提交修改。

删除子仓库

  • 删除.gitsubmodule里相关部分
  • 删除.git/config文件里相关字段
  • 删除子仓库目录
    $ git rm --cached <本地路径>