Git rebase

此篇介绍Git rebase等操作。

Start

git commit

1. git commit –amend

image-20220223195135831
1
2
3
4
5
6
7
8
9
10
11
12
➜  git-exercise git:(main) ✗ git add .
➜ git-exercise git:(main) ✗ git commit -m "开始rebase,先测commit撤销"
[main b00c892] 开始rebase,先测commit撤销
1 file changed, 2 insertions(+)
create mode 100644 rebase1.txt
➜ git-exercise git:(main) git log
➜ git-exercise git:(main) git log
➜ git-exercise git:(main) ✗ git add rebase1.txt
➜ git-exercise git:(main) ✗ git commit --amend
[main 833283c] 测试commit --amend 是否能用
1 file changed, 2 insertions(+)
create mode 100644 rebase1.txt

先提交一次在gitexercise上。

1
2
3
4
原来文件内容:
先测试commit撤销开始
修改后:
先测试commit撤销开始,我修改了一下错误以amend
image-20220223195653217

显而易见:

commit --amend 可以修复当前提交的错误。使用方式:

1
git commit --amend

需要注意的有一点:commit --amend 并不是直接修改原 commit 的内容,而是生成一条新的 commit

rebase

前置条件。

image-20220223201716036

在test-rebase分支上

1
git rebase main
1
2
3
4
5
6
7
8
9
10
➜  git-exercise git:(test-rebase) git rebase main
Auto-merging rebase1.txt
CONFLICT (content): Merge conflict in rebase1.txt
error: could not apply afeeb31... rebase分支提交
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply afeeb31... rebase分支提交
# nice
image-20220223202146101

打开文件可以看到冲突的地方已经标出来了。解决冲突之后。

1
2
3
4
5
6
➜  git-exercise git:(cb9e2c9) ✗ git add rebase1.txt 
➜ git-exercise git:(cb9e2c9) ✗ git rebase --continue
[detached HEAD 5ce1e26] rebase分支提交
2 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 rebase2.txt
Successfully rebased and updated refs/heads/test-rebase.
image-20220223202637695

test-rebase分支直接 以 main分支最新提交为起点 再把自己分支上的提交依次排在main起点开始。

通过这样的方式,就让本来分叉了的提交历史重新回到了一条线。这种「重新设置基础点」的操作,就是 rebase 的含义。

另外,在 rebase 之后,记得切回 mastermerge 一下,把 master 移到最新的 commit

1
2
3
git checkout master
git merge branch1
# 这里的merge实际上 是 fast-forward
1
2
3
4
5
6
7
8
9
10
11
➜  git-exercise git:(test-rebase) git checkout main
Switched to branch 'main'
Your branch is ahead of 'origin/main' by 3 commits.
(use "git push" to publish your local commits)
➜ git-exercise git:(main) git merge test-rebase
Updating cb9e2c9..5ce1e26
Fast-forward
rebase1.txt | 3 +--
rebase2.txt | 1 +
2 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 rebase2.txt

其实很好记。对于一般情况,总会操作master。那么

  1. merge实际上都要从master出发使用,git merge other-branch
  2. rebase实际上都是:git rebase master意思就是以master为基点,变基。
  3. 注意的是操作master的rebase,最后要在master上merge一下以达到最新。
image-20220223203346518 image-20220223203422000

如果是merge而不是rebase,从开始测试rebase(包括这个commit开始一共4个因为会新产生一个,并产生分叉。

对比rebase和merge。

image-20220223203713858

总结

rebase 指令,它可以改变 commit 序列的基础点。它的使用方式很简单:

1
git rebase 目标基础点

需要说明的是,rebase 是站在需要被 rebasecommit 上进行操作,这点和 merge 是不同的。

下一篇:处理一些提交上的错误大全


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!