[Git]rebase 伪造历史

| 47 | Code | Git Github

如无特别说明,本人的所有Git操作都是在Github上面
git rebase -i HEAD~10 (修改最近10个历史)

下面是rebase打开的文本里命令的提示(git是通过判断进程是否运行来判断是否还在编辑,所以多标签的文本编辑器会影响git判断你是否还在编辑)

# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

其中每个历史里的变动占一行,我们只要改前面的pick即可,其中主用的一般是squash,squash会合并改动,再次rebase时是不会拆分的。edit则是修订历史变动里的错误。也可以改动这些变动的顺序。

需要注意的是git里以记录改动为主,如果修改历史变动是会改变现有代码的(特别是你把某个文件的最后一次commit给弄没的时候)。drop 意味着当时进行的修改也会被取消。很容易造成冲突(conflict),
所以一般是建议squash来合并commit

最后 git push --force
这个命令会把以往的历史彻底抹掉,出问题也会很彻底的,所以要谨慎。

conflict处理

需特别注意的是git rebase 是通过新创建进程来判断用户是否还在rebase的,因此在rebase之前请保证多标签的文本编辑器是关的

Comments
Write a Comment