共计 4109 个字符,预计需要花费 11 分钟才能阅读完成。
简略来说,就这七点:
- 应用 git rebase 让提交记录更加清晰可读
- 应用 git reflog + git reset 跳到任意 commit
- 应用 git cherry-pick 获取指定的 commit
- 应用 git commit –amend 更改提交内容
- 应用 git revert 回滚某次的提交
- 应用 git stash 来暂存文件
- 配置 git alias 晋升工作效率
应用 git rebase 让提交记录更加清晰可读
rebase 根本用法
rebase 翻译为变基,它的作用和 merge 类似,用于把一个分支的批改合并到以后分支
如下图所示,通过 rebase 后提交历史的变动状况
不明确单分支的益处,能够在看看知乎的这个问题:Git commits 历史是如何做到如此清新的?
Vue 的作者尤雨溪就是说:多用 rebase
具体用法:
- 基于 master 分支创立 feature 分支
- 在 feature 分支上开发性能点
- master 上也提交了 commit
- 在 feature 分支上执行
git rebase master
,意为以 master 分支最初的提交作为基点,一一利用 feature 的每个更改
git rebase VS git merge
合并分支有两种,即 rebase、merge
merge 翻译为合并,即 git merge branchname
,即合并分支代码,这种办法会保留每次 commit 的,当你应用 gitk 查看时就发现好几条色彩的线
另一种是 rebase,即去除一系列的提交记录,“复制”它们,而后在另一个中央一一放下去
所以 rebase 的劣势就明了了,它能发明更清晰的提交记录
但 merge 会保留你所有的 commit 的历史工夫,当开发人员一多,历史记录就会变得凌乱
rebase 的交互模式
在开发中,通常会在一个分支上产生很多有效的提交,这种状况下应用 rebase 的交互模式能够把屡次 commit 压缩成一次提交,失去一个洁净的提交历史
# 先看提交
git log
# f9f6f3b commit 3
# 2feb45f commit 2
# 07a3cb6 commit 1
# 咱们要批改 2 的话,rebase 到它的下一个 commit,这里是 1
git rebase 07a3cb6 -i
# 而后在关上的对话框外面批改,之后还要一个 rebase continue
git rebase -i <base-commit>
# 或者是 git rebase -i HEAD~2 对最近的两次 commit 进行合并
也有人称之为后悔药性能,即你无论写什么 commit,最初都能够批改,无论提交什么,都能够合并,DIY 性强
应用 git reflog + git reset 跳到任意 commit
换个说法叫时光机,即通过查找所有分支的所有操作记录(包含曾经被删除的 commit 记录和 reset 的操作),通过 reset HEAD 跳到指定 commit
git reflog
#afa2f45 HEAD@{10}: checkout: moving from 明天 to 今天
#4abcda5 HEAD@{11}: commit: 买通 1800 处仙窍
#de42069 HEAD@{12}: commit: 真言轮经大成
git reset HEAD@{10}
# 或者 git reset --hard afa2f45
如此一来,就回到了 afa2f45 commit 处,相熟「工夫法令」、「时光机」的人都晓得,这是回到过来
应用 git cherry-pick 获取指定的 commit
意为“挑拣”提交,和 merge 合并一个分支的所有提交不同,它会获取某个分支的单个提交,并作为一个新的提交接入到以后分支上
这个须要故事背景才容易了解
张三在分支上开发性能,每个性能点提交一次 commit,共六个提交六个性能点(别离是 feature1~feature6),再回到第一个提交点,即他应用 git reset --hard feature1
跳转第一个 commit,在此基础上开发一个新性能,即 feature7,那么如果把 feature7 合并到 feature6 上怎么做?
git reflog
# git reflog 查看所有分支的所有操作记录(包含曾经被删除的 commit 记录和 reset 的操作)# 找到 feature7 的 commit 4c97ff3
# 回到 feature6 的 commit cd52afc
git reset --hard cd52afc
# 应用 cherry-pick 拿到 feature7 的代码
git cherry-pick 4c97ff3
具体可看小蝌蚪的这篇 小蝌蚪传记:git 时光穿梭机 – 女神的侧颜 来领会一二
简略来说,你的每一次 commit,就是一次记录,能够合并到任意中央。所以开发性能点或者修复 bug 之类,尽量做到一个性能点一个 commit,不便出错时挑拣代码
应用 git commit –amend 更改提交内容
amend 的意思是修改
# 持续改变你的文件
git add .
git commit --amend --no-edit
# 你这次的改变会被增加进最近一次的 commit 中
合并到上次的 commit 中
git commit --amend
:弹出让你批改内容
git commit --amend --no-edit
:放弃上一次的 commit 内容
PS:如果你的代码曾经 push 了的话,要慎用,因为会批改提交历史。
应用 git revert 回滚某次的提交
上文提到一个回滚操作:git reset --hard xxx
,能回到某次的 commit,除此之外,还有一种则是能撤销某次 commit
# 先找到你想撤销的那个 commit hash 值
git log
git revert <commit-id>
这种做法会新建一条 commit 信息,来撤回之前的批改。
而 git reset 会间接提交记录退回到指定的 commit 上。
所以就集体开发或集体 feature 分支而言,能够应用 git reset
来回滚代码,但在多人合作的集成分支上,git revert
更适宜。这样,提交的历史记录不会被抹去,能够平安地进行撤回
应用 git stash 来暂存文件
顾名思义,就是把本地的改变暂存起来
先理解下 git 的四大工作区域
四大工作区域
- Workspace(工作区):本地电脑所见的文件和目录
- Index/Stage(暂存区):个别寄存在
.git
目录下,当你git add 改变文件
,改变的文件就放入在「暂存区」 - Respository(本地仓库):当你
git clone 地址
,就将近程仓库克隆到本地仓库。它是存在本地的版本库,其中 HEAD 指向最新放入仓库的版本。当你执行git commit
,文件改变就到本地仓库 - Remote(近程仓库):相似 Github、Gitlab、码云等放在代码托管平台
常见的场景是你还在开发一个性能点的时候,忽然有个线上 bug 须要你紧急修复,这次你能够 git commit 提交到本地仓库,后续通过 git commit --amend
持续在原 commit 上批改内容。但这里还有一种办法,行将代码存在暂存区,等 bug 修复完后,再从暂存区取出
根本命令如下:
git stash # 将本地的改变暂存
git stash save "message" # 执行存储时,增加备注
git stash pop # 利用最近一次暂存,并删除暂存记录
git stash apply #复原最近的存储,但不会把存储从存储列表中删除,某人应用第一个存储,即 stash@{0},如果要应用其余,git stash apply stash@{$num}
git stash list # 查看 stash 了哪些存储
git stash clear #删除所有缓存的 stash
git ls-files --stage #查看 index 暂存区
配置 git alias 晋升工作效率
次要是为了简化命令,它的根本用法是 git config --global alias.< 简化的字符 > 原始命令
如上面的例子:
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
当然,另一种办法是在 .gitconfig 文件中设置
[alias]
st = status -sb
co = checkout
br = branch
mg = merge
ci = commit
ds = diff --staged
dt = difftool
mt = mergetool
last = log -1 HEAD
latest = for-each-ref --sort=-committerdate --format=\"%(committername)@%(refname:short) [%(committerdate:short)] %(contents)\"
ls = log --pretty=format:\"%C(yellow)%h %C(blue)%ad %C(red)%d %C(reset)%s %C(green)[%cn]\" --decorate --date=short
hist = log --pretty=format:\"%C(yellow)%h %C(red)%d %C(reset)%s %C(green)[%an] %C(blue)%ad\" --topo-order --graph --date=short
type = cat-file -t
dump = cat-file -p
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
参考政采云的配置
除此之外
还有一些不常见却好用的命令
gitk
:关上 git 的图形化工具gitjk
:吊销您刚刚在 git 中所做的操作git help -g
:展现帮忙信息cat .git/HEAD
:查看分支文件-
git fetch --all && git reset --hard origin/master
:回到近程仓库的状态- 摈弃本地所有的批改,回到近程仓库的状态
git push -f origin master
:强行获取近程最新代码
参考资料
- git 时光穿梭机
- 我在工作中是如何应用 git 的
- 程序员必会的六条黄金 Git 命令,让你效率进步百分之百
- Oh Shit, Git!?!
- 我是如何应用 git 的?