有没有类似“git reset --hard --dry-run”的东西?

icomxhvb  于 2023-02-17  发布在  Git
关注(0)|答案(4)|浏览(151)

我知道git reset --hard可能会导致不必要的数据丢失,因为它可能会做出无法撤消的更改,是否有办法在执行之前检查它会做什么?

git reset --hard --dry-run

git reset --hard --verbose --dry-run

不幸的是,它不能与现有的Git一起工作,因为reset不支持--dry-run

57hvy0tb

57hvy0tb1#

既然你似乎正在寻找一个选项,你可以避免数据丢失,让我给你一个不同的选择.
git stash允许您在将HEAD保存到stash时检出HEAD。然后,您可以使用git stash pop撤消此操作。
所以,你可以不使用git reset --hard,而使用git stash,结果基本相同。如果你不喜欢这些修改,你可以使用git stash pop撤销它,如果你觉得不错,你可以使用git stash drop从存储中删除这些修改(这是一个破坏性的操作)。
如果您还想包含未跟踪的文件(默认情况下git reset --hard不这样做),可以使用git stash --include-untracked
如果不想重置为HEAD(也就是说,你想执行git reset --hard some_ref),你可以先执行stash本地修改,使用git show-ref获取当前提交哈希,然后运行git reset --hard。如果你不确定,你可以重新设置为提交(除非你运行git gc或类似的东西来清除悬空引用)。然而,在这一点上,你可能也想创建一个分支或标记作为备份。

# Stash your local changes
git stash # add --include-untracked if you want to stash untracked files as well
# get the current commit hash AND SAVE IT somewhere
git show-ref # this will output the commit hash of HEAD
# reset to some ref
git reset --hard some-ref
# In case you want to undo it, reset to the commit hash from git show-ref again and load the local changes from the stash again
git reset --hard YOUR_HASH_FROM_SHOW_REF # replace YOUR_HASH_FROM_SHOW_REF with the hash from git show-ref
git stash pop

无论如何,我建议您创建一个包含所有重要更改的存储库副本(只需复制整个目录),以防出现问题,特别是如果您不确定命令。
还要注意,git stash允许您隐藏本地更改, checkout 或重置另一个引用,然后将这些更改应用到新 checkout /重置的引用上。

vs3odd8k

vs3odd8k2#

我不同意这个问题的前提。我整天都在灵活自由地进行硬重置,我不会冒任何风险。如果所有的东西都在提交中很好地隐藏起来,硬重置是完全安全和不可撤销的(特别是如果你先做了一个占位符分支)。所以这只是一个确保所有东西都被隐藏起来的问题。git status会告诉你这一点。
另外,考虑git switch --det作为一种替代方案。它的功能与硬重置非常相似,但它内置了安全检查。您总是可以先切换,然后再移动分支名称。同样,我经常这样做。
最后,我只需要补充一点,我有一个别名,它允许我说git snapshot,以确保双重肯定:

snapshot = !git stash push --include-untracked --message \"snapshot: $(date)\" && git stash apply \"stash@{0}\" --index

如果你先快照,下一步就安全了,因为你总是可以回到你之前的提交并应用隐藏的内容。

ibrsph3r

ibrsph3r3#

git reset --hard没有空运行模式,但这应该会让您接近相同的信息:

#!/bin/bash
echo "Changes that would be executed to working directory files:"
git diff -R HEAD
echo "Staged changes that would be lost:"
git diff --cached --stat

或作为单内衬:

git diff -R HEAD && git diff --cached --stat
qyswt5oh

qyswt5oh4#

为了看看git reset --hard有什么影响,你可以创建一个分支的备份,如果你不满意的话,可以恢复到它:

git branch backup 
git reset --hard <commitid>

如果您对此不满意,请恢复备份:

git reset --hard backup

否则,删除备份

git branch -D backup

相关问题