git实用笔记

  • git实用笔记

写在前面

整理一下我记得住和记不住的实用git命令,更多学习了解请查看官网

gitTips整理的也很实用

安装

通常,Mac OS 中都已经安装了Git。但是,Git的版本未必是最新的。所以建议你安装使用最新版本的Git。下面来检查一下你的Mac电脑上是否已经安装了Git

如图,如果git命令可以被系统识别,那么就表示你的电脑上已经安装了Git,系统会列出Git的一些使用方法

如果你发现你的系统上没有安装Git,那么你要到Git的网站下载并安装最新版本的Git

实用操作

git 的配置

git config 命令用于获取并设置存储库或全局选项。这些变量可以控制 Git 的外观和操作的各个方面。

1
2
# 获取帮助信息
git help config

查看全局配置的信息

1
2
3
4
5
# --local:局部(当前目录)配置信息 (默认值)
git config --local --list

# --global:全局配置信息
git config --global --list

设置自己的用户名和 email,这是非常重要的,因为每次 Git 提交都会使用该信息,它被永远的嵌入到了你的提交中
在命令行输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 全局配置(所有项目)
git config --global user.name "your name"
git config --global user.email "your email"

# 当前目录配置(当前项目)
git config user.name "your name"
git config user.email "your email"

#示例
git config --global user.name "xiaoming"
git config --global user.email "xiaoming@gmail.com"

git config user.name "xiaoming"
git config user.email "xiaoming@gmail.com"

添加配置项

1
2
3
4
5
6
7
8
9
10
11
# entry-name 为配置项名称
# 当前目录
git config --local –add <entry-name>
# 全局环境
git config --global –add <entry-name>
# 系统
git config --system –add <entry-name>

# 示例:
git config -–add site.name yiibai
# * 注意 add 后面的 section 、 key、 value 一项都不能少,否则添加失败

删除配置项

1
2
3
4
5
6
7
8
9
10
11
# 当前目录
git config --local --unset <entry-name>

# 全局环境
git config --global--unset <entry-name>

# 系统环境
git config --system --unset <entry-name>

# 示例:
git config --local -–unset site.name

简化命令

1
2
3
4
5
# 将冗长的命令简化
git config --global alias.<handle> <command>

#示例:git status 改成 git st ,这样可以简化输入命令
git config --global alias.st status

其他配置项

1
2
3
4
5
# 不再将文件的权限变化视作改动
git config core.fileMode false

# 设置大小写敏感
git config core.ignorecase false

创建SSH密钥

这个密钥用来跟 github 通信,在本地终端里生成然后上传到 github

1
2
3
ssh-keygen -t rsa -C 'wowohoo@qq.com' # 生成密钥  
ssh-keygen -t rsa -C "wowohoo@qq.com" -f ~/.ssh/ww_rsa # 指定生成目录文件名字
ssh -T git@github.com # 测试是否成功

多账号ssh配置

1.生成指定名字的密钥

1
ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/jslite_rsa

会生成 jslite_rsa 和 jslite_rsa.pub 这两个文件

2.密钥复制到托管平台上

1
vim ~/.ssh/jslite_rsa.pub

打开公钥文件 jslite_rsa.pub ,并把内容复制至代码托管平台上

3.修改config文件

1
2
# 修改config文件,如果没有创建 config
vim ~/.ssh/config
1
2
3
4
5
6
7
8
9
10
11
12
13
# config 配置
Host jslite.github.com
HostName github.com
User git
IdentityFile ~/.ssh/jslite_rsa

Host work.github.com
HostName github.com
# Port 服务器open-ssh端口(默认:22,默认时一般不写此行)
# PreferredAuthentications 配置登录时用什么权限认证
# publickey|password publickey|keyboard-interactive等
User git
IdentityFile ~/.ssh/work_rsa
  • Host 这里是个别名可以随便命名
  • HostName 一般是网站如:git@ss.github.com:username/repo.git 填写 github.com
  • User 通常填写git
  • IdentityFile 使用的公钥文件地址

4.测试

1
2
3
ssh -T git@jslite.github.com  # `@`后面跟上定义的Host  
ssh -T work.github.com # 通过别名测试
ssh -i ~/公钥文件地址 Host别名 # 如 ssh -i ~/.ssh/work_rsa work.github.com

5.使用

1
git clone git@jslite.github.com:<jslite的用户名>/learngit.git

初始化版本仓库

1
2
3
4
5
6
7
# 该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件
# 这些文件是 Git 仓库的骨干
git init

# 或者使用下面的命令,<project-name> 为新建代码库的名称

git init <project-name>

git 和目录绑定

在一个目录里可以通过 git init 命令把这个目录变成 Git 可以管理的仓库, 然后通过以下命令绑定提交的地址:

1
git remote add origin https://github.com/gitname.github.io

或者直接 git clone 地址 就会创建目录和地址绑定

列出每个远程库的简短名字

1
git remote -v

添加远程仓库

1
2
3
4
5
6
# gitName:自定义名字,一般upstream指上游仓库的名字,origin 一般指自己仓库的名字
# git@github.com:gitName.git:是你的仓库地址
git remote add gitName git@github.com:gitName.git

# 下一步,就可以把本地库的所有内容推送到远程库上
git push gitName master

git 分支修改名字

1
git branch -m 原名 新名

本地修改暂时储藏

1
2
3
4
5
6
7
git stash

# 要将暂存的内容导出来,执行 pop 命令
git stash pop

# 要移除它,你可以运行 drop,加上你希望移除的储藏的名字
git stash drop <stashName>

git合并多个commit

1
2
# 首先你要先通过log查看一下历史
git log

1
2
3
4
5
# 推荐使用hash操作:

# 如果你想合并 64ea73dd457c780 和 1163cb825e1fcb,一定注意下面的命令一定要定位到最后一个要合并的commit之前的一个
# 也就是这个最后一个想要合并的 hash 值 1163cb825e1fcb 前面的一个 即:f4f6e1b3be5fc77a23
git rebase -i f4f6e1b3be5fc77a23

rebase 命令执行后,会弹出一个界面:

pick 是用commit; squash 是合并前一个

注意这时候是vim界面,如果需要修改键盘敲 i (insert) 进行输入

将 pick 修改为 squash 或者 s

然后 按esc 退出vim界面, 输入 :wq 保存退出
会再弹出界面,这时候可以修改提交的描述,同样操作vim进行修改,:wq保存退出
这时候再 git log 查看一下 证明我们已经合并了
最后将我们的rebase修改push到我们的想要提交的库就行了

如果是团队合作:应该有两个远程

  • 一个是 upstream 团队库的远程
  • 一个是 origin 你fork的团队库

在本地提交的分支上 进行完rebase修改之后

在该分支上继续提交:可以 push -f 强制推送到我们的origin

1
git push -f (默认是origin)

也可以

1
git push origin 当前分支名

如果我们团队开发,一定注意使用 -f 这些命令,force它代表强制执行,比较危险的命令,不要push到远程的upstream项目

回退到某一个版本

在 Git 中,用 HEAD 表示当前版本, 上一个版本就是 HEAD^, 上上一个版本就是 HEAD^^, 当然往上 100 个版本写 100 个 ^ 比较容易数不过来,所以写成 HEAD~100。

1
2
3
4
5
6
7
8
# 回滚到上一个版本:
git reset --hard HEAD^

# 回滚到任意一个版本:
git reset --hard <hash>

# 示例:
git reset --hard a3hd73r

–hard代表丢弃工作区的修改,让工作区与版本代码一模一样,与之对应,–soft参数代表保留工作区的修改

如果 git 回滚到历史版本后, git log 只能看历史版本再以前的版本号, 不到未来的版本号怎么办?

git 提供了一个命令 git reflog 用来记录你的每一次命令

利用 commit 关闭一个 issue

如果主管给我们开了一个任务issue,当我们完成并提交代码的时候 在描述中可以这样写:

1
2
3
fix: <issue的地址>

# 当我们的提交被合并的时候,相应的issue就会被关闭,可谓是相当的高效实用了

放弃工作区的修改

1
2
3
4
git checkout <文件路径>

# 放弃所有修改:
git checkout .

展示工作区和暂存区的不同

1
2
3
4
5
# 输出工作区和暂存区的 different (不同):
git diff

# 还可以展示本地仓库中任意两个 commit 之间的文件变动:
git diff commit1 commit1

展示暂存区、工作区和最近版本的不同

1
2
# 输出工作区、暂存区 和本地最近的版本 (commit) 的 different (不同):
git diff HEAD

创建并切换到本分支

1
2
3
4
5
6
git checkout -b newBranch

#相当于:

git branch newBranch (新建分支)
git checkout newBranch (切换到新分支)

快速切换到上一个分支

1
git checkout -

可筛选的删除本地无用分支

1
2
3
4
5
git branch|grep <需要删除分支名字或名称的一部分>|xargs git branch -d

# 例如:branch-25 这个分支已经提交合并了之后 就没有存在的必要了,删除这个分支
# 下面这个执行后,就会检索所有名称里面所有包含25的分支 并进行删除
git branch|grep 25|xargs git branch -d

回到远程仓库的状态

1
2
3
# 抛弃本地所有的修改,回到远程仓库的状态:
git fetch --all
git reset --hard origin/master

展示本地分支关联远程仓库的情况

1
git branch -vv

列出所有远程分支

1
2
# -r 参数相当于:remote
git branch -r

回退到某一个版本

通过 git log 查看历史记录

如果你想回退到 edit readme 复制这个commit的上一个commit的hash值 70aebb3912208

1
2
3
4
5
# 通过 reset 命令(将当前HEAD重置为指定状态)回退到该版本
git reset --hard 70aebb3912208

# 然后查看一下历史,已经撤销了之前的 commit
git log

这里介绍一下: git reset [] []

此形式将当前分支头重置为;且可能根据更新索引(resetting it to the tree of )和工作树。
如果省略,则默认为—mixed。必须为这些选项之一:–mixed、–soft、–hard、–merge、–keep

git reset [–hard|soft|mixed|merge|keep] 参数区别:

参数 描述
–mixed 默认(即不带任何参数的git reset),它回退到某个版本,只保留源码,回退commit和index信息
–soft 回退到某个版本,不修改索引文件和工作树
–hard 重置索引和工作树。丢弃自之后工作树中已跟踪文件的任何更改
–merge 重置索引并更新工作树中和HEAD之间不同的文件,但保留索引和工作树之间不同的文件(即没有添加更改的文件)。如果在和索引之间不同的文件有未暂存的修改,reset将会中止(换句话说,–merge 的行为类似于git read-tree -u -m,但是会携带未合并的索引条目)
–keep 重置索引条目,并更新工作树中和HEAD之间不同的文件。如果文件有本地修改,reset将会中止

恢复 git reset -hard 的误操作, 可以通过 git reflog 查看hard记录

reflog命令:它会记录所有HEAD的历史,也就是说当你做 reset,checkout 等操作的时候,这些操作会被记录在reflog中

比如我们想恢复到 edit about, 复制这个操作的hash值 e14f255,然后执行以下操作:

1
2
3
git reset --hard e14f255

# `git log` 查看历史,发现我们已经恢复到 `edit about` 了

git log 加上 -g 参数也能看见reflog信息

  • 注意:当通过reset等操作丢失一个提交的时候,可以把它找回来。除非你的操作已经被git当做垃圾处理掉了,一般是30天以后

撤销一个 还未 push 的 commit

通过 git log 查看提交的commit历史

如果我们想撤回hash值为 9a98bc022f8b53a08 的 commit: git reset

Comentarios

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×