平时开发 Git 常用的小技巧
git的基本操作流程
工作区(WORKING DIRECTORY): 直接编辑文件的地方,肉眼可见直接操作;
暂存区(STAGIN AREA):数据(快照)暂时存放的地方;
版本库(GIT DIRECTORT(RESPOSITORY)):存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程git仓库
git head 的理解
每次都会指向最新的提交:这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交
git常见的回滚场景
git checkout .
将本地编辑区的内容会滚,如果执行过git add . 则git checkout .回滚不再生效,需要调用 git reset 命令;同时git checkout branchXX 切换分支;
回滚一次分支合并:发现冲突太多,如何还原到之前版本;
git reset --hard xxxid 来还原到合并之前的状态
回滚一次git add .,撤销一次的本地提交
git reset HEAD 会滚当前最新的版本ID,此时相当于会滚add 操作
此时 git checkout . 就可以将所有的编辑会滚掉,如果具体想处理某一个文件,可以加上文件名;
回滚一次提交(本地&远程仓库)
git reset --hard e310e8773f9e3aa0c32a717dd93c5d18c6e81c60
git reset --hard FETCH_HEAD
git reset --hard 70a56a5
回滚到上一次分支的内容
git reset HEAD~1 默认模式是混合模式 —mixed;HEAD~N 会滚到N次之前;
reset 的三个关键参数:soft & hard & mixed
1.Soft 会将回滚的内容保留在工作区目录 & 所有的在original HEAD和你重置到的那个commit之间的所有变更集都放在stage(index)区域中,你可以重新编辑,然后在提交;此时输入命令 git checkout . 不会回滚编辑区的代码;
2.Hard:会直接回滚到之前的head id对应的状态,提交的内容不会保存到工作区和暂存区:这是一个比较危险的动作,具有破坏性,数据因此可能会丢失
3.mixed:--mixed是reset的默认参数,也就是当你不指定任何参数时的参数。
它将重置HEAD到另外一个commit,并且重置index以便和HEAD相匹配,但是也到此为止。working copy不会被更改。所有该branch上从original HEAD(commit)到你重置到的那个commit之间的所有变更将作为local modifications保存在working area中,(被标示为local modification or untracked via git status),但是并未staged的状态,你可以重新检视然后再做修改和commit
此时输入命令 git checkout . 回滚
git revert
创建新的提交来撤消提交。这是撤消更改的安全方法,因为它没有机会重新编写提交历史记录。例如,下面的命令将计算出第二次提交到最后一次提交中包含的更改,创建一个新提交来撤消这些更改,并将新提交附加到现有项目中。
git rebase 如何做
https://baijiahao.baidu.com/s?id=1633418495146592435&wfr=spider&for=pc
1.变基:git rebase -i HEAD~3
命令会在你默认的编辑器中打开最近三次的commit历史,-i表示用交互式打开;编辑器中显示了最经三次的历史,三个pick comit哈希。修改这个文件,我们可以告诉git修改历史记录。当我们保存推出编辑器时,git将从其历史记录中删除所有这些提交,然后一次执行每一行。默认情况下,会使用(pick)每个提交,并将其添加到分支。现在我们使用fixup,修改将操作从"pick"修改为"fixup"并在我们想要"fixup",移动到"添加two"commit的前面
2.将几个提交合并成一个
先我们要将所有这些更改压都合并为一个commit,要实现这个目的,只需将每个"pick"操作更改为"squash",第一行除外,
优雅的利用git stash
git stash的作用是把工作区(必须是工作区中已经被git追踪到的文件)和索引中的内容暂时存到一个堆上。而且这个堆是和分支不相关的。切换分支后,依然可以看到并使用。
暂时不想提交的,可放入stash里,等切换分支之后,在pop出来!有时候自己在某一个分支开发功能,突然有个需求 需要在这个分支上单独开发,或者某一个小改动点需要提前提交到分支上,但是现有修改不想全部提交上去,这时候可以调用stash暂存起来,虽然平时用的不多,但是特定场景,还是很方便。
常用命令
(1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
(2)git stash list :查看stash了哪些存储
(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
(8)git stash clear :删除所有缓存的stash
注意:没有在git 版本控制中的文件,是不能被git stash 存起来的,需要先执行下git add 加到git版本控制中,然后再git stash就可以了
git log & git reflog & git status
git log & git log 命令可以显示所有提交过的版本信息
git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
git log --pretty=oneline
git reflog --pretty=oneline
git fetch & git pull
pull = git fetch origin + git merge origin/master
Idea changList 功能
将本地文件,或者不同业务功能的修改分开提交,不提交的内容changeLis中,有些场景比较好用,比如本地一些修改,不想提交到生产环境的一些配置,只在本地修改调试用;
修改已提交记录的备注
git commit -a --amend
修改gitignore 文件,立马生效
git rm -r --cached . //清除缓存
git add . //重新trace file
git commit -m "update .gitignore" //提交和注释
git push origin master //可选,如果需要同步到remote上的话
版权声明: 本文为 InfoQ 作者【zui.zhang】的原创文章。
原文链接:【http://xie.infoq.cn/article/de2fea062e9f6cfc28d032ca0】。文章转载请联系作者。
评论