读完stormzhang大神写的Git的入门书《learn-github-from-zero》后写的个人笔记
Git 命令列表
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial) //启动一个工作区域
clone 将存储库复制到新目录中
init 创建一个空的Git存储库,或者重新初始化现有的库
work on the current change (see also: git help everyday) //对当前更改的工作
add 向索引添加文件内容
mv 移动或重命名文件、目录或符号链接
reset 将当前头重置到指定状态
rm 从工作树和索引中删除文件
examine the history and state (see also: git help revisions) //检查历史和状态
bisect 使用二进制搜索来找到引入bug的提交
grep 匹配模式的打印行
log 显示提交日志
show 显示各种类型的对象
status 显示工作树状态
grow, mark and tweak your common history //成长,标记和调整你的共同历史记录
branch 列出、创建或删除分支
checkout 切换分支或恢复工作树文件
commit 记录对存储库的更改
diff 显示提交、提交和工作树之间的更改,等等
merge Join two or more development histories together // 将两个或多个开发历史合并在一起
rebase 重新应用于另一个基本技巧之上
tag 创建、列表、删除或验证与GPG签名的标记对象
collaborate (see also: git help workflows) //协作(参见:git帮助工作流)
fetch Download objects and refs from another repository //从另一个存储库下载对象和refs
pull 从另一个库或本地分支获取并集成
push 与相关对象一起更新远程refs
'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
简单首次提交过程
0、 git pull origin master 把远程新的代码更新到本地。一般我们在 push 之前都会先 pull ,这样不容易冲突。
1、先创建空的文件夹
2、创建 .md 文件 [可项目有忽略]
3、git init 初始化
4、git status 查看状态 (处理代码冲突时快速查看状态问题)
5、git add . 添加文件 --->等待被提交 可用 [ git rm --cached ] 清除该缓存
6、 git commit -m '提交说明' commit 是提交的意思,m 代表是提交信息,[ git log ]命令可以查看所有产生的 commit 记录
7、git push origin master 是把本地代码推到远程 master 分支
创建分支
8.1、git branch name git branch 查看当前分支,后面加上参数name就是创建名为name 的分支, '*' 代表当前使用的分支
8.2、git checkout name切换到name的分支上
- [
git checkout -b name] 一步同上8.1-8.2操作
合并分支
9.1、git checkout master 切换到主分支上
9.2、git merge name 合并name分支的代码
删除分支
10.1、git branch -d name 删除空的name分支
10.2、git branch -D name 强行删除非空的name分支
10.3、git push origin -d name 删除远程分支
版本控制
11.1、git tag 查看历史tag记录
11.2、git tag v1.0 当前创建标签V1.0
12、git checkout v1.0 切换到v1.1标签
SSH协议
Linux 与 Mac 都是默认安装了 SSH ,而 Windows 系统安装了 Git Bash 应该也是带了 SSH 的
1、ssh-keygen -t rsa //就是指定 rsa 算法生成密钥,接着连续三个回车键(不需要输入密码),然后就会生成两个文件 id_rsa 和 id_rsa.pub ,而 id_rsa 是密钥, id_rsa.pub 就是公钥
2、接下来要做的是把 id_rsa.pub 的内容添加到 GitHub 上,这样你本地的 id_rsa 密钥跟 GitHub 上的 id_rsa.pub 公钥进行配对,授权成功才可以提交代码。
2.1、先在 GitHub 上的设置页面,点击左侧 SSH and GPG keys
2.2、然后点击右上角的 New SSH key 按钮 需要做的只是在 Key 那栏把 id_rsa.pub 公钥文件里的内容复制粘贴进去就可以了,Title 那栏不需要填写,点击 Add SSH key 按钮就ok了。
git config
$ git config
用法:git config [<options>]
配置文件位置
--global 使用全局配置文件
--system 使用系统配置文件
--local use repository配置文件
-f,--file <file> 使用给定的配置文件
--blob <blob-id> 从给定的blob对象读取配置
行动
--get get value:name [value-regex]
--get-all 获取所有值:key [value-regex]
--get-regexp 获取regexp的值:name-regex [value-regex]
--get-urlmatch 获取特定于URL的值:section [.var] URL
--replace-all 替换所有匹配的变量:name value [value_regex]
--add 添加一个新变量:name value
--unset 删除变量:name [value-regex]
--unset-all 删除所有匹配项:name [value-regex]
--rename-section rename section:old-name new-name
--remove-section 删除一个部分:name
-l, --list list all
-e,--edit 打开一个编辑器
--get-color 找到配置的颜色:slot [default]
--get-colorbool 找到颜色设置:slot [stdout-is-tty]
类型
--bool 值为“true”或“false”
--int 值是十进制数
--bool-or-int 值为--bool或--int
--path 值是路径(文件或目录名称)
--expiry-date 值是一个到期日
其他
-z,--null 用NUL字节终止值
--name-only 仅显示变量名称
--includes 包含查找指令
--show-origin 显示配置的起源(文件,标准输入,blob,命令行)
友情提醒,在提交代码之前先要设置下自己的用户名与邮箱,这些信息会出现在所有 的 commit 记录里,执行以下代码就可以设置:
git config —global user.name "你的名字"
git config —global user.email "你的邮箱"
----------------别名----------------
git config --global alias.psm 'push origin master'
git config --global alias.plm 'pull origin master'
//常用到的git push origin master 和 git pull origin master 直接就用 git psm 和 git plm 代替
git log 查看
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)% d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative" // 别名 git lg
其他配置
有些人纳闷我的终端怎么有各种颜色,自己却不是这样的,那是因为你们没有开启给 Git 着 色,输入如下命令即可:
git config --global color.ui true
还有些其他的配置如:
git config --global core.quotepath false 设置显示中文文件名
以上基本所有的配置就差不多了,默认这些配置都在 ~/.gitconfig 文件下的,你可以找到这个文件查看自己的配置,也可以输入
git config -l 命令查看。
git diff
git diff 只能比较当前文件和暂存区[还没有执行 git add 的文件]之间文件差异, 当然跟暂存区做比较之外,他还可以有其他用法,如比较两次 commit 之间的差异。
比较两个分支之间的差异,比较暂存区和版本库之间的差异等,具体用法如下:
git diff <$id1> <$id2> 比较两次提交之间的差异
git diff <branch1>..<branch2> 在两个分支之间比较
git diff --staged 比较暂存区和版本库差异
checkout
我们知道 checkout 一般用作切换分支使用,比如切换到 develop 分支,可以执行:
git checkout develop
但是 checkout 不只用作切换分支,他可以用来切换tag,切换到某次commit,如:
git checkout v1.0 git checkout ffd9f2dd68f1eb21d36cee50dbdd504e95d9c8f7 后面的一长串是commit_id,是每次commit的SHA1值,可以根据 git log 看到。
除了有“切换”的意思,checkout 还有一个撤销的作用,举个例子,假设我们在一个分支开发 一个小功能,刚写完一半,这时候需求变了,而且是大变化,之前写的代码完全用不了了, 好在你刚写,甚至都没有 git add 进暂存区,这个时候很简单的一个操作就直接把原文件还 原:
git checkout a.md
这里稍微提下,checkout 命令只能撤销还没有 add 进暂存区的文件。
stash
正在一个新的分支做新的功能时,需要修改其他分支的代码,暂时切到别的分支,修复完bug再切回来,而且代码也能保留,并且要在我们的代码没有进行 commit ,哪怕你执行了 add 也没关系,我们先执行
1、git stash
2、git stash list 查看暂存区已经有了一条记录
3、git stash apply 还原之前的代码
4、git stash drop 把暂 存区的这次 stash 记录删除
- 3-4、
git stash pop来代替 apply 命令,pop 跟 apply 的唯一区别就是 pop 不但会帮你把代码还原,还自动帮你 把这条 stash 记录删除,省的自己再 drop 一次了,为了验证你可以紧接着执行 git stash list 命令来确认是不是已经没有记录了。
5、git stash clear 清空所有暂存区的记录,drop 是只删除一条,当然后面可以跟 stash_id 参数来删除指 定的某条记录,不跟参数就是删除近的,而 clear 是清空
merge & rebase
merge 分支是合并的意思,在一个 featureA 分支开发完了一个功能,需要合并到主分支 master 上去
git checkout master
git merge featureA
其实 rebase 命令也是合并的意思,上面的需求我们一样可以如下操作:
git checkout master
git rebase featureA
rebase 跟 merge 的区别
你们可以理解成有两个书架,你需要把两个书架的书整理到一起去,
第一种做法是 merge ,比较粗鲁暴力,就直接腾出一块地方把另一个书架的书全部放进去,虽然暴力,但是这种做法你可以知道哪些书是来自另一个书架的;
第二种做法就是 rebase ,他会把两个书架的书先进行比较,按照购书的时间来给他重新排序,然后重新放置 好,这样做的好处就是合并之后的书架看起来很有逻辑,但是你很难清晰的知道哪些书来自 哪个书架的。
Git分支管理
git branch name 创建分支
git checkout name 切换分支
[git checkout -b name] 以上两步合并,即新建并且自动切换到分支
git push origin name 把分支推送到远程仓库
git push origin name:name2 远程的分支想取名叫 name2
查看本地分支列表
git branch
查看远程分支列表
git branch -r
删除本地分支
git branch -d name
git branch -D name (强制删除)
删除远程分支
git push origin :name
如果远程分支有个 develop ,而本地没有,你想把远程的 develop 分支迁到本地:
git checkout develop origin/develop
同样的把远程分支迁到本地顺便切换到该分支:
git checkout -b develop origin/develop