Xcode 如何在本地删除文件并提交更改后合并存储?

Xcode 如何在本地删除文件并提交更改后合并存储?,xcode,git,Xcode,Git,目前在与另一个开发人员合作并使用Git作为我们的源代码控制时,“UserInterfaceState.xUserState”存在问题。我很早就意识到.gitignore并没有忽略那个文件,我决定用“git rm-cached”删除/取消跟踪它。在执行该命令之前,我将当前更改保存到: 保留我当前的更改 创建反映UserInterfaceState.xUserState删除的快速提交 我创建了提交,反映了对“UserInterfaceState.xcuserstate”的删除,并继续执行“git s

目前在与另一个开发人员合作并使用Git作为我们的源代码控制时,“UserInterfaceState.xUserState”存在问题。我很早就意识到.gitignore并没有忽略那个文件,我决定用“git rm-cached”删除/取消跟踪它。在执行该命令之前,我将当前更改保存到:

保留我当前的更改 创建反映UserInterfaceState.xUserState删除的快速提交 我创建了提交,反映了对“UserInterfaceState.xcuserstate”的删除,并继续执行“git stash apply”。这就是我收到的错误:

needs merge
unable to refresh index
我知道这个隐藏仍然有UserInterfaceState.xUserState,但我的印象是Git会将主分支的新提交状态与该隐藏合并,并迫使我解决合并冲突


我如何才能合并该存储以将我以前的工作恢复到新提交的主分支,该分支不再具有或跟踪UserInterfaceState.xUserState?

每当有不适用的存储时,我建议将该存储转为分支

要做到这一点,首先要确保没有未提交的工作。这意味着你现在应该做任何你正在做的事情,或者把它藏起来。后者有点讽刺和怪异,但效果很好,只要你记得你正在转换的藏起来已经重新编号。现在一切都已清理干净,根据ID stash{1}或stash{6}或任何必要的内容选择麻烦的隐藏,如果它是当前或唯一的隐藏,则选择默认值,并使用该ID或默认值作为git stash branch命令的参数:

您现在处于可以运行git status的状态,然后可能是git commit,或者git add和git commit,等等。您的stash@{3}stash已重新加载到索引中,就像您已经运行git stash apply-index一样,并通过相同的命令加载到您的工作树中。一旦您进行了提交,您的新分支就可以随意使用了

事实上,Git确实运行了这个命令:首先,Git运行了相应提交的Git签出。然后Git在存储上运行Git stash apply-index,恢复保存的索引和保存的工作树。然后,Git在应用成功后,在保存的存储上运行Git stash drop

在本例中,在git stash branch name stash之后,您可能需要一个git add和git commit,这将保存您的所有工作,包括未删除、可能已修改或可能未修改的UserInterfaceState.xcuserstate文件。但是现在你可以git签出你正在处理的分支,如果你做了一个临时的分支,那么你可以应用和删除它,git cherry pick-n可以提交你从麻烦的分支中创建的新分支。如果提交没有对讨厌的文件进行任何更改,并且讨厌的文件在这里不存在,那么cherry pick很可能会进行得非常顺利,您将一切就绪

讨论 一旦您意识到git隐藏对象只是一堆提交,这一切就有了一定的意义;b提交始终记录其父级提交;分支只是由一个分支名称指定的一系列提交,该名称标识将被视为分支一部分的最后一次提交

如果git隐藏提交的方式是正常的,那么您应该:

...--o--o--*--o   <-- your-branch
            \
             i--w   <-- stash
也就是说,保存的工作树状态似乎是合并提交,保存合并索引提交i和运行git stash commit*时执行的提交的结果。它不是一个真正的合并,因为它不是运行git merge所能得到的:隐藏代码只是滥用了合并提交格式,以使以后的隐藏代码更容易

幸运的是,git stash分支知道如何消除格式滥用。它:

签出提交*; 创建一个新的分支名称以记住您现在所在的位置;和 应用存储,使其索引和工作树组件保持分离,就像保存存储时一样,以防达到预期效果。 现在你有了:

             o   <-- your-branch
            /
...--o--o--*   <-- new-branch
其中,W是您所拥有的工作树状态的常规普通提交,可以使用-n或任意方式将其提交给git cherry pick


最终,您可以简单地删除分支—您可能想用其他名称调用的新分支,然后提交—W将被放弃,最终将完全消失。

每当您有一个不适用的隐藏,我建议将该隐藏转换为一个分支

要做到这一点,首先要确保没有未提交的工作。这意味着你现在应该做任何你正在做的事情,或者把它藏起来。后者有点讽刺和怪异,但效果很好,只要你记得你正在转换的藏起来已经重新编号。现在一切都已清理干净,根据ID stash{1}或stash{6}或任何必要的内容选择麻烦的隐藏,如果它是当前或唯一的隐藏,则选择默认值,并使用该ID或默认值作为git stash branch命令的参数:< /p> 您现在处于可以运行git status的状态,然后可能是git commit,或者git add和git commit,等等。您的stash@{3}stash已重新加载到索引中,就像您已经运行git stash apply-index一样,并通过相同的命令加载到您的工作树中。一旦您进行了提交,您的新分支就可以随意使用了

事实上,Git确实运行了这个命令:首先,Git运行了相应提交的Git签出。然后Git在存储上运行Git stash apply-index,恢复保存的索引和保存的工作树。然后,Git在应用成功后,在保存的存储上运行Git stash drop

在本例中,在git stash branch name stash之后,您可能需要一个git add和git commit,这将保存您的所有工作,包括未删除、可能已修改或可能未修改的UserInterfaceState.xcuserstate文件。但是现在你可以git签出你正在处理的分支,如果你做了一个临时的分支,那么你可以应用和删除它,git cherry pick-n可以提交你从麻烦的分支中创建的新分支。如果提交没有对讨厌的文件进行任何更改,并且讨厌的文件在这里不存在,那么cherry pick很可能会进行得非常顺利,您将一切就绪

讨论 一旦您意识到git隐藏对象只是一堆提交,这一切就有了一定的意义;b提交始终记录其父级提交;分支只是由一个分支名称指定的一系列提交,该名称标识将被视为分支一部分的最后一次提交

如果git隐藏提交的方式是正常的,那么您应该:

...--o--o--*--o   <-- your-branch
            \
             i--w   <-- stash
也就是说,保存的工作树状态似乎是合并提交,保存合并索引提交i和运行git stash commit*时执行的提交的结果。它不是一个真正的合并,因为它不是运行git merge所能得到的:隐藏代码只是滥用了合并提交格式,以使以后的隐藏代码更容易

幸运的是,git stash分支知道如何消除格式滥用。它:

签出提交*; 创建一个新的分支名称以记住您现在所在的位置;和 应用存储,使其索引和工作树组件保持分离,就像保存存储时一样,以防达到预期效果。 现在你有了:

             o   <-- your-branch
            /
...--o--o--*   <-- new-branch
其中,W是您所拥有的工作树状态的常规普通提交,可以使用-n或任意方式将其提交给git cherry pick

最后,您可以简单地删除分支—您可能想用其他名称调用的新分支,并提交W—将被放弃,最终将完全消失。

旁注:没有/没有跟踪UserInterfaceState.xUserState的分支。这是因为有一个提交没有UserInterfaceState.xUserState。签出提交意味着UserInterfaceState.xcuserstate不在索引中,这意味着不跟踪它。签出其他具有文件UserInterfaceState.xcuserstate的提交意味着UserInterfaceState.xcuserstate返回到索引中,这使得它被跟踪。换句话说,索引中文件的存在或不存在使其被跟踪/未跟踪。旁注:没有/未跟踪UserInterfaceState.xUserState的不是分支。这是因为有一个提交没有UserInterfaceState.xUserState。签出提交意味着UserInterfaceState.xcuserstate不在索引中,这意味着不跟踪它。签出其他具有文件UserInterfaceState.xcuserstate的提交意味着UserInterfaceState.xcuserstate返回到索引中,这使得它被跟踪。换句话说,索引中文件的存在或不存在使其被跟踪/未跟踪。
             o   <-- your-branch
            /
...--o--o--*--W   <-- new-branch