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项目文件…)
- 避免隐藏未真正更改的文件
我希望以前执行
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
)
使用远程更改更新本地分支后,您可以切换到所需的分支,而不会导致文件更改
参考资料:
git fetch origin master:master