任意git工作副本如何与远程分支完全一致

4
假设我有一个任意的本地 Git 工作目录,它是从某个远程仓库克隆而来的。我想让本地 Git 仓库与远程仓库完全相同,而不考虑自从克隆以来本地目录发生了什么变化。我不想再进行一次完整的克隆。
假设本地工作目录包含以下内容:
- 额外的未跟踪文件 - 删除的文件 - 暂存的更改 - 可能位于任意分支上 - 自从从远程克隆以来已有一堆提交
现在,我想让这个本地仓库完全反映远程仓库。这是我的当前解决方案,但我不确定它是否涵盖了所有情况,也不确定是否有更简单的解决方案:
git stash
git clean -f -x -d
git checkout master
git fetch origin
git reset --hard origin/master
git pull origin master

有更好的方法来做这件事吗?


1
fetch + reset 之后,最终的 git pull 明显是多余的。 - Dietrich Epp
你的本地仓库有一个工作副本,而你的远程仓库是一个裸仓库。从根本上讲,它们在这个方面是不同的,没有办法使它们“完全”相同。但你可以精确地复制对象和引用。 - Adam Dymitruk
2个回答

3
以下一组命令可以让你和远程分支处于相同的状态:
git checkout -f master                # Check out the local 'master' branch
git fetch origin                      # Fetch the 'origin' remote
git reset --hard origin/master        # Reset all tracked files to remote state
git clean -dxff                       # Remove all non-tracked files

请注意,出于显而易见的原因,这些命令可能具有破坏性——也就是说,任何被此覆盖并且没有在其他方式下保存到提交中的本地更改都将会丢失。


3
git reset --hard

这个命令会丢弃所有的修改,包括已经暂存的。

git clean -xdf

这将会清除你的工作目录中那些由于被忽略或排除而未被git追踪的文件。

git checkout HEAD

将您置于无分支状态,以便您可以清除所有内容。

git branch | xargs git branch -D

将会删除所有你本地的分支

git tag -l | xargs git tag -d

将删除您的所有标签

git prune origin

将会清除不再存在于远程仓库中的任何跟踪分支

git fetch

将从远程获取您没有的任何分支和标签。在此处可以停止并检出您想要处理的任何远程分支,同时创建具有本地分支的工作目录:

git checkout origin/master

或者您可以创建本地分支,该分支指向所有现有远程分支在您获取(fetch)时所指向的位置。

git branch -r | xargs -n 1 git checkout

所以,如果你在完成了所有操作后执行 git push origin master 命令,所有情况下都将不会有任何更改吗? - aloo
如果你做了这些事情中的每一件,你就没有任何东西可推。 - Adam Dymitruk
需要考虑的一件事是,如果你正在Windows上工作,你的行尾可能会被识别为更改。添加并提交它们将会得到一个最终会被推送的东西。 - Adam Dymitruk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接