git更改前一次commit内容并提交到master
文章发布较早,内容可能过时,阅读注意甄别。
在使用git
的时候,我们经常会进行提交push
,但是如果发现当前分支新增的内容并不好,想要回退到上一次commit
的内容,该如何操作呢?
现在先简单操作一下,创建一个原始测试文件。
$ echo a > test
$ git add .
$ git commit -m "a"
$ git push origin master
1
2
3
4
2
3
4
现在模拟正常开发,变更了test
内容,并提交。
$ echo b > test
$ git add .
$ git commit -m "b"
$ git push origin master
1
2
3
4
2
3
4
就在这个时候,突然发觉,新修改为 b,并不是想要的结果,上次的 a 倒是想要的,而且新的更改打算基于 a 来进行,因此就需要退回去了(这里忽略在当前分支更改的情况,因为有时候文件变更之多,已经不是在当前分支更改这么简单的事情了)。
首先查看一下两次提交的信息:
$ git log
commit bbdad59835b4ad0fabafcc938bdc97c31ec5fbcb (HEAD -> master, origin/master)
Author: eryajf <liqilong@edspay.com>
Date: Sat Jul 13 23:55:15 2019 +0800
b
commit ae547b02bc32927b2dfd9a05d0ced53c1838180c
Author: eryajf <liqilong@edspay.com>
Date: Sat Jul 13 23:52:56 2019 +0800
a
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
注意这个时候 test 文件里边的内容是 b,我现在想先将其回退到 23:52:56
的提交,然后在那个基础上,更改文件内容,并作为最新的代码合并到主分支。
$ git log --pretty=oneline
bbdad59835b4ad0fabafcc938bdc97c31ec5fbcb b
ae547b02bc32927b2dfd9a05d0ced53c1838180c a
065e6fbe1d58b66a20503a3178bacaaa2c740d97 (origin/test, old-master) new
c78e5e4e36820d473aa4954d806d5cbb3eff4f0c 1
5a6ebddb9188233eccfc023eb18e28ff04f8723f 0
819665d73f393992e358c4acc3da4c4aa0eaaa7c fix
16b82739181d97fa3c54c08f92566d7daecccbec (origin/dev, dev) test
98ed573c557430eda03d78d25783b8798b9ab036 fei
9d9b833cd05d733bd26b9236d0f6de4c4cf0d4b1 test
f8d74d07898dd57cb2c6ce3bbd7accffe75daa08 test
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
首先我们切换到a
的那次HEAD
中。
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (master)
$ git checkout ae547b02bc32927
Note: checking out 'ae547b02bc32927'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at ae547b0 a
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
切过去之后,基于这个位置新建一个分支,然后做新的更改,更改之后,将新的分支的更改推送到远程仓库。
$ git checkout -b atest
Switched to a new branch 'atest'
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (atest)
$ cat test
a
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (atest)
$ echo c > test
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (atest)
$ git add .
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (atest)
$ git commit -m "c"
[atest 102e070] c
1 file changed, 1 insertion(+), 1 deletion(-)
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (atest)
$ git push origin atest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
现在已经将 atest 这个分支推送到了远程仓库,我们想把这个分支来作为最新的主分支,但是如果直接合并肯定会有冲突,也就是说现在的被合并分支,要比master
分支更靠前,这一点,用工具来查看会更加直观。
从 Gitlab 的分支图也可以看到。
这个时候,如果想直接把atest
合并到master
,显然不可行,因此可以有两种方案,基本上就是更易其主的思路。
- 要么把 master 删除,然后 atest 上位。
- 或者将 maser 重命名,再将 atest 重命名为 master。
这里采用第二种方案操作一下:
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (atest)
$ git branch -m master old-master
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (atest)
$ git branch -m atest master
Administrator@liqilong MINGW64 ~/Desktop/pipeline/test (master)
$ git push -f origin master
1
2
3
4
5
6
2
3
4
5
6
这样,就实现了基于之前一次 commit 的提交回退并二次开发提交的操作。也适用于有一些 master 分支年久失修的情况。
遇到的报错:
- 1,强制提交到 master 报错。
报错内容如下:
$ git push -f origin master
Total 0 (delta 0), reused 0 (delta 0)
remote: GitLab: You are not allowed to force push code to a protected branch on this project.
1
2
3
2
3
是因为 master 是受保护分支,可以到 Gitlab 中对项目的 master 分支进行解除限制。
- 2,
you need to resolve your current index first
在切换分支的时候,总会提示这个信息:
$ git checkout master
error: you need to resolve your current index first
a: needs merge
1
2
3
2
3
这个时候只需执行 git reset --merge
即可解除。
上次更新: 2024/11/19, 23:11:42