Adison's Room

Done is better than perfect...

Git常用命令

git配置

用户名,邮箱配置

全局配置

git config --global user.name "zhangsan"
git config --global user.email "zhangsan@163.com"

单独项目配置

  git config user.name "zhangsan"
  git config user.email "zhangsan@163.com"

配置SSH KEY

生成ssh-key

  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

如:

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文件,内容如下

# 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代码库
git init
  • 与远程服务器关联
git remote add origin <项目地址>
  • 克隆项目
git clone <项目地址>

git分支

  • 创建分支
git branch -b <分支名>
  • 查看本地所有分支
git branch
  • 查看所有分支(包括远程)
git branch -a
  • 查看与当前分支绑定的远端分支
git branch -vv
  • 查看远端所有分支
git branch -r
  • 创建本地分支(和远端同名)并且把本地分支和远端分支绑定,然后切换到本地分支
git checkout -t origin/feature/optimize :没有加-b申明本地分支名称,默认为与远端分支同名;
git checkout -b <branch> --track <remote>/<branch> :完全的命令格式
  • 删除远程分支
git push origin --delete <branchName>

git标签

  • 新建标签
git tag -a  <标签名字>  -m '附注信息'
  • 把本地tag推送到远程
git push origin <tagName>
  • 推送所有本地tag到远程
git push --tags
  • 获取远程tag
git fetch origin tag <tagname>
  • 查看远程仓库的标签
git ls-remote --tags
  • 删除远程标签
git push origin --delete tag <tagname>
  • 取得 tag 对应的代码
git checkout tag_name 

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

git代码管理

  • 增加/删除文件

  • 添加指定文件到暂存区

git add <file1> <file2> ...
  • 添加指定目录到暂存区,包括子目录
git add <dir>
  • 添加当前目录的所有文件到暂存区
git add .
  • 删除工作区文件,并且将这次删除放入暂存区
git rm <file1> <file2> ...
  • 代码提交

  • 提交暂存区到仓库

git commit -m <message>
  • 查看提交记录
git log 
  • 查看仓库当前的状态
git status
  • 修改提交历史

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

  • 修改提交的用户名和Email
git commit --amend --author='Your Name '
git commit --amend --email='Your email '
  • 只修改提交说明/添加新的更改
#只修改提交说明
git commit —amend
#添加新的更改
git add new_file
git commit —amend

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

  • 合并提交

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

git rebase –i HEAD~2

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

git 高级

  • 储藏

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

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

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

  • 保存当前的工作进度
git stash
git stash save "message..."// 这条命令实际上是第一条 `git stash` 命令的完整版
  • 显示工作进度列表
git stash list//此命令显然暗示了git stash 可以多次保存工作进度,并用在恢复时候进行选择

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

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
  • 恢复保存的工作进度
git stash pop <stash name> 
git stash apply <stash name> 
//pop和apply唯一区别是恢复完毕是否将工作进度从进度列表中删除,pop删除,apply不删除

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

  • 删除所有储藏的进度
git stash clear
  • 代码回滚

  • reset

git reset <标记> <commitId>

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

reset命令有三个标记:

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

  • revert

git revert <commitId>

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

  • 举个栗子

本地提交如下:

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

commit bed640cdd9e8ffb637061e0e954237fa2cdee494
Author: adisonhyh <adison5321@gmail.com>
Date:   Wed Aug 31 17:10:12 2016 +0800

test1

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

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

​```python
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在撤销一个提交的同时会创建一个新的提交,并且不会重写提交历史

标签 

评论