MaM*_*zav 13 git branch pull checkout file
我很惊讶我找不到任何相关信息...
简而言之,我的问题是是否有办法避免以下两个命令之间的中间文件更改,如果在以下两个命令之后文件内容与之前完全相同?
git checkout dev
git pull
Run Code Online (Sandbox Code Playgroud)
动机是(仅满足其中一个动机的解决方案也比没有好):
当我使用远程源代码控制服务器将 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
)
使用远程更改更新本地分支后,您可以切换到所需的分支,而不会导致文件更改
参考:
有一种方法可以做到这一点,使用git worktree add
. 确保您的 Git 至少为 2.5(以便具有git worktree
),最好至少为 2.15(修复了添加工作树时相当严重的错误;如果没有修复,添加的工作树通常不应使用超过大约两周) 。
您的 IDE 可能不兼容git worktree add
;我避免使用 IDE,因此无法说出哪些与它配合,哪些不与它配合。
假设您有一个支持添加工作树的 Git 版本,请用于git worktree add
创建dev
分支,并将主工作树保留在master
分支上。或者,为主(主或其他)分支使用添加的工作树,并为分支使用主工作树dev
。请记住,Git 强制每个工作树签出不同的分支。
停止使用git pull
. (这并不是绝对必要的,但我建议这样做。)
要从服务器更新存储库,请git fetch
随时从任一工作树使用 \xe2\x80\x94(不带任何附加参数\xe2\x80\x94)。这将获取他们拥有但您没有的任何新提交,并更新您的origin/*
远程跟踪名称。
要更新master
分支,请输入master
-branch 工作树,然后在命令行上运行git merge
或git merge origin/master
。(git fetch
如果您最近没有运行过,请先运行,以便获得最新的origin/master
.)
要更新dev
分支,请输入dev
-branch 工作树,然后在命令行上运行git merge
或git merge origin/dev
。和以前一样,如果您最近没有跑步git fetch
,您可能需要先跑步,以便了解origin/master
最新情况。
您的 IDE 可能能够也可能无法实现命令行的功能。根据 IDE,也许可以运行它的两个副本,每个工作树中一个。
\n\n请记住,所有git pull
操作都是运行git fetch
然后git merge
(或git fetch
然后git rebase
)。它git checkout
会扰乱你工作树文件上的时间戳。Git 并不真正使用或需要工作树:那是为你准备的。运行会将git checkout
工作树中的文件替换为其他提交中的文件,同时也会替换索引中的文件;索引副本是 Git 使用和关心的副本。
Git 会替换工作树文件,因为它假定您需要要切换到的分支中的文件。当然,切换回来会再次更新这些工作树文件。所以现在各种文件已经更新了两次,需要重建。
\n\n当您添加新的工作树时,Git 实际上添加了一组三个项目:
\n\nHEAD
,以记住新工作树中当前的提交和/或分支;该工作树只是主存储库工作树之外的一个目录(或文件夹)。例如,如果您的主存储库位于~/work/project
您可以将其移动~/work/project/main
并创建~/work/project/dev
以保存dev
-branch 工作树。
但从根本上来说,问题很简单:当您使用 时git checkout
,git会根据需要替换索引和工作树内容。所以你需要停止使用git checkout
。如果您需要两个工作树,请创建两个单独的工作树。
如果您的 Git 太旧而无法支持工作树,请创建两个克隆。当然,除了两个克隆不共享分支之外,其他一切都一样。
\n