78

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

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

目前我被困在:

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

但这让我很困扰,因为我被要求输入密码两次(由fetchpull)。一般来说,只要密码只需要一次,我就会对任何解决方案感到满意。

几点注意事项:

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

4 回答 4

114

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

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

那将只涉及一次提取。

对于 Git 2.23+,git checkout此处替换为git switch(presented here)(仍处于试验阶段)。

git switch -f $branch

-f作为 的别名--discard-changes,如Jan回答中所述)

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


如果您不想切换分支,而只想从另一个分支恢复git restore一个文件夹,那么另一个命令就是替换旧的过时且令人困惑的git checkout.
我在git restore这里介绍。

git restore --source=anotherBranch --staged] [--worktree -- aFolder
# or, shorter:
git restore -s anotherBranch -SW -- aFolder
于 2013-08-28T12:24:41.087 回答
36

Couple of points:

  • I believe git stash + git stash drop could be replaced with git reset --hard
  • ... or, even shorter, add -f to checkout command:

    git checkout -f -b $branch
    

    That will discard any local changes, just as if git reset --hard was used prior to checkout.

As for the main question: instead of pulling in the last step, you could just merge the appropriate branch from the remote into your local branch: git merge $branch origin/$branch, I believe it does not hit the remote. If that is the case, it removes the need for credensials and hence, addresses your biggest concern.

于 2013-08-28T12:20:47.337 回答
13

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

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

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

于 2015-08-20T10:38:17.187 回答
3

git-switch命令(从 GIT 2.23 开始)还有一个--discard-changes可以帮助您的标志。git pull之后可能需要。

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

于 2020-01-28T14:37:01.883 回答