gpt4 book ai didi

git - 恢复分支看起来像主人?

转载 作者:行者123 更新时间:2023-12-05 02:20:42 24 4
gpt4 key购买 nike

我有两个分支 developmaster。 develop 中有很多提交还没有在 master 中。尽管我需要使 develop 分支看起来与 master 完全相同。为了保留 develop 中发生的所有更改,我将从 develop 创建新分支,这样所有这些更改都不会丢失。

但是在“复制”develop 之后,我怎样才能安全地重置或恢复到看起来像 master

我看到了这个:Git: reset/revert a whole branch to another branches state?

所以要重置,我可以这样做:

git checkout develop
git reset --hard master

但问题是 develop 分支已经被推送到远程,而其他分支已经 pull 了 develop

也许有更安全的方法使用恢复或其他方式来做到这一点?但我想恢复(如果可能)以恢复到 master 状态的方式,而不是手动选择每个提交,因为一些最新的提交需要保留在 develop 中,因为它们来自 master(修补程序)。

因此 develop 上的提交历史看起来像这样(最顶层意味着按日期最新提交):

commit hotfix2 - in both develop and master
some other commits that are only in develop
commit hotfix1 - in both develop and master
some commits that are only in develop
all commits that came when develop was created from master

最佳答案

以非破坏性方式撤消提交的标准过程是使用 git revert .该命令基本上采用目标提交的反向差异并尝试应用它。所以你得到了一个新的提交,它撤销了所有的更改。

为了一次撤消多个提交,您还可以指定一个提交范围。鉴于您只有两个范围想要撤消(那些介于这些修补程序之间的范围),这实际上是可管理的。

您还可以使用标志 --no-commit , 或 -n , 自动创建提交。这允许您链接多个 git revert -n <commit>一个接一个地执行命令,而无需为每个命令创建还原提交。然后,当您选择完要撤消的所有提交或提交范围后,您可以进行一次 merge 所有提交的提交。

在你的例子中,因为你有另一个分支,它有你想要把你的 develop 的确切(工作目录)状态分支到,这样做要容易得多。您所要做的就是检查 master 的工作树进入你的develop分支并将该状态提交到 develop分支。您可以使用 git checkout master -- . 执行此操作.不幸的是,这不适用于 master 未知的路径。分支。因此,如果您在 develop 中添加了新文件分支,那些被保留,你必须单独删除它们。

相反,我们从 master 开始一个新分支(然后具有完全相同的内容),并重置该分支,使其基于 develop反而。这样,我们将工作目录状态从 master 保留下来。但提交将遵循 develop反而。之后,我们可以快进develop那一个 promise :

# checkout a new branch off master
git checkout -b new-develop master

# make a soft reset to develop
git reset --soft develop

# commit the changes
git commit

# get back to develop and fast forward
git checkout develop
git merge --ff-only new-develop
git branch -d new-develop

这将产生与链接 git revert -n 相同的结果所有提交都是 develop 独有的.有几种其他方法可以达到该状态,但这是最简单的方法。

无论您使用哪种方式达到此状态,您都应该考虑之后进行 merge 。 merge 实际上不会做任何事情(因为两个分支具有相同的内容)但它会 merge 历史记录中的分支,因此您会看到它们实际上会收敛。

所以假设历史最初看起来是这样的:

                       master

* ------------ h1 ------ h2
\ \ \
* -- * -- * -- * -- * -- *

develop

你会想把它变成这样:

                                master

* ------------ h1 ------ h2 ----- M
\ \ \ / ↖
* -- * -- * -- * -- * -- * -- F develop

F作为我们在上面创建的修复提交。这假设您想要 merge develop进入master ( git merge develop 而在 master )然后快进 develop ( git merge master 而在 develop )从那时起重新开始开发工作。当然,如果您愿意,也可以从另一个方向进行。

或者,我们也可以 merge M和修复 F只需一步。你会有效地 merge develop进入master并以您最终得到 master 内容的方式 merge 所有内容.这看起来像这样:

                                master

* ------------ h1 ------ h2 ---- FM
\ \ \ / ↖
* -- * -- * -- * -- * -- * ---/ develop

你可以像这样手动到达那里:

# since we merge into master, we start there
git checkout master

# start the merge, but don’t attempt to fast-forward and do not
# commit the merge automatically (since we want to change it)
git merge --no-ff --no-commit develop

# reset the index that was prepared during the merge
git reset

# now checkout the files from master and commit the merge
git checkout master -- .
git add .
git commit

实际上,这是一个很常见的场景 git merge 带有一个 merge 策略,正是这样做的。所以我们可以使用 ours 而不是上面的 merge 策略并丢弃我们 merge 到当前分支的任何内容:

git checkout master
git merge -s ours develop

关于git - 恢复分支看起来像主人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38116016/

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