1、查看不同版本之间的代码差异
短SHA-1值
使用git命令来代表某个commit时,我们不一定就是要用40位完整的SHA-1 hash值,也可以只是提供hash值的前几位就可以了,至少要4位以上,同时在git仓库中就这前几位可以唯一定位一个commit就ok。一般会选择前7位。
版本回退:
git reset hash值
git reset --hard hash值参数--hard,直接把工作区的内容也修改了,不加--hard的时候只是操作了暂存区,不影响工作区。
看一下某个commit的具体信息:
git show hash值
查看某个分支指向哪个master
分支实际上就是一些指针,所以分支是指向commit的,也可以直接用分支名称来指代它目前指向的那个commit
git show master,就可以查看master分支指向的那个commit
选择历史版本的特殊语法
git show HEAD^
git show HEAD~2
HEAD,指针,指向的是当前的那个分支,当前的那个分支又是指向某个commit
HEAD,就可以指代当前你所处的那个commit对应的版本
HEAD,就是说,HEAD对应的commit的上一个commit,HEAD^,上两个commit,HEAD^,上三个commit
HEAD~5,就是说HEAD之前的第5个commit
比较两个分支之间差了哪些commit还没有合并
git diff:工作区和暂存区
git diff --cached:暂存区和仓库
git diff HEAD:工作区和仓库
git diff 分支1 分支2:两个分支之间的差异
git diff HEAD HEAD^:最近两次提交之间的差异
gitlab进行分支代码对比:
2、将暂存区里边的功能代码分为多次提交
我们把很多天的代码都提交到了暂存区了,如何将暂存区的内容分为多个commit来提交?
1. git add -i 进入交互模式
2. 输入 3 使用revert 从暂存区挪出来 update 是放入暂存区
3. 选择你想要挪出来的文件 选中之后前面就会被标上 *
还可以继续标。
4. 回车输入7退出 再查看状态test.txt变成没有了被追踪的文件
3、开发中途要切换分支又不能commit
强行切换git是不允许切换的。
执行 git stash
这个命令执行完后,发现工作区的代码恢复到干净的状态,好像什么都没改过。然后等到其他的分支任务干完之后,再切换回来。
执行 git stash list
查看有哪些stash
恢复git stash apply 或者是 git stash apply stash@{0}
注意:git stash apply 默认恢复最新版本即:stash@{1}
删除stash
git stash drop stash名称
git stash -u --include-untracked
git stash 默认是将工作区modifyed 状态的文件暂存起来,对于untracked file文件,git stash 这个命令是不能进行暂存的!不过对于只有新增文件,是可以进行切换分支的。
如果你想将 untracked 文件也进行暂存起来,需要执行 git stash -u --include-untracked
4、针对本地不规范的commit进行修改
当我们已经本地执行了commit,但是还没有push到远程仓库,这个时候发现我写的备注不符合规范,那么此时可以进行如下操作:
1、修改最新一次commit,执行git commit --amend
这里进行修改你的最新一次提交的备注,然后保存退出。
注意对比修改前后commit的hash值变了。说明git给重新生成了一个commit。
2、对历史上的多个commit进行修改,dd执行 git rebase -i HEAD~2
将要修改的 commit 前边的 改成 edit
保存退出:
执行 git commit --amend 可以修改注释
再继续修改下一个commit要执行 git rebase --continue
3、删除某个commit
执行:git rebase -i HEAD~2
直接删除掉不想要的commit那一行再保存即可。
注意:要至少保留一行哦!否则都生效。
4、多个commit合并为一个commit
假如你最近的这两个commit 要合并成为一个commit,执行:
git rebase -i HEAD~3 记住往前要多增加一个commit 。
然后将你想合并的commit 前边变成 squash,保存后添加合并后的注释,就会自动将其保存为一个commit。
5、好几天的代码一次性commit了,如何进行拆分?
git rebase -i HEAD~3 将你想改的那个commit 前边变成 edit
再执行 git reset HEAD^ 就会回退回去了
也可以直接使用
git reset --hard HEAD^
然后再一点一点的提交,使用命令:
git add 文件名
5、对本地做出的修改、暂存和提交进行撤回
对于比较少的文件修改执行 git checkout 文件名
对于修改了很多的文件,直接执行 git reset --hard HEAD
参数--hard,直接把工作区的内容也修改了,不加 --hard 的时候只是清除了暂存区,不影响工作区。
6、远程和本地同时撤回本地远程分支合并操作
1、当执行merge操作时候,发生了冲突,不想merge了,该怎么办?
执行命令:git merge --abort
注意:合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态。
2、当merge已经执行成功了,但是想回退,怎么办?
git reset --hard HEAD^
3、如果merge 成功并且推送到远程仓库,那么想回退怎么办?
首先在你想回退的分支本地执行 git revert -m 1 HEAD
这个不是说指针回退而是重新创建了一个新的commit,这个新的commit对应的版本跟之前合并之前的commit是一样的。
然后执行 git push origin master 这就可以将远程的分支进行回退版本了。
4、当过一段时间,你还想把之前的版本重新merge到master,这个时候你会发现master执行merge已经没用了,此时该怎么办呢?
1、git rever HEAD 回退到merge之后的状态。
2、再次执行merge合并feature/001的代码到master
3、然后执行push
git push origin master
7、二分查找定位commit的线上bug
1、首先开启二分查找
git bisect start 或者 git bisect start [终点提交hash值] [起点提交hash值]
2、标注当前的commit 是有bug的
git bisect bad hash值
3、可以用tag来标注某个tag或者commit hash值之前是好的
git bisect good [tag值]/[hash值]
表示说1.0 tag版本之前是好的。
4、查看当前的版本是否有bug,如果没有bug,执行 git bisect good,会继续进行二分查找。
5:测试到此时,执行测试代码进行bug复现,发现bug找到了,执行git bisect bad.
6: 以此类推,直到找到最后一个commit,认为就是这个commit开始引入的bug。
7:执行 git bisect reset 恢复之前的状态
8、团队拆分迁移项目时简化提交历史
场景:
之前的项目现在要拆成两个项目,供给两个团队使用。有个注意事项就是把之前的提交历史给抹掉,让新团队接受的代码只有初始化的提交历史。
步骤:
1、创建一个项目wileeProject2
2、清空提交历史 git rebase --onto A B C。
echo '基于当前commit hash创建一个不在当前分支上的一个新的commit' | git commit-tree 基准commit的hash^{tree}
git rebase --onto A B C
低阶命令:echo '合并历史数据通过之前的项目' | git commit-tree 基准commit的hash^{tree}
(下面涉及的命令详解在Git内幕原理中)
命令作用:
基于当前hash的commit提供的树对象创建一个新的commit,此commit不属于任何分支,然后返回新的提交对象id到控制台。
命令:git branch -r --contains COMMIT_ID
命令作用:
此命令用于查看commit_id属于哪一个分支。
命令:git rebase --onto A B C 中ABC三者代表的含义:
A : 是一个分支名称(代表此分支的 HEAD)或者是一个 commit_id (此 id 不在 C 上)
B : 一个分支名称(此分支与 C 有共同的祖先 commit)或者是一个 commit_id (此 id 在 C 上)
C : 一个分支名称
命令的作用:
1、首先会执行 git checkout 切换到 C分支上面
2、将 B 到 C(HEAD) 之间所标识范围内的提交写到一个临时文件中 ,若B 为分支名称,则找 B 与 C 共同的祖先 commit,为此次 commit 到 C(HEAD) 之间所标识范围内的提交。
3、将当前分支强制重置(git reset --hard)到 A
4、从2中临时文件的提交列表中,一个一个将提交按照顺序重新提交到重置之后的分支上
3、推送到远程项目wileeProject2
git remote remove origin
git remote add origin git@192.168.31.38:root/wileeproject2.git
9、如何将新版本的功能放到上一个版本提前上线
git cherry-pick feature/002 29a3c4c
其中29a3c4c这个commit hash值就是 feature/002分支中的一个commit hash值。
该命令意思:
将代码某个commit转移到另一个分支