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

sze*_*ryf 49 git deployment git-checkout

是否有一个Git命令(或一小段命令)可以安全可靠地执行以下操作?

  • 摆脱任何局部变化.
  • 如有必要,从原点获取给定分支
  • 检查给定的分支?

目前我坚持:

git fetch -p
git stash
git stash drop
git checkout $branch
git pull
Run Code Online (Sandbox Code Playgroud)

但它困扰我,因为我要求密码两次(由fetchpull).通常我会对任何解决方案感到满意,只要密码只需要一次即可.

几个笔记:

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

Von*_*onC 67

您可以按照类似于" 如何强制"git pull"覆盖本地文件? "的解决方案:

git fetch --all
git reset --hard origin/abranch
git checkout $branch 
Run Code Online (Sandbox Code Playgroud)

这只涉及一次获取.


Mar*_*Łoś 28

几点:

  • 我相信git stash+ git stash drop可以替换为git reset --hard
  • ...或者,甚至更短,添加-fcheckout命令:

    git checkout -f -b $branch
    
    Run Code Online (Sandbox Code Playgroud)

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

至于主要问题:你可以将相应的分支从遥控器合并到你的本地分支中git merge $branch origin/$branch,而不是拉入最后一步:我认为它不会击中遥控器.如果是这种情况,它将消除对credensials的需求,因此,解决您最关心的问题.

  • -b 可能需要大写。`git checkout -f -B $branch` 重置本地分支(如果它已经存在)。 (3认同)
  • 只是 `git checkout -B $existing_branch_name` 对我有用,而 `git checkout -f -b $existing_branch_name` 没有 - 所以就像 @xer0x 所说,我认为答案是不正确的,因为大写的 `-B` 是要求? (2认同)

Aar*_*ull 8

git reset并且git clean在某些情况下可能会过度杀伤(并且浪费很多时间).

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

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