我可以完全放弃提交吗?

时间:2017-02-08 18:03:29

标签: git git-rebase

我想完全放弃某个提交。

我做了这个实验:

初始化回购

bash-3.2$ git init
Initialized empty Git repository in /Users/*****/test/.git/

创建文件

bash-3.2$ touch readme
bash-3.2$ ls
readme

提交此创作

bash-3.2$ git add .
bash-3.2$ git commit -m "first commit"
[master (root-commit) b9f8e60] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme

编辑该文件(发生了一些错误)

bash-3.2$ echo WrongMsg > readme
bash-3.2$ cat readme
WrongMsg

不小心提交修改

bash-3.2$ git add .
bash-3.2$ git commit -m "careless commit"
[master 1eec681] careless commit
1 file changed, 1 insertion(+)

检查日志

bash-3.2$ git log --oneline

将给出

1eec681 careless commit
b9f8e60 first commit

现在,我意识到了这个错误,想要解决它

bash-3.2$ git rebase -i HEAD^

会提示

pick 1eec681 careless commit

# Rebase b9f8e60..1eec681 onto b9f8e60 (1 command)
#
# 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

pick更改为drop,然后将:wq更改为保存,然后输出

Successfully rebased and updated refs/heads/master.

检查日志

bash-3.2$ git log --oneline
b9f8e60 first commit

纠正错误

bash-3.2$ echo CorrectMsg > readme
bash-3.2$ cat readme
CorrectMsg

提交

bash-3.2$ git add .
bash-3.2$ git commit -m "correction"
[master f224289] correction
1 file changed, 1 insertion(+)

日志

bash-3.2$ git log --oneline
f224289 correction
b9f8e60 first commit

似乎drop是成功的,但是如果我执行它:

bash-3.2$ git reset --hard 1eec681
HEAD is now at 1eec681 careless commit

bash-3.2$ git log --oneline
1eec681 careless commit
b9f8e60 first commit
BANG,历史仍然在回购中的某个地方,并没有真正被删除。

我可以完全删除这段历史吗?

3 个答案:

答案 0 :(得分:4)

git是懒惰的,所有这些提交都会保留,你可以使用

查看它们
git reflog

这将显示您所做的所有历史记录更改(Move branch,commit,rebase等)

他们确实得到了垃圾收集器的清理,但老实说这个功能更有帮助,令人讨厌。对于它将使用的微小空间我不会担心它。

答案 1 :(得分:1)

最终会被删除但如果您确实需要删除提交,则可以手动运行git gc

您需要使用--aggressive--prune=all运行它才能确保删除悬空提交。

答案 2 :(得分:0)

键入 git reflog 以显示各种提交消息和头号。 输入 git reset --hard HEAD {Head Number goes in here} 。头编号是您希望项目恢复的位置。警告:一旦恢复,您就无法回到那个时间点。