乐趣区

关于javascript:工作中使用-Git-解决问题的场景

简略来说,就这七点:

  • 应用 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 的?
退出移动版