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

Git命令签出任何分支并覆盖本地更改,git,deployment,git-checkout,Git,Deployment,Git Checkout,是否有一个Git命令(或一个简短的命令序列)可以安全可靠地执行以下操作 清除任何本地更改 如有必要,从原点获取给定的分支 签出给定的分支 目前,我一直坚持: git fetch -p git stash git stash drop git checkout $branch git pull 但这让我很烦恼,因为我被要求两次输入密码(通过fetch和pull)一般来说,只要密码只需要一次,我会很乐意使用任何解决方案。 几点注意: 它是应用程序自制部署脚本的一部分(代码托管在GitHub上

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

  • 清除任何本地更改
  • 如有必要,从原点获取给定的分支
  • 签出给定的分支
目前,我一直坚持:

git fetch -p
git stash
git stash drop
git checkout $branch
git pull
但这让我很烦恼,因为我被要求两次输入密码(通过
fetch
pull
一般来说,只要密码只需要一次,我会很乐意使用任何解决方案。

几点注意:

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

  • 我相信
    git stash
    +
    git stash drop
    可以被
    git reset--hard
  • 。。。或者,更简短地说,将
    -f
    添加到
    签出
    命令:

    git checkout -f -b $branch
    
    这将丢弃任何本地更改,就像签出之前使用了
    git reset--hard

关于主要问题:
您可以将远程的相应分支合并到本地分支,而不是执行最后一步:
git merge$branch origin/$branch
,我相信它不会击中远程。如果是这样的话,它消除了对Credentials的需要,因此解决了您最大的问题。

您可以遵循类似于“”的解决方案:

那只需要一次抓取

使用Git 2.23+,
Git checkout
在这里被替换为(仍然是实验性的)

(如’s中所述)

即使索引或工作树与HEAD不同,也要继续操作。
索引树和工作树都被恢复以匹配切换目标


如果您不想切换分支,而只想从另一个分支恢复文件夹,那么另一个命令将替换旧的过时且令人困惑的
git checkout

我提出


git-reset
git-clean
在某些情况下可能会造成过度杀伤力(这是一种巨大的时间浪费)

如果您只是收到一条类似“以下未跟踪文件将被覆盖…”的消息,并且希望远程/源/上游覆盖那些冲突的未跟踪文件,那么
git checkout-f
是最好的选择

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

新的(从GIT 2.23开始)也有一个标志
--放弃更改
,这应该会对你有所帮助<代码>git pull
之后可能需要


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

1<代码>git重置--硬
2<代码>git签出$branch3
git pull origin$branch
FYI如果您使用ssh密钥,将永远不会提示您输入密码。@如果您使用的是GitLab,则不会提示您输入密码。@Slam。我使用的是此解决方案,但我在最后添加了额外的
git checkout$branch
,因为否则git返回的当前分支信息是错误的。@VonC,谢谢。这确实覆盖了带有分支的主文件夹。如果我使用它从另一个分支导入整个文件夹,并且希望它们的文件覆盖我的文件,该怎么办<代码>git签出???develope--src/main/@tuxErrante这样你就不想切换分支了?那样的话,是给你的。2021年,任何人都不应使用git checkout。它是古老的、过时的和令人困惑的
git restore-s experiment-SW--aFolder
:这将从分支
experiment
中恢复
aFolder
内容,包括工作树(W)和索引。@tuxErrante我编辑了答案,以便更清楚地区分(切换分支和恢复内容之间的区别)。可能需要大写-b
git checkout-f-B$branch
重置本地分支(如果它已经存在)。git checkout-B$existing\u branch\u name对我有效,而
git checkout-f-B$existing\u branch\u name
没有-就像@xer0x所说的那样,我认为答案是不正确的,因为资本
-B
是一项要求?很好。我过去曾推广过git switch()。我已经更新了2013年的答案,加入了新的命令。
git switch -f $branch
git switch -f $branch
git restore --source=anotherBranch --staged] [--worktree -- aFolder
# or, shorter:
git restore -s anotherBranch -SW -- aFolder