PS:转载只是为了记录自己遇到的问题,并且方便以后总结和查阅,不喜请绕行!
git commit --amend
如果我们不小心提交了一版我们不满意的代码,并且给它推送到服务器了,在代码没被merge之前我们希望再修改一版满意的,而如果我们不想在服务器上abondon,那么我们怎么做呢?
git commit --amend //也叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中,
(1) 假如现在版本库里最近的一版正是我们想要追加进去的那版,此时是最简单的,直接修改工作区代码,然后git add,之后就可以直接进行git push到服务器,中间不需要进行其他的操作如git pull等
(2) 如果现在版本库里最近的一版不是我们想要追加进去的那版,那么此时我们需要将版本库里的版本回退到我们想要追加的那一版,想要将版本回退到我们想要的哪一版有好几种方法
1) 第一种即是我们从服务器上选取我们需要的版本,直接进行挑拣,在服务器的提交管理页面上右上方一般会有一个Download按钮,点击会弹出一个下拉框,选择其中的cherry-pick,复制命令,
之后在我们版本仓库对应的目录下运行这个命令,执行完后,使用git log -1 命令,可以查看到现在版本库里最近的一版变成了我们刚才挑拣的这版,此时再在工作区直接修改代码,
改完之后进行git add,再执行本git commit --amend命令,之后git push.
2) 使用gitk或其他的图形界面化工具,在终端输入 gitk,回车,会弹出gitk的图形界面,在界面的左侧部分陈列着版本库中的一条条commit-id,此时选中我们需要的那一版,右键点击之后会弹出一个
选择菜单,如果是在master 分支上,那么其中会有一项是 Reset master branch to here,点击这项,会弹出一个名为confirm reset的确认box,选择reset type 中的hard项,再点击OK,
关闭gitk图形界面,回到终端,运行git log -1命令,发现现在版本库里最近的一次提交已经是我们希望的那一版了,此时再在工作区直接修改代码,改完之后进行git add,
再执行本git commit --amend命令,之后git push.
3) 如果我们知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以直接使用git reset --hard HEAD~n命令,关于git reset 命令有详解,此时这个命令执行完后,
运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.
4) 如果我们不知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以使用git log来查看版本库中的commit-id,找到我们需要的commit-id后,在终端中执行git reset --hard commit-id,
时这个命令执行完后,运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.
场景描述
假设你创建了一个文件,并写入了一些内容,然后通过git add
和git commit
将此变更提交。提交之后才发现这个文件中少了一些内容,此时有两个选择摆在你面前:
-
将文件内容补全,然后和之前一样
git add
、git commit
。显然,你可以通过git log
看到这两条commit记录。 -
回到过去,修改上一次提交的那个文件。如此一来,你的commit记录只会有一条。对于一些有代码洁癖并且看中git commit记录的程序员,这点很重要,特别是在开源项目中。
场景再现
- 初始化git仓库
$ mkdir test && cd test && git init
- 第一次commit内容
-
$ echo 'Hello world' > README.md
-
$ git add .
-
$ git commit -m "Add README.md"
-
$ git log --oneline
-
c56f680 Add README.md
- 修改文件内容并合并到上一次的commit变更当中
-
$ echo 'Hello voidint' >> README.md
-
$ git add .
-
$ git commit --amend --no-edit
-
$ git log --oneline
-
eb6c8cb Add README.md // hash值发生了变化
可以看到,在执行git commit --amend --no-edit
之后,hash值由c56f680
变成了eb6c8cb
,但是message内容并没有发生变化,并且最重要的是只有一条commit记录。
如果要修改上一条的message,那么去掉--no-edit
选项即可,git commit --amend -m "xxxx"
。同理,commit记录同样只会有一条。