gpt4 book ai didi

git - 将已删除文件的分支 merge 回 master

转载 作者:太空狗 更新时间:2023-10-29 13:28:31 26 4
gpt4 key购买 nike

在我的主分支中,我得到了 2 个文件:

file1.txt
file2.txt

我从那里创建了名为 b1 的新分支。在b1中,我修改了file2.txt,不小心删除了file1.txt(从磁盘中,当我打开windows资源管理器到源文件夹时,file1.txt不在那里)。
现在我想保留 file2.txt 中的更改并从 master 恢复 file1.txt(我不需要删除的版本)。我切换到 master, merge 到 b1,没有发生冲突,它说“全部是最新的”但 file1.txt 不在那里。我应该怎么做?谢谢。

最佳答案

我想你在这里问了几个问题。第一个似乎是“我如何恢复 file1.txt?”假设您的修订图如下所示:

               M
(master) o -- o --- o ------o HEAD
\ /
(b1) o -- o -- o
A B C

您可以获得 file1.txt 的上一个副本来自 git checkout :
git checkout HEAD~1 -- file1.txt

那会复活 file1.txt并将其暂存到您的工作副本中。您可以在 git commit并且文件会回来。注: HEAD~1说取 HEAD 的第一个父级,它指向 merge b1 之前的 master 状态。如果您知道提交 ID,则可以使用它代替 HEAD~1以及。

您似乎要问的另一个问题是“我应该在分支 b1 中做什么来避免这种情况?”最明显的选择是不删除 file1.txt首先。但是让我们假设您认为您需要这样做,并认为该选择是错误的。接下来,假设您没有通过将更改推送到某处来共享分支 b1。如果您发现您立即删除了该文件,则可以执行以下操作:
git checkout HEAD~1 -- file1.txt
git commit --amend

这就是说,“把 file1.txt 还给我,然后将该文件 merge 到最新的提交中。”这看起来就像您从未删除过文件一样。

如果你没有注意到文件被立即删除,并且你有几次提交,那么你可能想看看使用 git rebase解决问题。

如果您在自己的提交中删除了该文件,那么您可以使用 git rebase -i从分支的历史记录中删除提交。假设 B是删除文件的提交,这是该提交中唯一完成的事情。在 b1 上,您将运行以下内容:
git rebase -i B~1

删除包含违规提交( B )的行,保存并退出。您的分支刚刚在没有 B 的情况下重写了它的历史记录在里面。例如,我跑了 git rebase -i这显示在编辑器中:
pick 40f76a7 removed bar
pick 30a25f5 modified foo

然后我掉线了 40f76a7从列表中,然后给我留下:
pick 30a25f5 modified foo

merge 后的历史现在看起来像这样:
               M
(master) o -- o --- o ------o HEAD
\ /
(b1) o ------- o
A C'

注意提交 ID C'不同于 C因为 B不再存在,并且父 sha1 是提交 ID 的一部分。 IOW,C 的 sha1 发生了变化,因为我们重写了历史。

如果您删除了 file1.txt并在同一次提交中进行了许多其他更改,然后还有一些步骤。首先,带回文件并提交:
git checkout B~1 -- file1.txt
git commit -m "Reinstate file1.txt"

让我们调用新的提交 D .我们的修订图现在看起来像
               M
(master) o -- o --- o -----------o HEAD
\
(b1) o -- o -- o -- o
A B C D

现在,做:
git rebase -i B~1

并移动包含提交 ID D 的行到提交 ID B 之后,并更改 picksquash .例如,我在运行 git rebase -i B~1 时得到这个:
pick 40f76a7 removed bar plus other changes
pick 30a25f5 modified foo
pick 6177cb7 add bar
6177cb7是恢复 bar 的提交。所以我把它移到下面 40f76a7并将命令更改为 squash :
pick 40f76a7 removed bar plus other changes
squash 6177cb7 fix bar
pick 30a25f5 modified foo

保存并退出。它会要求您修复提交消息。去做。当你全部完成后,你最终会得到一个看起来像这样的历史:
               M
(master) o -- o --- o -----------o HEAD
\
(b1) o -- o -- o
A B' C'

新款 B'不再删除 file1.txt .此时,您已准备好与 master merge 。

几句结束语。小心 git rebase .如果您不小心,您可能会丢失历史记录。请务必阅读 git rebase手册页。那里有很多有用的信息。注意:所有这些都适用于 git rebase仅当您想删除从历史记录中删除文件的事实时才需要。如果您同意提交显示您将文件带回,那么无论如何,请使用 git checkout恢复文件,并提交它。对于新的 git 用户来说,它要少得多,而且更容易。 git rebase相当先进,需要一些练习。但是,如果您投入时间并好好学习,它确实非常有用。

关于git - 将已删除文件的分支 merge 回 master,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12598608/

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