Git
- 分布式版本控制系统, 不受网络的限制
实用主义
- 常用命令
git clone
克隆项目到本地git config
修改 git 的配置信息git branch
修改,配置分支git checkout
切换分支git status
查看当前分支中文件变动状态git add
添加文件到暂存区git commit
提交暂存区文件到版本库git push
将本地代码推送到服务器git pull
将服务器最新代码拉取到本地git log
查看 commit 的历史记录git tag
为项目标记里程碑
git clone
从 git 服务器拉取代码
git clone https://xxxxxxxxxx.git
会下载成一个文件夹
git config
一般用来配置开发者的用户名和邮箱
git config user.name xxx
git config user.email xxx
# 必须要在一个 git 管理的项目中才能这样修改, 否则要使用
git config --global user.name xxx
git config --global user.email xxx
每次 commit 代码产生的日志记录就会包括 name 和 email
git branch
创建, 重命名, 查看, 删除项目分支
# 创建一个名为 daily/0.0.0 的开发分支
git branch daily/0.0.0
一般开发都是在开发分支中进行, 开发完成之后合并到主干
# 重命名分支
git branch -m daily/0.0.0 daily/0.0.1
# 查看分支列表
git branch
# 删除分支
git branch -d daily/0.0.1
git checkout
切换分支
git checkout daily/0.0.1
切换到该分支, 后续的操作都是在该分支上进行的
不同分支有不同的.gitignore
git status
查看该分支中的文件变动状态, 是否被修改
git commit
同样有该效果
git status
git add
添加文件到暂存区
# 添加指定文件到暂存区
git add xxx
# 添加所有文件到暂存区
git add .
git commit
体积文件变动到版本库
git commit -m '提交原因'
git push
将本地代码推动到服务器
git push origin daily/0.0.1
origin
代指当前 git 服务器地址, 将当前分支推送到服务器
git pull
将服务器上的最新代码拉取到本地
git pull origin daily/0.0.1
作用是将其他项目成员的改动更新到本地
如果线上代码和本地代码都发生了改动, 如果是不同地方的改动, Git 会自动处理这种改动, 但如果改动的是同一行, 那么就需要手动编辑文件合并代码, 再提交
git log
查看 commit 记录
git log
按 J
↓ 翻, K
↑ 翻, Q
退出
git tag
为项目标记里程碑
# 标记当前分支
git tag publish/0.0.1
# 推送当前 tag 到线上
git push origin publish/0.0.1
一般是项目完成, 准备上线时, 才会使用 tag 标记
.gitignore
设置 git 不需要推动的文件
创建一个 .gitignore
文件
// 某个文件
demo.html
// 某个文件夹
build/
深入探索
基本概念
工作区(Working Directory)
git clone 下来的文件夹, 最基本的目录
本地版本库(Local Repository)
工作区的隐藏目录.git
, 就是本地版本库
暂存区(stage)
位于本地版本库中, 本地版本库中还有 Git 为我们自动创建的第一个分支 master , 以及指向 master 的一个指针 HEAD
远程版本库(Remote Repository)
指 GIt 服务器上对应的仓库, Github or Gitee 仓库就是远程版本库
概念之间关系
主分支(Master)
Git 自动创建的第一个分支, 其他分支开发完成后都要合并到主分支
HEAD
HEAD 指向的就是当前分支的最新 commit
操作文件
git add
git add -i
打开交互式子命令系统, 输入对应序号选择功能, 常用的几个
revert
: 把已经添加到暂存区的文件从暂存区剔除add untracked
: 将新增的文件添加到暂存区patch
: 显示当前文件与本地版本库中的差异, 然后自行决定是否添加该修改git add -p
update
: 列出工作区 修改 或 删除 的文件列表, 新增 的文件不会被显示,然后选择要 add 的文件git add -u
git add --ignore-removal .
: 添加工作区 修改 或 新增 的文件列表, 删除 的文件不会被添加
git commit
git commit -m '第一行原因' -m '第二行原因'
# 修改最新一条提交记录的原因
git commit --amend -m '提交原因'
# 将当前文件改动提交到 HEAD 或分支的历史 ID
git commit -C HEAD
git mv
# 移动或者重命名文件, 目录
git mv a.md b.md -f
将 a.md 重命名为 b.md , 同时添加改动到暂存区, 相当于 移动重命名 命令 + git add 命令
git rm
从工作区和暂存区移除文件
git rm README.md
等于 rm README.nd
+ git add
操作
git rm src/ -r
允许删除目录文件夹
git status
以简单的方式查看工作区和暂存区的状况
git status -s
# A a.md 表示已经 add 到暂存区
# ?? a.md 表示还没加入到暂存区
# 如果 commit 到本地版本库就查不到了
# 查看工作区和暂存区的情况,包括被 ignored 的文件
git status --ignored
git branch
git branch -a
# 查看本地版本库和远程版本库上的分支列表
git branch -r
# 查看远程版本库的分支列表
git branch -D
# 分支未提交到本地版本库前强制删除分支
git branch -vv
# 查看带有最后提交 id 、最近提交原因等信息的本地版本库分支列表
git merge
git merge --squash
将待合并分支上的 commit 合并成一个新的 commit 放入当前分支, 适用于待合并分支的 commit 记录不需要保留的情况
git merge --no-ff
默认情况下,Git
执行”快进式合并
“(fast-farward merge),会直接将 Master
分支指向 Develop
分支,使用 --no-ff
参数后,会执行正常合并,在 Master
分支上生成一个新节点,保证版本演进更清晰。
git merge --no-edit
在没有冲突的情况下合并,不想手动编辑提交原因,而是用 Git
自动生成的类似 Merge branch 'test'
的文字直接提交
git checkout
git checkout -b daily/0.0.1
# 创建 daily/0.0.1 分支, 同时切换到该分支
git checkout --orphan=new_branch
git checkout --orphan new_branch
# 创建一个临时的新分支,加入创建前源分支上的所有文件,但是当前分支必须要 commit 一次之后才会保存下来
git checkout -p other_branch
# 这个命令主要用来比较两个分支间的差异内容,并提供交互式的界面来选择进一步的操作,这个命令不仅可以比较两个分支间的差异,还可以比较单个文件的差异
git stash
在 git 的栈中保存或修改当前的工作区和暂存区,你在一个分支里做某项功能开发时,接到通知把昨天已经测试完没问题的代码发布到线上,但这时你已经在这个分支里加入了其它未提交的代码,这个时候就可以把这些未提交的代码存到栈里。就相当于临时保存这些你新加入的代码但还没 commit 的代码
git stash
# 将未提交的代码存入栈中
git stash list
# 查看栈中所有记录
git stash show stash@{0}
# 查看栈中指定记录
git stash drop stash@{0}
# 删除一条记录
git stash pop
# 显示并移除栈中最新的的一条记录
git stash apply stash@{0}
# 检测一条记录,但不删除
git stash clear
# 清除所有
git stash branch new_branch
# 检出栈中最新一条记录并放入一个新建的分支中
git stash create
# 为当前改动创建一个临时记录,返回一个 id
git stash store id
# 真正将该记录保存
操作历史
git log
git log -p
# 提交带文件修改对比差异的操作日志
git log a.md
# 显示某个文件的操作日志
git log -10
# 显示最近 10 条日志
git log --pretty=oneline
# 在一行中输出日志
git log --since="2 weeks age"
# 显示两周前到现在的历史记录
git log --before="2 weeks ago"
# 显示截止到两周前的历史记录
git cherry-pick
git cherry-pick id
# 合并 id 分支的提交记录到当前分支末梢
git reset
将当前分支重设 reset 到指定的
<commit>
或者 HEAD
git reset --soft <commit>
# 暂存区和工作区中的内容不作任何改变,仅仅把 HEAD 指向 <commit>
git reset --hard <commit>
# 自从 <commit> 以来在工作区中的任何改变都被丢弃,并把 HEAD 指向 <commit>
git rebase
重新定义分支库的版本状态
git rebase branch_name
git revert
撤销某次 commit , 此次操作之前和之后的 commit 都会被保留, 并且吧这一次撤销当做一次新的提交
git revert HEAD
# 撤销前一次 commit
git revert HEAD --no-edit
# 同上, 不过以默认的 Revert xxx 为提交原因
git revert -n HEAD
# 撤销多次
git diff
查看工作区,暂存区,本地版本库的差异
git diff
git diff --stat
# 查看统计数据
git reflog
查看所有分支的操作记录,包括 commit 和 reset 还有已经被删除的 commit 记录, 还能查看分支切换记录
git reflog
远程版本库连接
如果在GitHub项目初始化之前,文件已经存在于本地目录中,那可以在本地初始化本地版本库,再将本地版本库跟远程版本库连接起来
git init
当前目录生成 .git
文件夹
git remote
git remote
# 显示所有远程仓库名字
git remote -v
# 显示名字同时显示 url 地址
git remote add 名字 url地址
# 添加新的远程仓库,并指定一个名字
git remote rm 名字
# 删除指定远程仓库
git fetch
拉取远程仓库的所有更新
git fetch origin
git fetch origin daily/0.0.1
# 取回指定分支的更新
git gc
运行Git的垃圾回收功能,清理冗余的历史快照
git archive
将打了 tag 某个版本打包提取
git archive -v --format=zip publish/0.0.1 > v0.1.zip
# --format 表示压缩格式
# -v 表示 tag 名
# 保存到工作区