有没有一种方法可以从工作树中“取消签出”分支

时间:2019-08-13 09:20:09

标签: git

如何让git忘记工作树曾经包含一个分支,例如集成分支。

我有一个基于集成分支的工作树,并且在该分支上进行了git squash合并,这意味着实际上已重置为集成分支。但是,我删除了目录(见下文)。但是,每当我基于集成分支使一个新的工作树说出其他东西并尝试进行壁球合并时,它都会使我重新创建某些东西的工作树目录并在那里进行集成。

我希望它结帐到当前工作树(其他材料)的集成分支并在此处进行压扁,并且在执行推送之后,让我忘记了这个工作树(其他材料,某种材料)存在并且曾经包含分支集成分支。

它甚至不让我为“集成分支”创建一个新的工作树,声称即使已用rm -rf some-stuff删除了某种东西的工作树,该工作树也已签出到“某种东西”

如何让git忘记某些东西曾经存在?在某个地方,它顽强地保持在该工作树上。

我首先尝试了git worktree rm some-stuff。 后来我在某种工作树中尝试了git checkout dummygit branch dummy。 我还删除了(rm -rf some-stuff)。

4 个答案:

答案 0 :(得分:1)

因此,如果您合并了集成分支,则那里仍然有本地分支,也可能还有远程分支。要摆脱它们,您必须删除它们。

git branch -D integration                # Delete local branch
git push origin --delete integration     # Delete remote branch

没有该分支不会退出,您可以根据当前工作树使用git checkout -b integration重新创建它。

如果您想直接重用您的集成分支并且已经将其合并到master中,则另一个选择是

git checkout integration               # No you are back at you unmerged changes
git reset --hard origin/master         # Now your integration branch has you latest changes on master, so also the merege
git push origin --force integration    # Update the remote integration branch to the new changes

答案 1 :(得分:1)

回顾一下,您从开始:

git worktree add ../integration-branch

(或类似方法)在标准工作树区域之外的某个地方创建 second 工作树。第二个工作树存在,并且分支integration-branch已签出。

从那时起,如果您完全删除了第二个工作树,只需运行:

git worktree prune
在主工作树中

通知Git 该附加工作树已不存在,并将其从其他工作树及其检出分支的列表中删除。请注意,这将检查 all 添加的工作树是否仍然存在:如果您添加了五个工作树,它们全部位于它们自己的分支上,因此当前认为六个分支已签出,并且随后删除了其中两个,prune将为您提供四个已签出的分支。

如果您还没有删除其他工作树,则可以将其移至其中并将其HEAD更改为其他分支,甚至完全不分支:

(cd ../integration-branch; git checkout --detach integration-branch)

例如。 (此处的括号用于bash或任何其他类似POSIX的shell,以使带括号的子命令在子shell中运行,以便您的主shell保留在主工作区的当前顶层目录中,树。)

答案 2 :(得分:0)

您认为针对不需要的目录过滤分支是您的一种选择吗? Remove folder and its contents from git/GitHub's history

我承认我不确定我是否明白你的意思。我的理解是,即使过去已经添加/删除了该文件夹,您也不希望git跟踪该文件夹。 然后,如果您认为可以选择的话,也可以将其添加到.gitignore

答案 3 :(得分:0)

我在.git根目录下找到了一个worktrees子目录,并在该子目录中找到了一些东西和其他东西。删除这些导致git忘记那些正在工作的树。显然,它们没有被“ git worktree rm”命令删除。

我必须承认,.git目录中的删除内容不是我喜欢做的,但是我的一位同事建议去那里查看。