首页 > 解决方案 > 如何在不合并的情况下删除功能分支后保留对公共文件的修改?

问题描述

假设我有一个功能分支,.gitignore除了对分支的核心修改之外,我还对公共文件进行了更改。假设我决定在提交后删除功能分支,但放弃与主分支合并。.gitignore删除功能分支时,如何保留对文件所做的更改而不会丢失它们?

编辑:如果我想保留对多个公共文件的更改怎么办?

标签: gitgit-branch

解决方案


正如Tim Biegeleisen 在评论中指出的那样,您不必Git 中执行此操作。对于像这样的单个文件,完全绕过 Git 将更新的文件放在周围可能同样容易,甚至更容易:

cp .gitignore /tmp/save    # the .gitignore update was good, but
git checkout master
git branch -D feature      # the feature idea turned out to be bad
mv /tmp/save .gitignore
git add .gitignore
git commit

(然后写一个好的提交信息)。

正如Jasen 在另一条评论中指出的那样,如果您自己提交了此.gitignore更新,您可以轻松地从功能分支中挑选提交。您可以在删除功能分支之前或之后执行此操作,但如果您删除功能分支之前执行此操作,则会更容易找到提交。例如:

git checkout master
git cherry-pick feature~3   # the good idea was 3 commits back
git branch -D feature

如果提交消息可以使用一些调整,请添加--edit到您的git cherry-pick命令中。

最后——如果有多个文件要更新,这会更有用,因为那时/tmp/save方法不够用——你可以使用git restore(仅在 Git 2.23 或更高版本中找到)从其他提交中以提交的形式复制特定文件。因此,如果功能分支中的最终提交对.gitignore文件有很好的改进,但您不想要它的任何其他内容:

git checkout master
git restore --source=feature --staged --worktree -- .gitignore
git branch -D feature
git commit

这里--staged --worktree导致新的和改进的文件已经被暂存以提交,因此不需要单独git add的。

如果你没有git restore,git checkout有一个与上面完全相同的模式:

git checkout master
git checkout feature -- .gitignore
git branch -D feature
git commit

该命令的效果与. 请注意,这种形式的,带有部分,意味着继续并在不询问的情况下销毁任何未保存的工作(通常是这样)。git checkout specifier -- pathsgit restore --source=specifier --staged --worktree -- pathsgit checkout-- pathsgit restore

如果您已经删除了功能分支怎么办?

要回答标题问题,只要您能找到正确的提交哈希 ID ,上述所有 Git 方法仍然有效。此哈希 ID 将在 的 reflog 中找到。在 reflog 中找到分支名称(在本例中为 )会更容易,但不幸的是,当分支名称被删除时,该 reflog 也会被删除。HEADfeature

因此,运行git reflog(默认显示HEADreflog)并找到合适的提交哈希 ID。例如,然后使用鼠标将哈希 ID 剪切并粘贴为--sourcefor git restore


推荐阅读