使用 git 恢复部分提交

发布于 2024-10-14 04:56:29 字数 173 浏览 6 评论 0原文

我想恢复 git 中的特定提交。不幸的是,我们的组织仍然使用 CVS 作为标准,因此当我重新提交到 CVS 时,多个 git 提交会合并为一个。在这种情况下,我很想挑出原始的 git 提交,但这是不可能的。

是否有一种类似于 git add --patch 的方法可以让我有选择地编辑差异来决定要恢复提交的哪些部分?

I want to revert a particular commit in git. Unfortunately, our organization still uses CVS as a standard, so when I commit back to CVS multiple git commits are rolled into one. In this case I would love to single out the original git commit, but that is impossible.

Is there an approach similar to git add --patch that would allow me to selectively edit diffs to decide which parts of a commit to revert?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

葬花如无物 2024-10-21 04:56:29

使用 --no-commit (-n) 选项进行 git revert,然后取消暂存更改,然后使用 git add - -patch

$ git revert -n $bad_commit    # Revert the commit, but don't commit the changes
$ git reset HEAD .             # Unstage the changes
$ git add --patch .            # Add whatever changes you want
$ git commit                   # Commit those changes

注意:使用 git add --patch 添加的文件是要恢复的文件,而不是要保留的文件。

Use the --no-commit (-n) option to git revert, then unstage the changes, then use git add --patch:

$ git revert -n $bad_commit    # Revert the commit, but don't commit the changes
$ git reset HEAD .             # Unstage the changes
$ git add --patch .            # Add whatever changes you want
$ git commit                   # Commit those changes

Note: The files you add using git add --patch are the files you want to revert, not the files you want to keep.

千笙结 2024-10-21 04:56:29

我已经成功地使用了以下内容。

首先恢复完整提交(将其放入索引)但不提交。

git revert -n <sha1>  # -n is short for --no-commit

然后以交互方式从索引中删除恢复的良好更改

git reset -p          # -p is short for --patch  

然后提交不良更改的反向差异

git commit -m "Partially revert <sha1>..."

最后恢复的良好更改(已被重置命令取消暂存)仍然在工作树中。它们需要清理。如果工作树中没有留下其他未提交的更改,则可以通过以下方式完成

git reset --hard

I have used the following successfully.

First revert the full commit (puts it in index) but don't commit.

git revert -n <sha1>  # -n is short for --no-commit

Then interactively remove the reverted GOOD changes from the index

git reset -p          # -p is short for --patch  

Then commit reverse diff of the bad changes

git commit -m "Partially revert <sha1>..."

Finally the reverted GOOD changes (which have been unstaged by the reset command) are still in the working tree. They need to be cleaned up. If no other uncommitted changes are left in the working tree, this can be done by

git reset --hard
仅冇旳回忆 2024-10-21 04:56:29

解决方案:

git revert --no-commit <commit hash>
git reset -p        # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- .   # Don't forget to use it.

Solution:

git revert --no-commit <commit hash>
git reset -p        # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- .   # Don't forget to use it.
疾风者 2024-10-21 04:56:29

另一种选择(如果文件的当前版本与您尝试恢复的版本相差不太远)是交互地签出。查看 git log 并获取您想要撤消的提交的哈希值,或者紧邻其之前的提交的哈希值。您的命令变为:(

git checkout --patch HASH_OF_COMMIT_TO_REVERT^ -- file/you/want/to/fix.ext

其中 ^ 表示父提交)或:

git checkout --patch HASH_PRECEDING_COMMIT_TO_REVERT -- file/you/want/to/fix.ext

然后,您可以在修补时通过选择 s(拆分)选项来选择要还原的块或其中的一部分。

这确实会更改工作树中的文件,但不会创建任何提交,因此,如果您真的搞砸了,可以使用 git reset --hard -- file/you/want/to/fix.ext 重新开始。

Another alternative (if your current version of a file isn't too far from the version you're trying to revert) is to checkout interactively. Look at git log and get the hash of the commit you wish to undo, or the one immediately before it. Your command becomes either:

git checkout --patch HASH_OF_COMMIT_TO_REVERT^ -- file/you/want/to/fix.ext

(where ^ means parent commit of) or:

git checkout --patch HASH_PRECEDING_COMMIT_TO_REVERT -- file/you/want/to/fix.ext

You can then choose hunks to revert, or parts thereof by choosing the s (split) option when patching.

This does change the files in your working tree but creates no commits, so if you really stuff up you can just start again with git reset --hard -- file/you/want/to/fix.ext.

又怨 2024-10-21 04:56:29

就我个人而言,我更喜欢这个版本,它重用自动生成的提交消息,并让用户有机会在最终提交之前编辑并粘贴“部分”一词。

# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>

# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1

# interactively add reversions
git add -p

# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>

# reset the rest of the current directory's working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .

Personally, I prefer this version, which reuses the auto-generated commit message and gives the user the opportunity to edit and stick the word "Partially" in before finally committing.

# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>

# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1

# interactively add reversions
git add -p

# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>

# reset the rest of the current directory's working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .
不…忘初心 2024-10-21 04:56:29

您可以使用 git-revert -n,然后使用 add --patch 来选择帅哥。

You can use git-revert -n, and then use add --patch to select hunks.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文