https://git-scm.com/book/zh/v2https://learngitbranching.js.org/
git reset通过把分支记录回退几个提交记录来实现撤销改动。但是这种方法对大家一起使用的远程分支是无效的。需要使用git revert。
git reset HEAD~1 git revert HEAD适用于bufFix中有多个无效提交记录(比如打印debug日志),我们只需要取一个提交记录到主分支上即可。
git rebase -i 和 git cherry-pick均可实现。
tag可以指向某个提交记录的标识,比如软件发布新的大版本,或者修正一些重要的bug或者是增加了某些新特性。
git tag v1 C1用于帮助你在提交历史中移动了多次后找到方向。
# 语法: git describe <ref> # <ref>是任意能被git识别成提交记录的引用,如果你没有指定的话,git会以你目前所检出的位置(HEAD)。 # 输出结果: <tag>_<numCommits>_g<hash> # tag表示离<ref>最近的标签,numCommits表示这个ref和tag之间相差有多少个提交记录,hash表示你所指定的ref所表示的提交记录哈希值的前几位。当ref提交记录上有某个标签时,只输出标签名称。使用git checkout HEAD^1中的^符号可以指定第几个父节点。 而且^和~操作符支持链式操作:
git checkout HEAD~1^2~3当远程仓库(虚线)更新了C2和C3两次提交时,本地仓库可以通过git fetch将C2和C3更新下载到本地仓库,同时本地的o/master分支也会更新。
需要注意的是,此时本地的master分支并不会更新。也就是git fetch并不会更新本地的master分支,只会更新本地的o/master指针。
image.png更新前:
image.png更新后:
image.png相当于先git fetch获取远程仓库o/master更新后merge到本地的master分支上。
注意当本地分支和远程分支有分歧时也可以使用。
image.png举个例子,当你完成自己的功能开发后,你的同事写了一堆提交并且改变了许多你功能中使用的API,这些改变使得你新开发的功能不可用,但是他已经将代码推送到远程仓库上了。此时如果git是不会允许你执行git push的,你只能先合并远程最新的代码,然后才能提交你的工作。
git fetch git rebase o/master git push另外,我们也可以使用merge:
注意,使用rebase相比于pull可以使得提交历史更简洁。
使用前本地master和远程master有分歧
image.png 使用pull时: 本地master同步远程master的更新本地的o/master更新和远程master一致 image.png 使用fetch和rebase时:首先fetch更新o/master远程分支
image.png其次rebase会将C3的改变加在o/master上
image.pnggit pull --rebase是fetch和rebase的缩写。
本地开发了多个功能,全部开发完成
image.png 更新o/master分支 git fetch 将不同功能rebase到o/master分支上 git rebase o/master side1 git rebase side1 side2 git rebase side2 side3 image.png 更新本地master分支并上传到远程仓库 git rebase side3 master git push 相同的工作用merge完成注意,使用rebase可以让你让你的提交历史更加干净,但是缺点是你会丢失你的部分提交历史,虽然我个人感觉是意义不大的提交历史(在快速迭代开发中)。仁者见仁,智者见智。
image.png git checkout master # 回到本地master分支 git pull # 更新本地master分支 git merge side1 git merge side2 git merge side3 git pushmaster和o/master分支是相互跟踪的,是在我们克隆远程仓库时指定的。
# 法1: git checkout -b totallyNotMaster o/master # 法2: git branch -u o/master totallyNotMastergit pull不带任何参数就是fetch和merge的组合,首先更新本地的远程分支,然后再merge你抓取到的提交记录。
即git pull origin foo相当于:
git fetch origin foo git merge o/foogit pull origin bar~1:bugFix相当于:
git fetch origin bar~1:bugFix git merge bugFix需要注意的是,git pull更新的是我们的检出位置,而不是一定更新本地master分支。
比如在pull之前,我们的HEAD在本地分支bar上:
image.png当我们使用git pull之后:
git pull origin master image.png