我如何将修改的文件转换为以前的修订,在一个特定的 commit hash (我通过 git log 和 git diff 确定)?


当前回答

下面是Rebase如何工作:

git checkout <我的分支> git rebase 主 git checkout 主 git merge <我的分支>


假设你有

───────────────────

... 查看你想向大师分支申请的变革分支。 退缩命令从 <我的分支>(不在大师中找到)采取命令,并将其重新应用到大师的头部。 换句话说,在 <我的分支>中的第一个命令的父母不再是大师历史中的先前命令,而是当前大师的头部。

git rebase master <my branch>

这可能更容易记住这个命令,因为“基础”和“修改”分支都明确。

历史的最终结果是:

────────────────────


git checkout master
git merge <my branch>

...做一个快速前进的合并,将所有 <我的分支> 变更应用于主人. 没有这个步骤,退缩承诺不会添加到主人. 最终结果是:

───────────────────

git branch -d <my branch>

其他回答

您可以使用 diff 命令快速查看文件中的更改:

git diff <commit hash> <filename>

然后将特定文件转换为该承诺,使用重新设置命令:

git reset <commit hash> <filename>

您可能需要使用 --hard 选项,如果您有本地修改。

管理路点的好工作流是使用标签清晰地标记时间线中的点,我无法完全理解你的最后一句话,但你可能想要的是从前一个点分开一个分支。

git checkout <commit hash>
git checkout -b <new branch name>

然后,你可以放弃这个对你的主要线,当你准备合并这些变化:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

这是一个非常简单的步骤. 检查文件到我们想要的承诺ID,这里一个承诺ID之前,然后只是 git承诺修改,我们已经完成了。

# git checkout <previous commit_id> <file_name>
# git commit --amend

如果我们想把任何文件带到承诺的顶部的任何先前承诺 ID,我们可以轻松地做到。

我必须在这里插入EasyGit,这是一个插槽,使Git更接近新人,而不会混淆经验丰富的用户。

此分類上一篇: foo/bar foo/baz

如果你曾经有一个版本的文件在承诺 $ A,然后后来做了两个不同的承诺 $ B 和 $ C (所以你正在看到的是第三个字符串的文件),如果你说“我想要返回第一个”,你真的意味着吗?

如果你想摆脱第二个和第三个 iteration 的变化,这是非常简单的:

$ git checkout $A file

命令要求“我想检查由命令A记录的状态的文件”。

另一方面,你指的是摆脱改变的第二个 iteration(即承诺 $B)引入,同时保持什么承诺 $C 做到文件,你会想转换 $B。

$ git revert $B

請注意,任何人創建的承諾 $ B 可能沒有非常規律,並可能在同一承諾中進行了完全無關的變化,而這個逆轉可能會觸摸其他檔案,而不是檔案,你會看到有害的變化,所以你可能想仔細檢查結果,然後做到這一點。

git log --oneline  // you see commits, find commit hash to which you want reset
git diff y0urhash src/main/.../../YourFile.java   // to see difference
git reset y0urhash src/main/.../../YourFile.java   // revert to y0urhash commit
git status                                        // check files to commit
git commit -m "your commit message"
git push origin