Undo local changes in Git
我的情况:我克隆了一个存储库(内核的源文件)。然后签出一个分支,并构建内核。二进制文件已存储在工作树的子目录中。现在,我想放弃所有本地更改,包括构建的二进制文件,并恢复到克隆存储库的另一个分支。
特别是,我认为这个答案是有用的。在我看来,最好的方法是
1
| git checkout -f <desired branch of the original cloned repository> |
如果我理解正确,这将强制签出,放弃本地更改(如果我错了,请纠正我)。Git成功地签出了,但是我仍然在工作树的同一个子文件夹中找到以前构建的二进制文件。
因为您的构建生成的二进制文件不被Git跟踪,所以它们不被认为是本地更改。
git clean -xdf。
应该很好地为你根除它们。
- 我不明白的是:为什么Git不跟踪二进制文件?
- 未跟踪文件是尚未添加到Git存储库的文件。由于这些二进制文件还没有提交,Git没有跟踪对它们的更改。因此,为什么可以用git-clean清除它们?
- 从概念上讲,二进制文件通常不应该由git跟踪(如果您有一个,那么应该由您的.gitignore文件覆盖)。有两种不同的方法来跟踪由构建生成的二进制文件——像Artifactory这样的二进制存储库是我的最爱——但是由于二进制文件不是源代码,所以它们通常不应该提交给Git存储库。
- 事实上,我发现了一个.gitignore,必须指定-x选项。
改编自丹·莫德尔和克尼特的回答
将分支设置为与远程分支完全匹配,包括清除未跟踪的文件,可以通过三个步骤完成:
1 2 3
| git fetch origin
git reset --hard origin/<branch name>
git clean -f -d |
说明:git fetch抓取存储库的最新版本。git reset放弃分支上对跟踪文件的任何本地更改。git clean从本地副本中删除任何未跟踪的二进制文件。
作为参考,如果您想让Git不跟踪您构建的二进制文件,您应该创建一个.gitignore文件。请参阅忽略文件以进行详细解释,但对于Java程序,您可以使用以下内容。
1 2 3 4
| # Compiled files
bin/
*.class
*.jar |
号
- 我将这个答案与Matt Alioto的答案进行比较:他只提出了其中一个步骤,第三个步骤。我真的需要这三个步骤吗?请注意,我满足于恢复到克隆时的状态—之后所做的更改可能与此无关。
- git fetch获取存储库的最新版本。git reset放弃分支上对跟踪文件的任何本地更改。git clean从本地副本中删除任何未跟踪的二进制文件。
- 好吧,所以为了我的目的,我不需要git fetch。git clean将删除二进制文件。但是git reset呢?如果我像建议的命令一样强制签出,那么它是否会因为对跟踪文件的本地更改而被丢弃?
- 我个人对git reset比我被迫退房更熟悉,但如果对你有用的话,你可以用git checkout代替git reset。不过,您的里程可能会有所不同。
- 最后一个问题。我看过Git Clean文档。-d选项也可以清除目录。在某些情况下可能需要-f选项来强制清除。但是-x选项呢?老实说,我不知道我是否需要它。
- -x清理通过.gitignore忽略的文件。如果你没有.gitignore,你可以忽略它。(来源)
重置当前分支。签出到local/master,然后创建一个具有remote/branch历史的新分支。
1 2 3 4 5 6 7 8 9
| $ git add .
$ git reset --hard HEAD
$ git checkout master
$ git fetch
$ git checkout -b <branch-name> origin/<remote-branch-name>
# replace <branch-name> = new local branch, <remote-branch-name> = remote desired branch name |
现在重新构建二进制文件。
- 我不认为git reset或git checkout会影响未跟踪的文件。
- 是,需要先添加,然后将所有文件重置为上次提交