Git命令签出任何分支并覆盖本地更改
是否有一个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 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签出$branch3git 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我编辑了答案,以便更清楚地区分(切换分支和恢复内容之间的区别)。可能需要大写-bgit 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