如何修改git中的指定提交?

我通常会提交一个提交列表供审查。 如果我有:

  • HEAD
  • Commit3
  • Commit2
  • Commit1
  • 我知道我可以使用git commit --amend修改头部提交,但是如何修改Commit1 ,因为它不是HEAD提交?


    例如,你可以使用git rebase,如果你想修改回提交bbc643cd ,运行

    $ git rebase --interactive 'bbc643cd^'
    

    在默认编辑器中,在要修改其提交的行中修改pickedit 。 进行更改,然后用与之前相同的消息进行提交:

    $ git commit --all --amend --no-edit
    

    修改提交,并在此之后

    $ git rebase --continue
    

    返回到前面的头提交。

    警告 :请注意,这将改变该提交的SHA-1 以及所有的孩子 - 换句话说,这将重写这一点的历史。 如果您使用命令git push --force推送,则可以打破回收站的做法


    使用真棒互动式底座:

    git rebase -i @~9   # Show the last 9 commits in a text editor
    

    找到你想要的提交,将pick改为eedit ),然后保存并关闭文件。 Git会回退到该提交,让您可以:

  • 使用git commit --amend来进行更改或
  • 使用git reset @~放弃最后一次提交,而不是对文件的更改(即将您带到您编辑文件但尚未提交时的位置)。
  • 后者对于做更复杂的事情很有用,如分裂为多个提交。

    然后,运行git rebase --continue ,然后Git将在修改的提交之上重播后续更改。 您可能会被要求解决一些合并冲突。

    注: @HEAD缩写, ~是指定提交之前的提交。

    阅读更多关于在Git文档中重写历史记录的信息。


    不要害怕改变基础

    ProTip™:不要害怕尝试重写历史记录的“危险”命令* - 默认情况下,Git不会在90天内删除您的提交; 你可以在reflog中找到它们:

    $ git reset @~3   # go back 3 commits
    $ git reflog
    c4f708b HEAD@{0}: reset: moving to @~3
    2c52489 HEAD@{1}: commit: more changes
    4a5246d HEAD@{2}: commit: make important changes
    e8571e4 HEAD@{3}: commit: make some changes
    ... earlier commits ...
    $ git reset 2c52489
    ... and you're back where you started
    

    *注意像--hard--force这样的选项 - 他们可以丢弃数据。
    *另外,不要在你正在合作的分支上重写历史记录。



    在很多系统上, git rebase -i会默认打开Vim。 Vim不能像大多数现代文本编辑器一样工作,所以请看看如何使用Vim进行rebase。 如果你更愿意使用不同的编辑器,可以使用git config --global core.editor your-favorite-text-editor


    使用--autosquash交互式--autosquash是我经常使用的,当我需要在历史中更深入地--autosquash以前的提交时。 它基本上加速了ZelluX的答案所展示的过程,并且在您需要编辑多个提交时特别方便。

    从文档:

    --autosquash

    当提交日志消息以“squash!...”(或“fixup!...”)开始,并且存在一个标题以相同的开头的提交时,自动修改rebase -i的待办事项列表,以便提交标记为压扁之后立即进行修改

    假设你有一个如下所示的历史记录:

    $ git log --graph --oneline
    * b42d293 Commit3
    * e8adec4 Commit2
    * faaf19f Commit1
    

    并且您有要更改为Commit2的更改,然后使用提交更改

    $ git commit -m "fixup! Commit2"
    

    或者,您可以使用commit-sha而不是提交消息,所以"fixup! e8adec4或甚至只是提交消息的前缀。

    然后在之前的提交上启动交互式底图

    $ git rebase e8adec4^ -i --autosquash
    

    你的编辑器将打开已经正确命令的提交

    pick e8adec4 Commit2
    fixup 54e1a99 fixup! Commit2
    pick b42d293 Commit3
    

    所有你需要做的就是保存并退出

    链接地址: http://www.djcxy.com/p/547.html

    上一篇: How to modify a specified commit in git?

    下一篇: Ignore files that have already been committed to a Git repository