如何配置 Git 以在分支更改时自动从原点拉取?

kjh*_*jhf 7 git branch git-pull

当我切换分支时,如果本地是干净的并且在其原始对应物之后,我想总是从源中提取最新的更改。本地分支是其远程分支的跟踪分支,fetch 按预期工作。

  • 可以将 Git 配置为自动执行此操作吗?

  • 是否有一个存储库范围的设置来为所有分支执行此操作?(我们的分支经常被创建和删除,因为公司政策是每个任务一个分支,在审查时被 PR 和合并)


编辑:

对于上下文,我使用 Visual Studio 2017 及其用户界面来执行 Git 命令。让 Git 保持最新没有问题。我需要使用命令行执行一些 Git 命令,例如重命名分支或隐藏 repo 设置。

当我说“本地是干净的”时,是的,它指的是来自git status和 VS的工作树,其中没有传出提交或本地修改的文件。VS 有一个非常漂亮的 UI,可以实时显示这些信息。

经过

(我们的分支经常被创建和删除,因为公司政策是每个任务一个分支,在审查时被 PR 和合并)

这应该是一种说“我真的不想为每个分支设置此设置或连接”的即兴方式,但解释是:

我们创建自己的本地分支,从主分支中分离出来来完成一项任务。在 VS 中,这是“从...创建本地分支”,它使用所需的名称执行分支的检出。在幕后,我确定这相当于git checkout -b fillcatnip master. fillcatnip是一个未跟踪的本地分支,直到推送到远程,但它将作为新分支推送fillcatnip而不是原始master. 在这一点上,它成为一个跟踪分支,并且可以master在任务完成时给出一个拉取请求 (PR) 以合并回。但是如果master在 PR 可以实现之前已经移动并发生冲突,那么在冲突解决之前无法合并分支。发生这种情况时,我可能已经开始了另一项任务。因此,如果我保存当前正在执行的任务(提交和推送、存储等),然后切换回冲突的分支,我想要该分支的远程副本而不是我自己的本地副本,因为有人可能已经推送在等待合并时对其进行更改。

tor*_*rek 1

这两个问题的答案都是“不完全是”和“不需要”,而且也是“一般不需要”,而事实上,这个问题本身并没有多大意义。第一个也是最大的问题在于“if local is clean”\xe2\x80\x94这句话,到底是什么意思?

\n\n

如果“干净”指的是git status报告的内容:

\n\n
On branch master\nYour branch is up-to-date with \'origin/master\'.\n\nnothing to commit, working tree clean\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么“clean”指的是工作树,有时可能指的是索引,与彼此和/或HEAD提交进行比较。

\n\n

除非您用于git worktree add创建辅助工作树,否则任何给定的 Git 存储库都只有一棵工作树(以及一个相应的索引)。(如果您确实使用git worktree add,则每个添加的工作树都位于其自己单独的分支上。这实际上可能是您真正在寻找的答案。)

\n\n

这里我们还要注意,分支名称masterfeature表示一个特定的提交,Git 将其称为该分支的尖端提交。“分支”一词还有其他含义:请参阅“分支”到底是什么意思? 但是,当您签出一个分支时,这意味着您也签出了一个特定的提交。该提交的内容填充索引和工作树。

\n\n

将分支 \xe2\x80\x94 或 切换到“分离的 HEAD”\xe2\x80\x94 的命令是git checkout。它通过将实现从之前签出的提交切换到将要签出的提交所需的任何内容写入索引和工作树来完成分支切换(或 HEAD 分离)现在。如果工作树在 之前git checkout干净的,那么这总是可能的,并且工作树在之后git checkout也将是干净的。

\n\n

如果工作树在 之前git checkout干净,有时但并非总是可以切换分支:请参阅当当前分支上有未提交的更改时签出另一个分支。在这种情况下,切换分支工作树通常也将是不干净的git checkout。不干净的原因是,在切换分支时,签出不需要更新与运行之前签出的提交不匹配的文件的索引和工作树条目。git checkout branchname

\n\n

检查工作树是否干净

\n\n

完成以上内容后,请注意git-sh-setup,可用于其他 Git 脚本的脚本包含一个名为 的函数require_clean_work_tree。您可以检查此代码,或者只是使用它来确定工作树是否干净。

\n\n

您可以将其与phd 关于使用结帐后挂钩进行检查的答案结合起来,并在适当的情况下运行git mergegit fetch && git merge。(我建议完全避免git pull:像这样把它分成两个单独的步骤。之后你的生活会更幸福。)

\n\n

为什么我怀疑你根本不需要这个

\n\n
\n

(我们的分支经常被创建和删除,因为公司政策是每个任务一个分支,在审查时进行 PR 和合并)

\n
\n\n

作为一般规则,如果您不打算在命名分支上工作(在其上进行新的提交),那么您不应该首先创建它。由于尚未创建它,您也无需担心更新它。

\n\n

例如,假设您有一个名为 的远程存储库origin,并且在 上origin有用于各种任务的分支。您想偶尔检查一下 origin/task/feedkittens,但只处理(单一)任务task/fillcatnip

\n\n

在这种情况下,要检查事物,请继续使用“分离头”模式:

\n\n
git checkout origin/task/feedkittens\n
Run Code Online (Sandbox Code Playgroud)\n\n

处理事物,请使用git checkout创建 task/fillcatnip origin/task/fillcatnip

\n\n
git checkout task/fillcatnip\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是有效的git checkout,因为如果您要求它检查不存在的分支,则会搜索origin/具有相同名称的分支。如果是这样,它将创建本地分支,以便分支提示提交与远程跟踪名称的提交相同。同时,它将设置本地分支来跟踪(作为其上游)远程跟踪名称。

\n\n

通过创建本地分支名称,您现在可以创建新的提交。这些将使当地分支机构

\n\n

通过避免创建task/feedkittens,您可以直接运行git fetchgit checkout origin/task/feedkittens查看最新的。您将处于“分离的 HEAD”模式,因此现在创建提交通常是一个坏主意,但这意味着无需在本地分支周围拖动。

\n\n

当名为 的分支task/feedkittens在 上被删除时,您可以通过设置origin自动删除您自己的远程跟踪名称:git fetch

\n\n
git config fetch.prune true\n
Run Code Online (Sandbox Code Playgroud)\n\n

一旦您有了git checkout其他提交或名称,您就不再在origin/task/feedkittens不再有名称的提交上分离 HEAD。

\n\n

如果您想同时处理(如“添加提交”)多个不同的分支,请考虑使用git worktree add,只要您的 Git 版本至少为 2.5。每个添加的工作树都有自己的私有索引,但所有添加的工作树共享单个底层存储库。如果您的 Git 太旧,请考虑为您想要同时处理的每个分支制作单独的克隆。

\n