修改本地 Git 历史

Wed 21 November 2018

很早之前一篇发表在内部的文章,抽时间整理了一下发布出来。

以下操作会修改提交历史, 可能会造成一些不可恢复的问题, 不是 下面情况不要这么操作

  1. 基于 GitHub Fork -> Pull Request 流程仅针对 Fork 后的仓库进行操作
  2. 非第一种情况的前提是当前修改的提交还未提交到远端

操作下面命令前最好先备份

修改上一条提交的信息

有时候我们在用 Git 提交后发现提交信息(commit message)不是我们预期的内容(错别字或描述错误等), 这个时候我们可能想修改一下上一条提交的信息, 有两种方式可以进行:

$ git commit --amend

这条命令会直接打开你的终端编辑器让你可以修改提交信息, 也可以组合 reset 命令重新提交:

$ git reset HEAD^ --soft
$ git commit -m 'new message'

这条命令会撤销上一条提交, 并将上一条提交的内容放在工作区内(git add 之后的区域), 然后就可以通过 git commit 重新提交.

合并多个提交

有时我们为什么了方便记录, 会频繁的创建一些 临时 提交, 我们在将提交推送到远端之前可以通过 git rebase 来对现有的多条提交进行合并和编辑:

$ git rebase -i origin/master   # master 换成你要推送到远端得分支
                                # 基于 Fork -> PR 的流程可以将 origin/master 替换为上游所在的远端分支

这条命令会打开你的终端编辑器, 并显示类似如下的内容:

pick 48c9e10 tmp
pick 23354c6 tmp

# Rebase 3b92b89..23354c6 onto 3b92b89 (2 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

内容里面已经说的很明显了, 我们翻译一下关键信息:

# p, pick = 使用此提交
# r, reword = 使用此提交, 但编辑当前提交的提交信息
# e, edit = 使用此提交, 但停止修改
# s, squash = 使用此提交, 但将当前提交合并到上一条提交
# f, fixup = 和 squash 一样, 但是忽略提交信息
# x, exec = 使用 shell 运行当前行的命令
# d, drop = 移除当前提交

那么我想合并这两条提交并更改一下 commit message 内容如下:

r 48c9e10 一个有意义的提交信息
s 23354c6 tmp  # 用 f 也行

总结

大家可以创建一个练习仓库也体验一下上面命令的不同点, 另外建议多看看 Pro Git Book

Category: Git Tagged: Git

comments


解决git提交敏感信息(回退git版本库到某一个commit)

Fri 07 June 2013

git是一个很好的版本库, 现在很多人用它, 并在github上创建项目, 相信大家都有过将敏感信息提交版本的经历, 如何删除? 好像只有删除版本库来解决, 其实我们可以通过回退版本库删除相应的commit来将提交的敏感信息去掉.

备份本地代码

首先我们将本地代码的更改备份一下, 以防丢失更改

回退本地代码的commit

备份完数据, 我们就可以先回退本地的版本库

git reset --hard HEAD~1        # 回退到上一次的提交, 如果是上n次就将1改成对应的数字

回退远端版本库

接下来如果你直接提交会发现提交不了, 说远端做了更改需要先pull一下, 如果pull咱们就白白做上面的操作, 所以我们可以在别的分支操作

新建一个分支, 并提交

git checkout -b temp
git push origin temp:temp

重建主分支

下面我们可以删除并重建主分支, 如果是github的话需要将Default Branch切换到别的分支(项目主页->Settings即可看到)

git push origin --delete …

Category: git Tagged: git 敏感信息 回退 commit 版本库

comments

Read More
Page 1 of 1

Fork me on GitHub