git的拓展应用(提高工作效率)
git版本管理中,较为常用即为 pull 和 push 这两个指令。而实际使用中仍有一些重要的指令可为我们提供方便,本文中主要提到的指令有 stash、reset --soft、cherry-pick、revert 和 reflog。
stash
简介
当您想记录工作目录和索引的当前状态,但又想返回一个干净的工作目录时,请使用git stash
。该命令将保存本地修改,并恢复工作目录以匹配头部提交。stash
命令能够将还未commit
的代码存起来,让你的工作目录变得干净。
应用场景
当你在独立分支上开发新需求时,临时需要在master主分支上进行代码修改(例如改线上项目bug),此时你手上功能仅开发到一半,需要对代码进行暂存时,即可用到stash
指令。
stash
指令不同于直接commit
代码,不会在分支中提交记录,仅会对代码提供一个暂存的作用。
相关命令
# 保存当前未commit的代码
git stash
# 保存当前未commit的代码并添加备注
git stash save "备注的内容"
# 列出stash的所有记录
git stash list
# 删除stash的所有记录
git stash clear
# 应用最近一次的stash
git stash apply
# 应用最近一次的stash,随后删除该记录
git stash pop
# 删除最近的一次stash
git stash drop
当有多条stash
,我们可以指定操作某一条stash
,首先需要stash list
列出所有记录,然后再操作指令后面直接添加上想操作的指令。
# 列出所有记录
$ git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ...
stash@{2}: On ...
# 应用第二条记录
$ git stash stash apply stash@{1}
# pop, drop 指令同理
reset --soft
简介
主要用于版本的回退,只对commit
操作的代码进行回退,不会影响到工作区(本地保存)的文件。回退到指定版本时,该版本后修改的内容会回到暂存区,并不会被删除。
应用场景
- 不小心
commit
了不该提交的内容,不想使用commit
进行覆盖并留下记录,此时可使用reset --soft
指令进行代码回溯 - 代码管理规范化,提交需要按照功能点来分辨时,将不同功能的代码修改一次
commit
了,需要进行代码回退
相关命令
# 恢复最近一次 commit
git reset --soft HEAD^
# 恢复上上次 commit
git reset --soft HEAD^^
# 恢复上上上次 commit
git reset --soft HEAD^^^
以上指令是针对于直接回退到近几次的 commit 版本,如果回退版本较多,也可以直接指定 commit 的版本号进行回溯。
# 先使用 log 命令显示我们的 commit 记录,commit 字符后的便是相应的版本号
$ git log
commit 1669bcf55e1e177284d297bb41d1f7a3411dd333 (HEAD -> ***, origin/***)
Author: ***
Date: Tue Mar 29 14:42:58 2022 +0800
commit222 日志
commit a7820456a42cad712c4d01df842a5f83d683333d
Author: ***
Date: Tue Mar 29 14:37:15 2022 +0800
commit111 日志
# 指定版本号进行代码版本回退到commit111版本,commit222版本的代码也会回到暂存区
$ git reset --soft a7820456a42cad712c4d01df842a5f83d683333d
**备注:**以上说的是还未push
的commit
。对于已经push
的commit
,也可以使用该命令,不过再次push
时,由于远程分支和本地分支有差异,需要强制推送git push -f
来覆盖被reset
的commit
。
cherry-pick
简介
给定一个或多个现有提交,应用每个提交引入的更改,为每个提交记录一个新的提交。简单地说,就是将a分支中已经提交的commit
,复制出新的commit
应用到b分支里。
应用场景
- 为了将 a 分支中的代码复制到 b 分支中,例如在需求开发中,有些功能暂时不需要提交到正式环境中,即可将自己分支中的指定版本复制到主分支中。
- 某一分支的代码被污染了,结构较为混乱,开启新分支后将原有分支中的部分有用代码复制到新分支。
相关命令
# a分支
$ git log
commit 1669bcf55e1e177284d297bb41d1f7a3411aa333 (HEAD -> aaa, origin/aaa)
Author: ***
Date: Tue Mar 29 14:42:58 2022 +0800
a3
commit a7820456a42cad712c4d01df842a5f83d68aa222
Author: ***
Date: Tue Mar 29 14:37:15 2022 +0800
a2
commit a7820456a42cad712c4d01df842a5f83d68aa111
Author: ***
Date: Tue Mar 29 14:37:00 2022 +0800
a1
# b分支
$ git log
commit 1669bcf55e1e177284d297bb41d1f7a3411bb222 (HEAD -> bbb, origin/bbb)
Author: ***
Date: Tue Mar 29 14:42:58 2022 +0800
b2
commit a7820456a42cad712c4d01df842a5f83d68bb111
Author: ***
Date: Tue Mar 29 14:37:00 2022 +0800
b1
复制单个:将 a1 版本复制到 b分支中
# 切换到 b分支,执行以下命令
$ git cherry-pick a1版本号
复制多个:
# 一次转移多个提交,将a1、a2复制到 b分支
# 切换到 b分支,执行以下命令
$ git cherry-pick a1版本号 a2版本号
# 区间复制,将a1至a3全部复制到 b分支
# 切换到 b分支,执行以下命令
$ git cherry-pick a1版本号^..a3版本号
备注:
使用cherry-pick
进行代码复制时,有时会出现代码冲突的情况。此时需要解决出现冲突的代码,然后再使用cherry-pick --continue
让复制继续。如果想要终止复制,可使用git cherry-pick --abort
命令。 想要回到操作前的样子,可以直接退出cherry-pick
,使用git cherry-pick --quit
命令
revert
简介
给定一个或多个现有提交,恢复相关提交引入的更改,并记录这些更改的新提交。将现有的提交还原,恢复提交的内容,并生成一条还原记录。
区别于reset
指令,revert
指令不会对其他提交造成影响,只会作用于恢复的提交,并会留下更改记录。
应用场景
在某分支上,依次有a、b、c三个提交记录,此时想更改a提交记录中的相关代码,又不影响到b、c两次提交的代码,便可直接使用revert
指令操作a记录。
相关命令
revert
普通提交
# b分支,现有提交记录
$ git log
commit 1669bcf55e1e177284d297bb41d1f7a3411bb222 (HEAD -> bbb, origin/bbb)
Author: ***
Date: Tue Mar 29 14:42:58 2022 +0800
b2
commit a7820456a42cad712c4d01df842a5f83d68bb111
Author: ***
Date: Tue Mar 29 14:37:00 2022 +0800
b1
# 修改b1
$ git revert commit b1版本号
使用revert
命令后会进入编辑页面,编辑下日志信息后使用wq
保存指令即可。此时查看最新日志,便能看到生成了一条新的revert
记录,之前提交的记录仍保留着,但修改的代码已撤回。
reflog
简介
此命令用于管理重录中记录的信息。
如果说reset --soft
是后悔药,那reflog
就是强力后悔药。它记录了所有的commit
操作记录,便于错误操作后找回记录。
应用场景
当使用reset
命令回退过头时,我们可以使用reflog
查询到reset
前的commit
记录,再次reset
回去便可恢复之前的误操作。
相关命令
# a分支
$ git log
commit 1669bcf55e1e177284d297bb41d1f7a3411aa333 (HEAD -> aaa, origin/aaa)
Author: ***
Date: Tue Mar 29 14:42:58 2022 +0800
a3
commit a7820456a42cad712c4d01df842a5f83d68aa222
Author: ***
Date: Tue Mar 29 14:37:15 2022 +0800
a2
commit a7820456a42cad712c4d01df842a5f83d68aa111
Author: ***
Date: Tue Mar 29 14:37:00 2022 +0800
a1
以上是a分支的提交情况,由于a3代码出问题了,想直接删除掉a3记录,不小心删错了,将a2也删除了。
# a分支,此时仅剩下a1记录
$ git log
commit a7820456a42cad712c4d01df842a5f83d68aa111 (HEAD -> aaa, origin/aaa)
Author: ***
Date: Tue Mar 29 14:37:00 2022 +0800
a1
这时便可使用reflog
查询到之前的commit
记录
# 查询之前的 commit 记录
$ git reflog
# 由 reflog 指令能得到a分支的所有commit记录,得到a3的版本号
# 此时再使用reset指令便可覆盖之前的误操作,仅删除a3记录
$ git reset --hard a3版本号
# 使用上述指令后,能查询到a2版本回来了
总结
本文只要介绍了五个指令,其指令和主要功能要点如下:
stash
:存储临时代码。reset --soft
:软回溯,回退 commit 的同时保留修改内容。cherry-pick
:复制 commit。revert
:撤销 commit 的修改内容。reflog
:记录了 commit 的历史操作。