1. 不常用指令
1.1. 如果发现本次的commit里面的内容描述不太严谨或者本次某些文件有些不满意的地方需要小改, 那我们可以使用git commit --amend
进行修改.
(此时跳出来的是一个GNU nano窗口, 里面的内容是上一次commit的信息, 我们修改以后需要进行: Ctrl+O, enter, Ctrl+X
)
注意: 本地的代码库还没有push到远程库的情况下, 不然使用amend还会增加另外2次的commit信息.
此时就需要先git pull
, 然后自动跳出commit窗口, 编写commit信息, 最后git push
如果我们想对前几次的commit进行原地修改
, 那我们就需要交互式变基操作git rebase -i HEAD~<number>
了, 具体方法见[1].(变基操作比较绕)
1.2. Gitlab提交MR时, squash选项会将dev分支的所有提交压缩成一个commit.
1.3. Git如何同步多个远程仓库.
1.4. Git删除本地文件后,如何同步到远程(代码文件名包含中文).
1.5. 我们使用变基操作以后, 会导致头指针偏离, 如果出现基本什么操作都做不了的情况, 这个时候就需要我们创建临时分支并merge了.
正常情况下, branchName分支指向commit ID, 而HEAD指向branchName, 如果执行
git checkout commitId
或者git rebase -i xxx
操作会导致HEAD指针偏离.
注意:头指针分离于
和头指针分离自
的区别
1.6. git rebase -i HEAD~<number>
可以对好几次的commit进行合并提交.(当然也可以修改历史commit, 主要是基于变基rebase的操作)
需要在弹出的Nano编辑界面中, 将后几个的pick改为squash, 保存以后, 会再次弹出一个页面, 让你编写修改commit的内容.
1.7. Merge操作
1.7.1. git merge dev
将使用快进模式进行合并, 但是它会将dev分支的commit信息归并到master上, master分支看着就会很长;
1.7.2. git merge --no-ff -m "xxx" dev
会将dev分支的commit信息保留在dev分支上, 这个我们是可以在graph图上看到的, 然后会将xxx的commit信息放到master上;
1.7.3. 如果想实现既看不到dev分支又没有好多dev分支的commit信息, 那就需要rebase操作了(这个应该和Gitlab上进行MR合并时的选项squash意思一样);
1.8. 不到万不得已, 不要使用git push -f
命令(为了防止有的开发者恶意修改代码, Gitlab内部已经默认master分支是protected属性, 这种情况下是不可以强制推送的, 除非让管理者将master分支的protected属性去掉);
1.9. git commit -a -m "xxx"
命令: 在工作区对文件进行修改以后, 可以不add再commit, 使用此命令可以将工作区内所有的修改文件和删除文件加入暂存区, 并进行commit. 详见git commit --help
.
1.10. 可以使用git commit -s -m " "
命令来为commit添加一条Signed-off-by信息.
2. 常用指令
2.1. 基本流程
2.3. 工作区, 版本库(暂存区stage + HEAD)示意图:
我们在电脑中能看到的文件目录, 就是工作区
, 而隐藏目录.git是Git的版本库
.
2.2. 回退 撤销
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区;
git checkout
命令既可以切换分支, 也可以丢弃工作区的修改(记得加–);
2.2. 删除远程分支: git push origin --delete [branchname]
2.3. git reflog
指令可以记录你所有的操作, 很有用的一个命令.
3. 参考资料
[1]. Git 实用操作:重写 Commit 历史
[2]. Git官网参考手册
[3]. Git头指针分离状态
[4]. 廖雪峰老师的Git教程
[5]. git rebase
变基操作
[6]. 深入git rebase使用(不错)
[7]. Git中文版魔法书:
英文版
中文版