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.