部署-Git命令签出任何分支并覆盖本地更改

是否有Git命令(或简短的命令序列)可以安全可靠地执行以下操作?

  • 摆脱任何本地更改。
  • 必要时从原点获取给定分支
  • 结帐给定的分支?

目前,我坚持:

git fetch -p
git stash
git stash drop
git checkout $branch
git pull

但这让我感到困扰,因为我两次被要求输入密码(分别是fetchpull)。 通常,只要密码只需一次,我对任何解决方案都会感到满意。

一些注意事项:

  • 它是应用程序的自制部署脚本的一部分(代码托管在GitHub上)。
  • 分支是否已经从源中获取应该没有什么区别(即,理想情况下,第一次部署新分支应该不需要任何其他步骤)。
  • 该脚本位于可以由多个人访问的远程计算机上,因此不会存储任何凭据,并且必须输入用户名/密码(如果可能,只能输入一次)。
  • 我不在乎任何本地更改; 我一直想要给定分支的原始副本(部署脚本的另一部分产生本地更改)。
  • 我不能每次都克隆或导出一个新的存储库; 需要太多时间。
szeryf asked 2020-02-12T15:03:48Z
3个解决方案
67 votes

您可以采用类似于“如何强制“ git pull”覆盖本地文件?”的解决方案:

git fetch --all
git reset --hard origin/abranch
git checkout $branch 

那将只涉及一次获取。

VonC answered 2020-02-12T15:04:11Z
28 votes

要点:

  • 我相信git merge $branch origin/$branch + checkout可以替换为git reset --hard
  • ...或者甚至更短一些,将git merge $branch origin/$branch添加到checkout命令:

    git merge $branch origin/$branch

    这将丢弃所有本地更改,就像在结帐之前使用git merge $branch origin/$branch一样。

至于主要问题:您可以仅将适当的分支从远程合并到本地分支中,而不用进行最后一步:git merge $branch origin/$branch,我相信它不会影响到远程。 如果是这样,它将消除对证书的需求,从而解决了您最大的担忧。

Marcin Łoś answered 2020-02-12T15:04:58Z
7 votes

--hard resetgit clean在某些情况下可能会过大(并且浪费大量时间)。

如果您仅收到诸如“以下未跟踪的文件将被覆盖...”之类的消息,并且您希望远程/源/上游覆盖那些冲突的未跟踪的文件,则--hard reset是最佳选择。

如果您像我一样,另一个选择是清理并执行--hard reset,然后重新编译您的项目。

Aaron Hull answered 2020-02-12T15:05:27Z
translate from https://stackoverflow.com:/questions/18487089/git-command-to-checkout-any-branch-and-overwrite-local-changes