git reset --soft 的实际用途?

2024-03-16

我使用 git 已经有一个多月了。事实上,我昨天才第一次使用重置,但软重置对我来说仍然没有多大意义。

我知道我可以使用软重置来编辑提交,而无需更改索引或工作目录,就像我所做的那样git commit --amend.

这两个命令真的一样吗(reset --soft vs commit --amend)?实际上有什么理由使用其中之一?更重要的是,它还有其他用途吗?reset --soft除了修改提交之外?


git reset一切都是为了移动HEAD, 一般是分行ref https://stackoverflow.com/a/54934887/6309.
问题:工作树和索引怎么样?
当受雇于--soft, moves HEAD,最常更新分支引用,并且仅更新HEAD.
这不同于commit --amend as:

  • 它不会创建新的提交。
  • 它实际上可以将 HEAD 移动到任何提交(如commit --amend只是关于not移动 HEAD,同时允许重做当前提交)

刚刚发现这个组合的例子:

  • 经典的合并
  • 子树合并

全部合而为一(章鱼,因为合并了两个以上的分支)提交合并。

托马斯·卡内基 http://blog.caurea.org/在他的解释中“子树章鱼合并”文章 http://blog.caurea.org/2009/11/19/subtree-octopus-merge.html:

  • 如果您想将一个项目合并到另一个项目的子目录中,并随后使子项目保持最新,则可以使用子树合并策略。它是 git 子模块的替代方案。
  • 章鱼合并策略可用于合并三个或更多分支。正常策略只能合并两个分支,如果您尝试合并更多分支,git 会自动回退到章鱼策略。

问题是你只能选择一种策略。但我想将两者结合起来,以获得干净的历史记录,其中整个存储库自动更新为新版本。

我有一个超级项目,我们称之为projectA和一个子项目,projectB,我合并到的子目录中projectA.

(这是子树合并部分)

我还维护一些本地提交。
ProjectA定期更新,projectB每隔几天或几周就会有一个新版本,通常取决于特定版本projectA.

当我决定更新这两个项目时,我不会简单地从projectA and projectB 因为这将为整个项目的原子更新创建两次提交.
反而,我创建了一个合并提交,它结合了projectA, projectB和我的本地承诺.
这里棘手的部分是这是一个章鱼合并(三个头),but projectB需要与子树策略合并。所以这就是我所做的:

# Merge projectA with the default strategy:
git merge projectA/master

# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master

这里作者使用了一个reset --hard, 进而read-tree恢复前两次合并对工作树和索引所做的操作,但这就是reset --soft可以帮助:
我如何重做这两个合并,这已经起作用了,即我的工作树和索引都很好,但不必记录这两个提交?

# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}

现在,我们可以恢复托马斯的解决方案:

# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD

# And finally do the commit:
git commit

所以,每次:

  • 您对最终结果感到满意(就工作树和索引而言)
  • you are not对您实现这一目标的所有承诺感到满意:

git reset --soft就是答案。


注意--no-soft没有意义,Git 2.42(2023 年第 3 季度)现在告诉你了。

See commit 3821eb6 https://github.com/git/git/commit/3821eb6c3dedba1c57522a1254a916f5ad0d15dc (19 Jul 2023) by Junio C Hamano (gitster) https://github.com/gitster.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit e672bc4 https://github.com/git/git/commit/e672bc4f76754ff6e39d09a84cb4544e193c96e5, 27 Jul 2023)

e672bc4f76 https://github.com/git/git/commit/e672bc4f76754ff6e39d09a84cb4544e193c96e5:合并分支 'jc/parse-options-reset'

命令行解析器修复。 * jc/parse-options-reset: 重置: 拒绝--no-(mixed|soft|hard|merge|keep) option

你会得到一个“unknown option" error.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git reset --soft 的实际用途? 的相关文章

随机推荐