gpt4 book ai didi

git - 我如何在提交之间移动部分更改(大块)?

转载 作者:太空狗 更新时间:2023-10-29 14:29:01 24 4
gpt4 key购买 nike

如果我有两个提交,它们之间有许多提交的距离,并且在两个提交中都提交了很多文件,那么如何最好地将一个大块从一个移动到另一个,例如:

在提交 100 中:我有很多文件更改和文件“aa.txt”中的许多更改,还有这个:
-aaaa
- bbbb
+ cccc

10 次提交之后我有另一个提交更改了很多文件和“aa.txt”:
+dddd

我想将行更改 -aaaa 从前者移动到后者。

是否有任何 CLI/UI 工具可以帮助您轻松做到这一点? (我显然对历史重写没有问题)

最佳答案

交互式 rebase 可能会起作用。但是很多因素可能会使这变得复杂。所以你已经描述了这么多:

x -- x -- A -- B -- C -- D -- x -- x <--(master)

某些行在A中被更改,因此在BCD中也有所不同,等。但是您想要一个新的历史记录,它在 D 之前不会更改。所以你可以说

git rebase --interactive A^ master

(其中 A 是之前发生更改的提交的 SHA ID,并注意位于所述 ID 末尾的 ^)。在出现的文本编辑器中,您会看到一个“待办事项”列表。第一行说 pick commit A;将其更改为 edit。然后找到 D 的行(在这个例子中是 3 次提交,但在你所说的例子中可能是 10 次提交)。也将其标记为 edit

rebase 将开始,但在尝试重新应用 A 后它将暂停,以便您可以编辑提交。

现在,如果您无法轻松地手动/凭内存撤销所讨论的更改,那么您可以取消暂存对该文件的更改

git reset HEAD^ -- aa.txt

然后以“补丁模式”再次上演它们。

git add --patch -- aa.txt

系统会提示您如何处理每个更改 block 。如果您要删除的更改出现在与其他更改相同的 block 中,您可以用 e 回答提示并编辑更改 block (然后替换之前的 -您不想再使用 删除的行。

现在将您的(暂存的)编辑提交到提交中

git commit --amend

您从索引中还原的更改仍在工作树中;把它拿开,告诉 rebase 回去工作。

git stash 
git rebase --continue

随着 rebase 继续致力于提交 D,中间的提交可能会发生冲突(如果他们编辑的 aa.txt 太接近您还原的更改)。这些冲突应该很容易解决。 (冲突的 HEAD 端将包括您不再删除的行;除该行外,您可能需要冲突的“其他”端。)

Commit D 也可能会出现冲突。如果是这样,您的工作很简单:只需通过保留冲突的“另一方”来解决该问题(包括删除有问题的行,因为这是您最终想要执行此操作的地方)。然后,当单独提示编辑 D 时(因为您在 TODO 列表中将其标记为 edit),您可以立即告诉 rebase --continue

如果 D 不冲突,没什么大不了的。系统会提示您对其进行编辑。 pop 您之前创建的存储以重新应用您从 A 提交中推迟的更改; 添加commit --amend

现在这种方法的问题是:如果有多个 refs 可以到达 A,这只会更新一个(上例中的 master)。例如

x -- A -- B -- C -- D -- x <--(master)
\
x -- x <--(branch)

在这种情况下,branch 仍然看到旧历史。你最终得到了

x -- A' -- B' -- C' -- D' -- x <--(master)
\
A -- B -- x -- x <--(branch)

你可以通过做类似的事情来解决这个问题

rebase --onto B' B branch

如果有很多分支要处理,这会很快变旧。

另一个问题是 rebase 是否会遇到 merge 提交。在某种程度上,您可以使用 --preserve-merges 来缓解这种情况,但如果 merge 是“邪恶的”(即可以使用默认自动解决),它仍然会导致问题(可能悄悄地破坏历史) merge 策略,但以某种方式进行了编辑)。在这种情况下,您可以做的最接近的事情就是分段 rebase 并在每个步骤中仔细地重现 merge 。

关于git - 我如何在提交之间移动部分更改(大块)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45059039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com