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

MaM*_*zav 13 git branch pull checkout file

我很惊讶我找不到任何相关信息...

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

git checkout dev
git pull
Run Code Online (Sandbox Code Playgroud)

动机是(仅满足其中一个动机的解决方案也比没有好):

  • 我想避免我的 IDE 在不需要时重新加载文件(是的,VS 项目文件...)。
  • 避免隐藏未真正更改的文件。

当我使用远程源代码控制服务器将 origin/feature 合并到 origin/dev 后从功能分支返回到 master 时,这是一种非常常见的情况。

我希望git fetch origin dev之前的表演能够解决这个问题,但事实并非如此。我还发现了一些像这样的答案,其中讨论了将命令分组在一起以方便起见,但没有针对文件更改问题。

Pau*_*cés 10

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

拉取另一个分支而不切换:

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

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

git fetch origin master:master
Run Code Online (Sandbox Code Playgroud)

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

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

参考:


tor*_*rek 1

有一种方法可以做到这一点,使用git worktree add. 确保您的 Git 至少为 2.5(以便具有git worktree),最好至少为 2.15(修复了添加工作树时相当严重的错误;如果没有修复,添加的工作树通常不应使用超过大约两周) 。

\n\n

您的 IDE 可能不兼容git worktree add;我避免使用 IDE,因此无法说出哪些与它配合,哪些不与它配合。

\n\n

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

\n\n

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

\n\n

要从服务器更新存储库,请git fetch随时从任一工作树使用 \xe2\x80\x94(不带任何附加参数\xe2\x80\x94)。这将获取他们拥有但您没有的任何新提交,并更新您的origin/*远程跟踪名称。

\n\n

要更新master分支,请输入master-branch 工作树,然后在命令行上运行git mergegit merge origin/master。(git fetch如果您最近没有运行过,请先运行,以便获得最新的origin/master.)

\n\n

要更新dev分支,请输入dev-branch 工作树,然后在命令行上运行git mergegit merge origin/dev。和以前一样,如果您最近没有跑步git fetch,您可能需要先跑步,以便了解origin/master最新情况。

\n\n

您的 IDE 可能能够也可能无法实现命令行的功能。根据 IDE,也许可以运行它的两个副本,每个工作树中一个。

\n\n

请记住,所有git pull操作都是运行git fetch然后git merge(或git fetch然后git rebase)。它git checkout会扰乱你工作树文件上的时间戳。Git 并不真正使用或需要工作树:那是为准备的。运行会将git checkout工作树中的文件替换为其他提交中的文件,同时也会替换索引中的文件;索引副本是 Git 使用和关心的副本。

\n\n

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

\n\n
\n\n

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

\n\n
    \n
  • 一个新的HEAD,以记住新工作树中当前的提交和/或分支;
  • \n
  • 新工作树的索引,Git 使用它来存储您可能进行的下一次提交的 Git 文件;和
  • \n
  • 新的工作树本身,供您查看和使用文件。
  • \n
\n\n

该工作树只是主存储库工作树之外的一个目录(或文件夹)。例如,如果您的主存储库位于~/work/project您可以将其移动~/work/project/main并创建~/work/project/dev以保存dev-branch 工作树。

\n\n

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

\n\n
\n\n

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

\n