避免多个冲突解决方案的最佳方法-在重设基础之前进行Git软重置?
每当我有一个复杂的重基,因为我当前的功能分支有很多细节,并且因为我的功能分支有很多小提交,解析过程看起来既麻烦又低效 我一直在寻找方法,以便在重新基址发生之前基本上挤压避免多个冲突解决方案的最佳方法-在重设基础之前进行Git软重置?,git,rebase,squash,Git,Rebase,Squash,每当我有一个复杂的重基,因为我当前的功能分支有很多细节,并且因为我的功能分支有很多小提交,解析过程看起来既麻烦又低效 我一直在寻找方法,以便在重新基址发生之前基本上挤压。一种解决方案似乎是将sofr重置为最后一次合并,然后从多个提交中创建一个提交,然后再进行重新基础 但这个解决方案似乎有点老套。有没有更好的方法来处理这个问题 编辑: 我指的是必须通过pull请求完成合并,而我无法控制合并过程本身的情况。正如您在评论中所指出的,您可能需要git rebase-I工作流程 运行git-rebase-
。一种解决方案似乎是将sofr重置为最后一次合并,然后从多个提交中创建一个提交,然后再进行重新基础
但这个解决方案似乎有点老套。有没有更好的方法来处理这个问题
编辑:
我指的是必须通过pull请求完成合并,而我无法控制合并过程本身的情况。正如您在评论中所指出的,您可能需要git rebase-I
工作流程
运行git-rebase-i
基本上告诉git:
列出当前分支上位于
之后的提交李>
为每一次此类提交提交提交一份说明表,上面写着“挑选”
李>
,然后按照说明操作李>
A1、A2、A3
,然后还有一些B1、B2
,例如:
...--o--o <-- origin/feature
\
A1--A2--A3--B1--B2 <-- feature (HEAD)
现在它会自动恢复列表,这取决于B
提交的说明。它再次暂停,启动编辑器,以提交新的一体式B
:
A--B <-- HEAD [in progress / being rebuilt]
/
...--o--o <-- origin/feature
\
A1--A2--A3--B1--B2 <-- feature [being rebased]
注意,如果存在冲突,Git暂停较大的停顿(实际上它完全退出了<代码> Git ReBase< /Case>命令,但后面留下了许多跟踪文件,<>代码> Git状态可以用来显示您仍然处于ReBASE的中间)。您必须修复冲突并运行
git-rebase--continue
来恢复操作。如果您只是在压缩一些提交,您不应该看到冲突,但是如果您正在安排一组分散的小冲突,即,最初不是将所有a
组聚集在一起,而是分散在一起,您将它们聚集在一起,您可能需要解决一些小冲突
在没有参数的情况下运行
git-rebase-i
会告诉git查找当前分支的“上游”设置。例如,如果feature
具有origin/feature
作为其上游,这相当于git-rebase-i origin/feature
。您总是将选定/编辑的TODO列表提交复制到指定的提交之后,但默认值为“已设置的上游”
请注意,您必须在运行git fetch
之前执行所有这些操作,因为git fetch
将更新origin/feature
。如果您确实运行了git fetch
,并且它确实更新了origin/feature
,您现在可能有:
o--o--o <-- origin/feature
/
...--o--* [remembered in your reflogs as origin/feature@{1}]
\
A1--A2--A3--B1--B2 <-- feature (HEAD)
(为了减少混乱,“狗”仍然在那里,只是不是
--all
部分。或者,您甚至可以使用git merge base
来定位commit*
,但我们将把它留给另一个主题。:-)您可以使用git merge--squash功能
:
git checkout master
git merge --squash feature_branch
这将从feature\u分支
将所有提交压缩为一个提交,并将此提交添加到master
例子
以下回购协议有一个分支功能/1
,该分支基于master
。在feature/1
中有一些提交,在master上有一个提交。之后,我在master
上执行了一个git merge--squash功能/1
,它创建了commit5497776
,其中包含了对feature/1
上的提交树所做的更改
* 5497776 (HEAD, master) merge --squash feature/1
* 46059c7 Change 2 on master
| * b080e96 (feature/1) Change 3 on feature branch
| * 6caf662 Change 2 on feature branch
| * 69d9993 Change 1 on feature branch
|/
* b39b078 Change 1
顺便说一下,我明确挑起了合并冲突。您可以在合并过程中解决这些问题,然后进行更改以将冲突标记为已解决,并继续执行git commit
软重置到上次合并,然后创建一个新的提交是最佳解决方案。这被严重否决了,但我认为这是不合理的,特别是在无法直接合并到主控的情况下,因为它必须通过拉式请求来完成。如果您的英语描述中还包含git命令,那么您的问题将更容易理解。一个简单的交互式重基(挤压所有内容)不会解决这个问题吗?你不会只在分支上发生冲突吧?这意味着该分支上的单个提交与同一分支上的其他提交发生冲突?是的,但挤压是否不仅发生在重基之后?为了避免多重冲突,我不是必须在重新调整基础之前挤压吗?否则,它仍将重播每次提交并要求我解决冲突。使用挤压的交互式重新基址应该保留初始提交的父级,除非您要求它也在某些内容上重新基址。如果您有大量提交,那么我猜您的重置--soft
工作流比重新基址-I
更快。在交互重基期间,您必须使用s
(用于挤压)积极标记除一次提交之外的所有提交,这对于(比如)30次提交来说似乎很乏味。您可能希望在基于您的功能分支的新分支上执行软-重设基址
,这样您就可以轻松返回原始分支(reflog
,也可以,但这样更简单)。是的,但我需要在合并之前重设基址,所以这不起作用。也许我理解您的问题是错误的,但您注意到,您希望将所有提交压缩为一个,然后在master
分支上对其重定基址。这正是merge--sqash
所做的,即使我们正在使用merge
命令。如您所见,最上面的提交5497776
处于启用状态
git log --decorate --oneline --graph origin/feature@{1}..
git checkout master
git merge --squash feature_branch
* 5497776 (HEAD, master) merge --squash feature/1
* 46059c7 Change 2 on master
| * b080e96 (feature/1) Change 3 on feature branch
| * 6caf662 Change 2 on feature branch
| * 69d9993 Change 1 on feature branch
|/
* b39b078 Change 1