Skip to content

修改历史

参考:https://github.com/geeeeeeeeek/git-recipes/wiki/2.7-%E9%87%8D%E5%86%99%E9%A1%B9%E7%9B%AE%E5%8E%86%E5%8F%B2

1. git commit --amend

可以用来对最新的提交打补丁,修改最新提交的提交信息 commit message

Note

即使什么都不修改,也会产生一个新的提交id,本质上是使用了新的提交替换掉了旧的提交。

[root@dev git-test]# git log --oneline
352538e conflict commit
a9f87ab pull --rebase 演示
2b43768 test pull --rebase conflic

[root@dev git-test]# git commit --amend
[master 98c3844] conflict commit
 1 file changed, 1 insertion(+)

[root@dev git-test]# git log --oneline
98c3844 conflict commit
a9f87ab pull --rebase 演示
2b43768 test pull --rebase conflic

2. git rebase

Reapply commits on top of another base tip。

Forward-port local commits to the updated upstream head。

git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
       [<upstream>] [<branch>]
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
       --root [<branch>]
git rebase --continue | --skip | --abort | --edit-todo

如果指定了git rebase 将在执行任何其他操作之前执行自动执行 git checkout <branch>

       假设当前处于 topic 分支:

                     A---B---C topic
                    /
               D---E---F---G master

       执行下面的命令之一(可以使用"-i"选项交互式的更改提交,然后再rebase):

           git rebase master
           git rebase master topic

       会变成:

                             A'--B'--C' topic
                            /
               D---E---F---G master

       NOTE: 后一种形式只是执行跟在 git rebase master 后面的 git checkout topic的简写方式。当rebase退出时,当前分支仍将是topic。

       如果上游分支已包含所做的更改,则将跳过该提交。例如,在以下历史记录上运行"git rebase master"(其中 A' 和 A 引入了相同的更改集,但具有不同的提交者信息):

                     A---B---C topic
                    /
               D---E---A'---F master

       结果是:

                              B'---C' topic
                             /
               D---E---A'---F master

实践:

# 当前的master分支
[root@dev git-test]# git log --oneline
fdd2dad conflict commit
a9f87ab pull --rebase 演示
f1681e8 index of develop commit: 5
f808049 index of develop commit: 3

# 切换到develop分支
[root@dev git-test]# git checkout develop
Switched to branch 'develop'
# 此时可以看到两个分支有不同的提交
[root@dev git-test]# git log --oneline
992bcc4 test rebase
f1681e8 index of develop commit: 5
f808049 index of develop commit: 3

# 现在将develop的提交重新基于master的提交
[root@dev git-test]# git rebase master
First, rewinding head to replay your work on top of it...
Applying: test rebase
[root@dev git-test]# git log --oneline
3c525df test rebase
fdd2dad conflict commit
a9f87ab pull --rebase 演示
f1681e8 index of develop commit: 5
f808049 index of develop commit: 3

# 此时可选择将master与develop进行线合并,而不会出现合并提交 merge commits 的情况
[root@dev git-test]# git checkout master
Switched to branch 'master'
[root@dev git-test]# git merge develop
Updating fdd2dad..3c525df
Fast-forward
 d6 | 1 +
 1 file changed, 1 insertion(+)
[root@dev git-test]# git log --oneline
3c525df test rebase
fdd2dad conflict commit
a9f87ab pull --rebase 演示
f1681e8 index of develop commit: 5
f808049 index of develop commit: 3

3. git reflog

记录HEAD的更新。

[root@dev git-test]# git reflog
3c525df HEAD@{0}: merge develop: Fast-forward
fdd2dad HEAD@{1}: checkout: moving from develop to master
3c525df HEAD@{2}: rebase finished: returning to refs/heads/develop
3c525df HEAD@{3}: rebase: test rebase
fdd2dad HEAD@{4}: checkout: moving from develop to fdd2dad853f57ec89edf881e6102521a1ba208c0^0
992bcc4 HEAD@{5}: checkout: moving from master to develop
fdd2dad HEAD@{6}: checkout: moving from develop to master
992bcc4 HEAD@{7}: commit: test rebase
......

引用日志提供的安全网只对提交到本地仓库的更改有效,而且只有移动操作会被记录。