您的位置:首页>科学 >【转】git reset简介

【转】git reset简介

2023-10-07 22:21
-->

http://www.webguidecorpuschristi.com/hudashi/article/details/7664464

http://www.webguidecorpuschristi.com/blog/1014369

http://www.webguidecorpuschristi.com/tiger_tnt/blog/item/a0464ffa6a8115d9b58f314d.html

http://www.webguidecorpuschristi.com/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-reset.html

1。基本
在git的一般使用中,如果发现添加不想暂存到索引中的文件出错,想要回滚取消,可以使用命令:git reset HEAD ...,并且git add完成后,Git也会给出相应的提示,如:
报价
# 要提交的更改:
#(使用“git reset HEAD ...”取消暂存)
#
#新文件:Test.scala
git reset [--hard|soft|mixed|merge|keep] [或HEAD]:重置当前分支到指定的或HEAD(默认,如果指定则不显示commit,默认是HEAD,也就是最新的commit),并且可以根据[mode]更新索引和工作目录。 mode 的值可以是hard、soft、mixed、merge 或keep。下面详细解释每种模式的含义和效果。
A)。 --hard:重置索引和工作目录。自 以来工作目录中的任何更改都将被丢弃,并将 HEAD 指向 。​
一个具体的例子,假设有3次提交,git st:
commit3:添加test3.c
commit2:添加test2.c
commit1:添加test1.c
执行 git reset --hard HEAD~1 后,
显示:HEAD 现在位于 commit2,运行 git log
commit2:添加test2.c
commit1:添加test1.c
运行 git st,没有任何变化
B)。 --soft:不对索引和工作目录的内容进行任何更改,只需将HEAD指向即可。该模式的效果是,执行后,自以来的所有更改都会显示在git status的“Changes to be commit”中。​
一个具体的例子,假设有3次提交,git st:
commit3:添加test3.c
commit2:添加test2.c
commit1:添加test1.c
执行 git reset --soft (默认) HEAD~1 后,运行 git log
commit2:添加test2.c
commit1:添加test1.c
运行 git status,则 test3.c 已在暂存区并准备提交。也就是这个时候git commit就会提交。
在使用git进行协作开发时,我们经常需要将我们的修改发送给其他人来生成补丁。不过,在修改代码的过程中,我们进行了多次提交。从初始代码状态到最终代码如何生成补丁?状态补丁怎么样?下面要介绍的函数就是为了处理这种情况。
现在假设我们的git软件仓库中的分支如下:
a-->b-->c
也就是说我们的代码从状态a修改到状态b并提交一次,再修改到状态c并提交一次。此时我们已经确认从a到c的修改是正确的,状态b不再需要,我们需要为从a到c的改变生成补丁并发送给其他人。如果直接打包的话,会生成两个路径。那么如何生成补丁呢?在这种情况下,您需要 git-reset 命令。
首先创建状态a的标签,假设名称为A,然后执行
git-reset --软A
这样我们的软件仓库就变成了
a
状态b和状态c都被删除了,但是当前的代码没有改变,仍然是状态c的代码。这时候我们进行commit,软件仓库就变成如下:
a-->d
状态d和状态c对应的代码是完全一样的,只是名称不同。现在您可以生成补丁包并将其发送给其他人。
C)。 --mixed:仅重置索引,但不重置工作目录。该模式是默认模式,即当没有显示git重置模式时,将使用混合模式。这种模式的作用是对工作目录中文件的修改会被保留,不会被丢弃。但是,它们不会被标记为“要提交的更改”,但会打印一份报告,表明它们尚未更新。报告如下:
报价
重置后未暂存的更改:
M 测试.Scala
M 测试.txt
D)。 --merge 和 --keep 使用不多,如以下示例中所述。​
2。常用示例
以下是git Reset的一些典型应用场景:
A) 回滚添加操作
报价
$编辑
$ git add frotz.c filfre.c
$ mailx                                       (2)
$ git 重置
$ git pull git://www.webguidecorpuschristi.com/ nitfol (4)
(1) 编辑文件frtz.c、filfre.c,进行一些更改,并将更改添加到索引中
(2)查看邮件,发现有人要你pull,有一些改动需要你合并。
(3) 但是,你搞乱了索引,因为索引与 HEAD 相同
提交不匹配,但您知道即将拉取的内容不会影响修改后的 frotz.c 和 filfre.c,因此您可以恢复这两个文件中的更改。
恢复后,这些更改应该仍然在工作目录中,因此执行 git reset。​
(4) 然后,执行pull后,自动合并后,对frotz.c和filfre.c的更改仍然在工作目录中。​
B) 回滚最新提交
报价
$ git 提交 ...
$ git reset --soft HEAD^ (1)
$ 编辑                           (2)
$ git commit -a -c ORIG_HEAD (3)
(1) 提交后,发现代码没有完全提交,或者想重新编辑提交的注释,执行 git reset --soft HEAD^,使工作树与之前保持一致重置,不做任何改变。 .​
HEAD^ 指向 HEAD 之前的最新提交。​
(2)修改工作树下的文件
(3)
然后使用重置前提交的评论、作者、日期等信息重新提交。注意执行git时
当执行reset命令时,git会将旧的HEAD复制到文件.git/ORIG_HEAD中。您可以使用 ORIG_HEAD 在命令中引用此提交。
commit命令中的-a参数意思是告诉git自动将所有修改和删除的文件放入stage
区域,未由 git 跟踪的新创建的文件不受影响。在提交命令中 -c 或 -C
表示提交提交的commit对象中的信息(作者、提交者、评论、时间戳等),所以这个commit命令的意义非常
清楚了,将所有更改的文件添加到stage中
区域并使用上次提交信息重新提交。​
C) 回滚最后几次提交并将这些提交放在名为 topic 的分支上。
报价
$ git 分支主题/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout 主题/wip (3)
(1) 你已经提交了一些提交,但此时你发现这些提交还不够成熟,无法进入 master 分支,但你想在新分支上打磨这些提交更改。因此,执行 gitbranch 命令在当前 HEAD 上创建一个名为 topic/wip 的新分支。​
(2) 然后回滚母版
分支上的最后三个提交。 HEAD~3 指向当前 HEAD-3 提交的提交, git reset --hard
HEAD~3 删除最近的三个提交(删除 HEAD、HEAD^、HEAD~2)并将 HEAD 指向 HEAD~3。
D) 永久删除最后几次提交
报价
$ git 提交...
$ git reset --hard HEAD~3 (1)
(1) 最后三个提交(即 HEAD、HEAD^ 和 HEAD~2)有问题,并且您想永久删除这三个提交。​
E) 回滚合并和拉取操作
报价
$ git pull                             (1)
自动合并硝基酚
CONFLICT(内容):nitfol 中的合并冲突
自动合并失败;修复冲突,然后提交结果。
$ git reset --hard               (2)
$ git pull .主题/分支 (3)
从 41223...更新至 13134...
快进
$ git reset --hard ORIG_HEAD (4)
(1) 您从源中提取了一些更新,但发生了很多冲突。你现在没有太多时间来解决这些冲突,所以你决定等有时间再拉它们。​
(2)
由于拉取操作引发了冲突,所有拉取的更改尚未提交,仍处于暂存区。在这种情况下, git reset --hard 和
git reset --hard HEAD 的意思是一样的,就是清除索引和工作树中乱七八糟的东西。​
(3) 将主题/分支合并到当前分支。这次没有冲突,合并的更改会自动提交。​
(4)
但此时你发现合并主题/分支还为时过早,所以你决定回滚合并,执行 git reset --hard
ORIG_HEAD 回滚之前的拉取/合并操作。注意:如前所述,执行git
重置时,git会将重置前的HEAD放入.git/ORIG_HEAD文件中,并在命令行中使用ORIG_HEAD来引用本次提交。同样
是的,在执行拉取和合并操作时,git会将操作之前的HEAD放入ORIG_HEAD中,以防止回滚操作。​
F) 回滚合并或拉入受污染的工作树
报价
$ git pull                             (1)
自动合并硝基酚
通过递归进行合并。
尼特福
...
$ git reset --merge ORIG_HEAD (2)
(1) 即使你在本地更改了一些工作树,你也可以安全地进行 git pull,前提是你知道要拉取的内容不会覆盖你工作树中的内容。​
(2) git
拉取完成后,你发现对本次所做的修改不满意,想要回滚到拉取前的状态。从前面的介绍我们知道,我们可以执行 git reset --hard
ORIG_HEAD,但是这个命令有一个副作用,就是清除你的工作树,即丢弃你本地尚未添加的更改。避免丢弃工作
对于树中的内容,可以使用 git reset --merge ORIG_HEAD。请注意,--hard 替换为
--merge 以避免回滚时清除工作
树。​
G) 工作流程中断
在实际开发中,经常会出现这样的情况:你正在开发一个大的功能,突然出现一个紧急的bug需要修复。然而,工作树中的内容还没有形成,还不足以提交,还得切换到另一个分支来修复bug。请看下面的例子
报价
$ git checkout feature ;# 你正在“feature”分支工作并且
$ 工作工作工作;# 被打断
$ git commit -a -m "快照 WIP"                   (1)
$ git checkout master
$修复修复修复
$ git commit ;# 使用真实日志提交
$ git 结帐功能
$ git reset --soft HEAD^ ;# 返回 WIP 状态 (2)
$ git 重置                                         (3)
(1) 这是临时提交,所以只需添加临时评论即可。​
(2) 此重置会删除 WIP 提交并将工作树设置为提交 WIP 快照之前的状态。​
(3) 此时,提交“快照WIP”时所做的未提交更改仍保留在索引中。 git reset 会清理索引并将其恢复到“快照 WIP”提交之前的状态,以便可以继续工作。​
(H) 重置单独的文件
假设您已将一个文件添加到索引中,但不打算稍后提交该文件。您可以使用 git reset 从索引中删除该文件。​
报价
$ git 重置 -- frotz.c                         (1)
$ git commit -m "提交索引中的文件" (2)
$ git add frotz.c                           (3)
(1) 从索引中删除文件 frtz.c,
(2) 提交索引中的文件
(3) 再次将froz.c添加到索引中
(I) 保留工作树并丢弃一些先前的提交
假设你正在编辑一些文件并已提交,然后继续工作,但现在你发现工作树中当前的内容应该属于另一个分支,与之前的提交无关。此时,您可以打开一个新分支并保留工作树中的内容。​
报价
$ git 标签开始
$ git checkout -b 分支1
$ 编辑
$ git commit ...                                           (1)
$ 编辑
$ git checkout -b 分支2                 (2)
$ git reset --keep start                     (3)
(1) 这次提交了branch1中的更改​​。​
(2) 这时候你发现之前的提交不属于这个分支。此时,您创建了一个新的branch2并切换到branch2。​
(3) 此时可以使用reset --keep清除start后的提交,但保持工作树不变。​
3。进阶篇
语法
git重置 [-q] [] [--]
git重置(--补丁| -p)[] [--] […]
git重置(--soft | --mixed | --hard | --merge | --keep)[-q] []