git checkout&;git pull:执行时避免中间文件更改

git checkout&;git pull:执行时避免中间文件更改,git,file,branch,checkout,pull,Git,File,Branch,Checkout,Pull,我很惊讶我找不到关于这个的任何东西 简言之,我的问题是,是否有办法避免在以下两个命令之间更改中间文件,如果在以下两个命令之后,文件内容与之前完全相同 git checkout dev git pull 动机是(只满足其中一个动机的解决方案也比没有好): 如果不需要,我希望避免IDE重新加载文件(是的,VS项目文件…) 避免隐藏未真正更改的文件 这是一个非常常见的场景,当我使用远程源代码管理服务器将origin/feature合并到origin/dev之后,从功能分支返回到master 我希

我很惊讶我找不到关于这个的任何东西

简言之,我的问题是,是否有办法避免在以下两个命令之间更改中间文件,如果在以下两个命令之后,文件内容与之前完全相同

git checkout dev
git pull
动机是(只满足其中一个动机的解决方案也比没有好):

  • 如果不需要,我希望避免IDE重新加载文件(是的,VS项目文件…)
  • 避免隐藏未真正更改的文件
这是一个非常常见的场景,当我使用远程源代码管理服务器将origin/feature合并到origin/dev之后,从功能分支返回到master


我希望以前执行
git-fetch-origin-dev
可以解决这个问题,但事实并非如此。我还找到了一些答案,比如说为了方便起见将命令分组在一起,但没有针对文件更改问题。

有一种方法可以做到这一点,使用
git worktree add
。确保您的Git至少为2.5(因此它具有
Git worktree
),最好至少为2.15(通过添加worktree修复了一个相当严重的错误;如果没有修复,添加的worktree一般不应使用超过两周)

您的IDE可能与git worktree add不兼容;我回避IDE,因此无法说明哪些IDE与它合作,哪些不合作

假设您的Git版本支持添加的工作树,请使用
Git worktree add
创建
dev
分支,并将主工作树保留在
master
分支上。或者,将添加的工作树用于主(主)分支,将主工作树用于
dev
分支。记住,Git强制每个工作树签出一个不同的分支

停止使用git pull。(这并不是绝对必要的,但我建议这样做。)

要从服务器更新您的存储库,请使用
git fetch
——在任何时候都不要从任一工作树中添加任何附加参数。这将获取您没有的任何新提交,并更新您的
origin/*
远程跟踪名称

要更新
master
分支,请输入
master
-分支工作树,并在命令行上运行
git merge
git merge origin/master
。(如果您最近没有这样做,请先运行
git fetch
,以便获得最新的
origin/master

要更新
dev
分支,请输入
dev
-分支工作树,并在命令行上运行
git merge
git merge origin/dev
。如前所述,如果您最近没有运行过
git fetch
,您可能希望先运行它,以便您的
origin/master
是最新的

在这里,您的IDE可能无法实现命令行的功能。根据IDE的不同,可能需要运行它的两个副本,每个工作树中一个副本

记住,git pull所做的一切都是运行
git fetch
,然后
git merge
(或者
git fetch
然后
git rebase
)。是
git checkout
弄乱了工作树文件上的时间戳。Git并不真正使用或需要工作树:这是给你的。运行
git checkout
将工作树中的文件替换为其他提交中的文件,同时也替换索引中的文件;索引副本是Git使用和关心的副本

Git替换工作树文件,因为它假定您需要切换到的分支中的文件。当然,向后切换会再次更新这些工作树文件。所以现在各种文件已经更新了两次,需要重建


当您添加一个新的工作树时,Git实际上添加了一组三项:

  • 新工作树的新
    ,以记住新工作树中当前的提交和/或分支
  • 新工作树的索引,Git使用该索引存储Git的文件,以备下次提交时使用;及
  • 新的工作树本身,供您查看和使用文件
此工作树只是位于主存储库工作树之外的目录(或文件夹)。例如,如果主存储库位于
~/work/project
中,则可以将其移动到
~/work/project/main
并创建
~/work/project/dev
以保存
dev
分支工作树

但从根本上讲,问题很简单:当您使用
git checkout
时,git会根据需要替换索引和工作树内容。因此,您需要停止使用
git checkout
。如果您需要两个工作树,请创建两个单独的工作树



如果您的Git太旧,无法支持工作树,请创建两个克隆。当然,除了两个克隆不共享分支之外,其他所有功能都是一样的。

我遇到了相同的情况,在寻找一个更简单的替代方案后,我刚刚找到了我需要的:

在不切换的情况下拉动另一个分支:

如果分支B会导致非快进合并,则在未先签出a的情况下无法将分支B合并到分支a。这是因为需要工作副本来解决任何潜在冲突

此命令仅适用于快进合并。

(用要更新的分支替换
master
。在OP的场景中,它将是
git-fetch-origin-dev:dev

使用远程更改更新本地分支后,您可以切换到所需的分支,而不会导致文件更改

参考资料:


谢谢,稍后我会尝试了解细节。为了清楚起见,您认为IDE可能是兼容的,也可能不是兼容的,这是什么意思
git fetch origin master:master