Git命令检出任何分支并覆盖本地更改

时间:2013-08-28 11:51:08

标签: git deployment git-checkout

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

  • 摆脱任何局部变化。
  • 必要时从原点获取给定分支
  • 签出给定的分支?

目前我坚持:

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

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

几点说明:

  • 它是应用程序的自制部署脚本的一部分(代码托管在GitHub上)。
  • 如果分支已经从原点获取,则应该没有区别(即,新分支的第一次部署理想情况下不需要任何额外的步骤)。
  • 该脚本位于可供多人访问的远程计算机上,因此不会存储凭据并且必须输入用户/密码(如果可能,只能输入一次)。
  • 我不关心任何局部变化;我总是想要一个给定分支的原始副本(部署脚本的另一部分产生本地更改)。
  • 我每次都无法克隆或导出新的存储库;这需要太多时间。

4 个答案:

答案 0 :(得分:63)

您可以按照与How do I force “git pull” to overwrite local files?

类似的解决方案
git fetch --all
git reset --hard origin/abranch
git checkout $branch 

这只涉及一次获取。

答案 1 :(得分:24)

几点:

  • 我相信git stash + git stash drop可以替换为git reset --hard
  • ...或者更短的时间,将-f添加到checkout命令:

    git checkout -f -b $branch
    

    这会丢弃任何本地更改,就像在结帐前使用git reset --hard一样。

至于主要问题: 您可以将相应的分支从遥控器合并到您的本地分支:git merge $branch origin/$branch,而不是拉入最后一步,我相信它不会触及遥控器。如果是这种情况,则无需使用密码,因此可以解决您最关心的问题。

答案 2 :(得分:7)

git resetgit clean在某些情况下可能会过度(并且浪费时间)。

如果您只是有一条消息,例如“以下未跟踪的文件将被覆盖......”并且您希望远程/ origin / upstream覆盖那些冲突的未跟踪文件,则git checkout -f <branch>是最佳选择。< / p>

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

答案 3 :(得分:2)

新的git-switch command(从GIT 2.23开始)还具有一个标志--discard-changes,该标志对您有帮助。之后可能需要git pull

警告:它仍然被认为是实验性的。