Git常用命令

git配置

  • 用户名,邮箱配置

    • 全局配置
    1
    2
    git config --global user.name "zhangsan"
    git config --global user.email "zhangsan@163.com"
    • 单独项目配置
    1
    2
    git config user.name "zhangsan"
    git config user.email "zhangsan@163.com"
  • 配置SSH KEY

    • 生成ssh-key
    1
    ssh-keygen -t rsa -C "zhangsan@163.com"

    提示输入密码,直接回车

    • 添加ssh-key到gitlab/github

      将~/.ssh/id_rsa.pub内容拷贝到网站对应配置SSH KEY地方

    • 配置多个ssh-key(如有必要)

      公司使用gitlab,开源项目放在github,需要配置不同的ssh-key对应不同的环境

      1. 生成不同的ssh-key

        如:

        1
        2
        ssh-keygen -t rsa -C "youremail@yourcompany.com” -f ~/.ssh/id-rsa
        ssh-keygen -t rsa -C "youremail@your.com” -f ~/.ssh/github-rsa`

        将对应公钥内容拷贝到gitlab和github对应配置SSH KEY地方

      2. 在 ~/.ssh 目录下新建一个config文件,内容如下

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        # gitlab
        Host gitlab.com
        HostName gitlab.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa
        # github
        Host github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_github_rsa

git初始化

  • 在当前目录新建一个Git代码库

    1
    git init
  • 与远程服务器关联

    1
    git remote add origin <项目地址>
  • 克隆项目

    1
    git clone <项目地址>

git分支

  • 创建分支

    1
    git branch -b <分支名>
  • 查看本地所有分支

    1
    git branch
  • 查看所有分支(包括远程)

    1
    git branch -a
  • 查看与当前分支绑定的远端分支

    1
    git branch -vv
  • 查看远端所有分支

    1
    git branch -r
  • 创建本地分支(和远端同名)并且把本地分支和远端分支绑定,然后切换到本地分支

    1
    2
    git checkout -t origin/feature/optimize :没有加-b申明本地分支名称,默认为与远端分支同名;
    git checkout -b <branch> --track <remote>/<branch> :完全的命令格式
  • 删除远程分支

    1
    git push origin --delete <branchName>

git标签

  • 新建标签

    1
    git tag -a <标签名字> -m '附注信息'
  • 把本地tag推送到远程

    1
    git push origin <tagName>
  • 推送所有本地tag到远程

    1
    git push --tags
  • 获取远程tag

    1
    git fetch origin tag <tagname>
  • 查看远程仓库的标签

    1
    git ls-remote --tags
  • 删除远程标签

    1
    git push origin --delete tag <tagname>
  • 取得 tag 对应的代码

    1
    git checkout tag_name

    但是这时候 git 可能会提示你当前处于一个“detached HEAD” 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,
    如果要在 tag 代码的基础上做修改,你需要一个分支:git checkout -b branch_name tag_name

git代码管理

  • 增加/删除文件

    • 添加指定文件到暂存区

      1
      git add <file1> <file2> ...
    • 添加指定目录到暂存区,包括子目录

      1
      git add <dir>
    • 添加当前目录的所有文件到暂存区

      1
      git add .
    • 删除工作区文件,并且将这次删除放入暂存区

      1
      git rm <file1> <file2> ...
  • 代码提交

    • 提交暂存区到仓库

      1
      git commit -m <message>
    • 查看提交记录

      1
      git log
    • 查看仓库当前的状态

      1
      git status
    • 修改提交历史

      注意:需要修改提交历史的提交最好是还没推送到远端的提交,不然有可能会有意想不到的问题

      • 修改提交的用户名和Email

        1
        2
        git commit --amend --author='Your Name '
        git commit --amend --email='Your email '
      • 只修改提交说明/添加新的更改

        1
        2
        3
        4
        5
        #只修改提交说明
        git commit —amend
        #添加新的更改
        git add new_file
        git commit —amend

        然后你就会进入文本编辑器,输入你想要的内容,保存并退出即可。

      • 合并提交

        不常用,但有些场景很有用,譬如:提交一些无意义的提交,希望可以合并成一个有意义的提交。具体可以参见Pro Git重写历史

        1
        git rebase –i HEAD~2

        修改最近二次的提交说明,运行后將第二行的 “pick” 改為 “squash“或者“s”,然后输入”:wq”退出。编辑输入新的message,然后输入”:wq”退出

git 高级

  • 储藏

    当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,这时你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。

    “‘储藏”“可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

    一句话,git stash用于保存和恢复工作进度

    • 保存当前的工作进度

      1
      2
      git stash
      git stash save "message..."// 这条命令实际上是第一条 `git stash` 命令的完整版
    • 显示工作进度列表

      1
      git stash list//此命令显然暗示了git stash 可以多次保存工作进度,并用在恢复时候进行选择

      这时应该能得到类似以下列表

      1
      2
      3
      stash@{0}: WIP on master: 049d078 added the index file
      stash@{1}: WIP on master: c264051 Revert "added file_size"
      stash@{2}: WIP on master: 21d80a5 added number to log
    • 恢复保存的工作进度

      1
      2
      3
      git stash pop <stash name>
      git stash apply <stash name>
      //pop和apply唯一区别是恢复完毕是否将工作进度从进度列表中删除,pop删除,apply不删除

      如果不使用任何参数,会恢复最新保存的工作进度。 如果提供参数(来自 git stash list 显示的列表),则从该 对应储藏中恢复。

    • 删除所有储藏的进度

      1
      git stash clear
  • 代码回滚

    • reset

      1
      git reset <标记> <commitId>

      撤销某次提交,但是此次之后的修改都会被退回到暂存区(soft)或删除(hard)

      reset命令有三个标记:

      • –mixed – 默认选项。此次之后的修改都会被退回到工作目录
      • –soft – 此次之后的修改都会被退回到暂存目录,实际就是mixed之后,又做了一次git add
      • –hard – 此次之后的修改被彻底删除,暂存区和工作目录都同步到你指定的提交
    • revert

      1
      git revert <commitId>

      撤销某次提交,撤销一个提交的同时会创建一个新的提交,这是一个安全的方法,因为它不会重写提交历史

    • 举个栗子

      本地提交如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      commit da53a6fecc9c77861c33ab90593af5779cfe57a8
      Author: adisonhyh <adison5321@gmail.com>
      Date: Wed Aug 31 17:17:27 2016 +0800
      test3
      commit a5a534a8d08b0d986ec10c2c7f638282578f1dd1
      Author: adisonhyh <adison5321@gmail.com>
      Date: Wed Aug 31 17:10:32 2016 +0800
      test2
      commit bed640cdd9e8ffb637061e0e954237fa2cdee494
      Author: adisonhyh <adison5321@gmail.com>
      Date: Wed Aug 31 17:10:12 2016 +0800
      test1

      执行git reset HEAD~2,再执行git log

      1
      2
      3
      4
      5
      commit bed640cdd9e8ffb637061e0e954237fa2cdee494
      Author: adisonhyh <adison5321@gmail.com>
      Date: Wed Aug 31 17:10:12 2016 +0800
      test1

      可以看到最近两次提交被删除了

      如果执行git revert HEAD~2,再执行git log,那应该是这样的

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      commit 8f213b31d52313f446eebe26d1757ad7c3e1ae92
      Author: adisonhyh <adison5321@gmail.com>
      Date: Wed Aug 31 17:22:43 2016 +0800
      Revert "test1"
      This reverts commit bed640cdd9e8ffb637061e0e954237fa2cdee494.
      commit 1b0b8b46dc84dc06cd74ed3c542afe4a3a5c3527
      Author: adisonhyh <adison5321@gmail.com>
      Date: Wed Aug 31 17:22:24 2016 +0800
      test3
      commit dbb588ae90a6e606fc83eba9b9b069a272a7be76
      Author: adisonhyh <adison5321@gmail.com>
      Date: Wed Aug 31 17:22:15 2016 +0800
      test2
      commit bed640cdd9e8ffb637061e0e954237fa2cdee494
      Author: adisonhyh <adison5321@gmail.com>
      Date: Wed Aug 31 17:10:12 2016 +0800
      test1

      可以看到revert在撤销一个提交的同时会创建一个新的提交,并且不会重写提交历史

Adison wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!