目录
学习资料:
1,git config
1,用户名和邮件
配置用户名和邮件:
# 添加配置
git config --global user.name 'Your name'
git config --global user.email 'Your email'
# 查看配置
git config --list --global
2,git 别名
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
git config --global
的配置都会放在 ~/.gitconfig
文件中,如下:
[alias]
co = checkout
br = branch
ci = commit
st = status
[user]
email = myemail@qq.com
name = myname
3,git ssh 免密登录
首先,查看 ~/.ssh
目录中是否有了公钥和私钥:
> ls ~/.ssh
————————————————————————————
id_rsa # 私钥
id_ras.pub # 公钥
如果没有则生成 ssh 文件,如果已有则忽略生成 ssh 步骤:
> ssh-keygen -t rsa -b 2048 # 然后一路回车即可
把生成的公钥 id_ras.pub 中的内容粘贴到远程 git 管理平台中。
账户 > Your Profile/Settings > Edit Profile > SSH Keys > New SSH Key
2,git init & clone
创建 git 仓库有两种方式:
- 用 git init 初始化一个目录
- 从远程仓库克隆一个 git 项目
# 在某个目录下执行,将该目录初始化为一个 git 项目
git init
# 克隆远程仓库
git clone <url>
3,git add
将指定内容放入暂存区:
git add <file>
git add .
撤销:
git reset HEAD <file> # 取消对 <file> 的暂存,就是将其状态改为未暂存状态,相当于没有执行 git add <file>
# 这样,在执行 git commit 时,就不会包含该文件
git checkout -- <file> # <file> 文件已发生改变,但还没有被放入暂存区(可使用 git add <file> 将其放入暂存区)
# git checkout -- <file> 的含义是将目前对 <file> 的修改还原/撤销到未修改之前
4,git commit
git commit # 将暂存区内容,提交到本地仓库
git commit -a # 将暂存和未暂存的内容,一并提交
git commit -m # 添加提交信息
# 使用一次新的 commit,替代上一次提交
# 如果代码没有变化,则修改最近一次的提交信息
git commit --amend -m [message]
回滚:
git reset --hard <commit_id> # 将 git 版本回退到 commit_id 版本
# 要慎用,它会将 commit_id 版本之后提交的所有提交记录全部删除,一点信息不留
git revert # 将指定的提交(普通提交 / merge提交)撤销掉,比 reset 更安全
git commit message 规范:
- feat:新功能、新特性
- fix:修补 bug
- docs:文档修改
- style:代码格式修改(不影响代码运行的变动)
- refactor:代码重构(即不是新增功能,也不是修改bug)
- perf:优化相关,比如提升性能、体验
- test:增加测试
- chore:构建过程或辅助工具的变动
- revert:回滚代码
5,git status
git status # 查看当前状态
git status -s # 用简洁的方式,查看当前状态
#########################
M README # 已被修改的文件,还没有被加入暂存区
MM Rakefile # 修改过的文件,已被加入暂存区,然后又被修改了
A lib/git.rb # 新被加入到暂存区的文件
?? LICENSE.txt # 未被跟踪的文件
6,git diff
# 查看未暂存的修改 --- 当前做的哪些更新尚未暂存?
git diff
# 只查看一个文件的不同
git diff <file>
# 查看已暂存的修改 --- 有哪些更新已暂存并准备好下次提交?
git diff --staged/cached # 这条命令将比对已暂存文件与最后一次提交的文件差异
7,git rm & mv
git rm <file> # 将 <file> 移出版本管理,并从磁盘删除本地文件
git rm --cached <file> # 将 <file> 移出版本管理,但不删除本地文件
git mv <from> <to> # 文件重命名
9,git log
git log # 按时间先后顺序列出所有的提交,最近的更新排在最上面
git log <file> # 只查看一个文件的提交日志
git log -p / --patch -n # 显示每次提交所引入的差异,n 表示只显示最近的 n 次
git log --stat # 查看每次提交的简略统计信息
# 使用不同于默认格式的方式展示提交历史
git log --pretty=oneline # 会将每个提交放在一行显示,在浏览大量的提交时非常有用
short
full
fuller
git log --pretty=format # 定制化输出
# 当 oneline 或 format 与 --graph 结合使用时,可显示分支的合并历史,比如:
git log --pretty=format:"%h %s" --graph [--all] # --all 表示所有分支
10,git remote
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add <shortname> <url> # 添加一个新的远程 Git 仓库,同时指定一个方便使用的简写
git remote rm <shortname> # 删除与远程仓库的联系
# 拉取远程仓库
git fetch <shortname> <branch> # 将远程的<branch>分支的最新内容拉到本地(并不进行合并操作)
git fetch <shortname> # 将远程的所有分支的最新内容拉到本地
11,git pull & push
git pull origin <branch> # 从远程拉取 <branch>,并将其合并到本地的当前所在分支
git push origin <branch> # 将本地分支 <branch> 推送到远程
12,git branch & checkout
git branch # 查看所有本地分支
git branch -r # 查看所有远程分支
git branch -a # 查看所有本地分支和远程分支
git branch <new_branch> # 从当前分支创建一个新分支
git checkout <branch> # 切换分支
git checkout -b <new_branch> # 从当前分支创建分支,并切换到新分支
git checkout <branch> origin/<branch> # 将远程的 <branch> 分支迁到本地
git checkout -b <branch> origin/<branch> # 将远程的 <branch> 分支迁到本地,并切换到新分支
git branch -d <branch> # 删除本地分支
git merge <branch> # 将 <branch> 合并到当前分支
13,git stash
这样一个场景:
- 你正在当前本地分支(my_branch)上做开发
- 突然来了一个紧急任务,你需要去处理,那就要切到一个新的分支上去处理
- 如果当前工作区有还未提交的文件,这时候是无法切换到新的分支的
- 此时你有两种方式:
- 第一种:将当前工作区内容提交后,切换到新分支去处理问题
- 第二种:将当前工作区的内容暂存,切换到新分支去处理问题
- 在新分支上处理完问题之后,切换到之前分支(my_branch)继续开发
第 4 步的第一种方式无须讲解,你就会处理。来看下第 4 步的第二种方式如何处理?
这时候需要用到 git stash 命令:
# 执行 stash 命令
# 该命令会将你当前工作区的内容暂存起来(暂存到一个栈中)
# 以让你你能切换到别的分支去处理问题
git stash
# 查看 stash 中的信息
git stash list
# 当你切换到别的分支,处理完紧急任务后,你又回到了之前的分支
# 此时想恢复 stash 中的内容,使用下面命令,然后就可以在之前的基础上继续开发了
git stash pop
14,git 禁令
在团队合作中以下命令最好禁止使用:
# 当向远程 push 时,有时候会因为自己的版本比较落后(不是 fast-forwards),而 push 失败
# 如果用 push -f 则会强制将自己的版本 push 到远端
# 这样的话就会将远程比较新的更新给覆盖掉
# 所以 push -f 最好禁止使用
git push -f