git命令解释的官方链接
https://git-scm.com/book/zh/v2
git 运行shell脚本
在windows安装了git以后是可以运行shell脚本的,因为git集成了cygwin的Linux模拟器,因此可以运行绝大多数的Linux命令
git命令总结
更新本地的最新远程分支映射:git remote update origin --prune
git本地分支回滚
git reset --hard commit_id;
git reset --hard HEAD~3 【回滚近三次的提交】,数字从0开始,0表示当前提交
git reset --hard origin/master 回滚到和远程master分支一致
git远程仓库分支回滚--自己的远程分支
git reset --hard commit_id //1,首先回滚本地分支
git push -f //2,强制推送到远程分支,
注意本地分支回滚后,版本将落后于远程分支,必须使用强制推送覆盖远程分支,否则无法远程推送
git reset --hard 恢复被删除的commit(本地回滚了并且远程仓库也回滚了)
使用git log查询也只能查询到回退版本本身及之前的提交记录。
解决办法是通过git reflog来查看先前的记录并恢复,因为git reflog记录了所有HEAD的历史,也就是当你做了reset,checkout等操作的时候,这些记录也会被记录到reflog中
git reflog可以查看到reset hard的提交记录【此时HEAD显示为reset hard的commit id】,我们只需要回滚到前一个版本即可
git reset --hard commitId(这个id为reset hard之前一个commit id)
注意,当因为reset操作丢失一个提交的时候,我们一般总是可以找回,除非我们的操作太过久远(一般30天以后),那时我们的操作已经被当成垃圾处理了。
https://www.cnblogs.com/mliudong/archive/2013/04/08/3007303.html
git远程仓库分支回滚--公共的远程分支
假如A和B程序员都分别在featureA和featureB分支上同时进行开发,并且将他们的代码都合入master分支上并提交到远程master分支上,此时远程master分支上的commit版本顺序是A1-A2-B1,A和B组员分别提交了2次和1次,那么如果A程序员发现A2提交发现出现了问题,然后将master远程分支回滚到A1的提交状态,并且如果没有在理想状况下【即B队员重新git pull】则B队员的本地master分支会存在下面提示:
也就是说B队员的master本地分支领先远程分支2次提交,B队员如何做才能补救?
补救方法如下:
git checkout featureB //首先切回到自己的分支上
git reflog //查找到最新的commitId,即B程序员的
git
https://www.cnblogs.com/Super-scarlett/p/8183348.html有详细解读回滚教程
git本地分支回滚-丢失代码-如何找回丢失的代码
假设程序员A一周在本地分支上提交了6次,分别是feature1,feature2....feature6,然后发现feature2有问题,回滚的时候使用--hard,回滚到feature1版本,即操作git reset --hard feature1_commitId,此时feature2到feature6的分支全部丢失,之后又提交了feature7。之后发现feature2提交的代码没有问题,但是feature2到feature6的分支全部丢失了怎么办,如何找回feature2-6所有代码并且保留7的代码
操作方式如下:
git reset --head cd52afc //第一步,强制回滚到feature6,cd52afc是feature6的hash值,此时feature2到feature6的代码全部恢复了
git cherry-pick 4c97ff3 //cherry-pick feature7,期间可能会有冲突,之后feature7commit的信息丢失,但是会新的feature7-merge的commit版本产生,如下图所示:
使用git命令而不是IDE从远程仓库拉取dev分支
说明:当项目刚开始开发的时候,一般不是直接建立master分支,而是从开发分支feature-dev开始,当直接用New-》Project from version control从远程版本库拉取分支,但由于master分支为空的时候(但dev分支上存在代码的),IDE会让生成一个新spring-boot项目,这样就会出现问题。
此时使用git命令可以很好的解决这个问题:
1.mkdir xx //在当前目录生成一个新目录
2 cd xx //进入该目录
3 git init //初始化.git
4 git remote add origin xxx.git //和远程仓库建立连接
5 git pull origin feature-dev //从远程仓库拉取所需分支
git冲突内容
<<<<<<<head 到 =======里面的内容是本地的commit的内容
=========到 >>>>release20181120里的内容是从远程分支pull下来的内容
git远程分支的三种状态
- 远程仓库确实存在分支dev
- 本地版本库(.git)中的远程快照
- 和远程分支建立联系的本地分支
git相关指令
git init
在删除.git文件夹以后可以重新生成.git文件夹
git remote
git remote -v
可以查看当前可提交的远程仓库url,例如
在.git/config文件中origin的url是
git remote add origin url
此url即https://xx/yy.git形式,表示仓库的网络位置
git remote update remote --prune
git remote prune
prune的英文是修剪,在git命令中表示Deletes all stale remote-tracking branches under,即会清理掉状态2中的远程库已被删除,本地库仍存在的 stale 远程分支快照.
假设如果在远程仓库中删除某一分支dev,但是本地版本库中依旧会存在dev分支的快照,git remote prune会和远程仓库进行进行同步,删除本地本地版本库中dev的快照,但是不会删除本地仓库中的dev分支
git remote fetch
git remote set-url origin url
git branch
git branch -a表示查看本地和远程的所有分支,红色表示远程分支
git branch -d xx 表示删除本地的某个xx分支,如果加上-r表示删除远程的某个分支
git branch -m old new 将某个分支重命名为new分支 【有疑问】
git checkout
checkout命令用于切换分支或者回复工作树文件
git checkout xxx_branch //切换到xx_branch分支
git checkout -b new_branch //产生并切换到new_branch分支
git log
git log 直接显示此版本的所有提交信息,在:中输入enter键,则一直往下滚动上次的版本提交信息,按Q键可以退出滚动状态
git log 显示的<><><><><><><><>这些表示提交的备注信息,备注信息一般只有英文才会正常显示,中文会显示成<><><>
git log --pretty=oneline 表示只显示版本号和备注信息
git reflog
git reflog 会显示所有之前的git操作,不仅包括commit,还包括reset以及checkout等操作
显示的内容包括commit的hash值:HEAD{xx}:commit的备注信息,如图所示
git cherry-pick
此命令的主要作用是将你某个分支的某次改动并提交的代码xxx合入到当前分支中
git cherry-pick xxx
git status
git revert
git revert可以回滚某次提交代码,也可以批量回滚连续几次提交代码
回滚某次提交代码 git revert commitid;
批量回滚某几次提交代码:git revert --no-commit commit1 commit2 原则是前开后笔闭,即commit1不会回滚,commit2会被回滚。
但是当revert的提交不是最后一次提交,那有可能会产生冲突,解决办法:
1.手动解决冲突(idea需要在冲突文件上点击下,才会显示冲突标志)
2.git add 冲突文件
3.git revert --continue;
在添加冲突文件的时候,会存在问题:fatal pathspec xx did not match any files 网上说.gitignore包含该类型文件,要不就是本地不存在改文件,但是都不属于这两种情况,通过Idea图形界面可以add
git rebase
比如rebase,你自己开发分支一直在做,然后某一天,你想把主线的修改合到你的分支上,做一次集成,这种情况就用rebase比较好.把你的提交都放在主线修改的头上
如果用merge,脑袋上顶着n个commit的merge,你如果想回退你分支上的某个提交就很麻烦,还有一个重要的问题,rebase的话,本来我的分支是从3拉出来的,rebase完了之后,就不知道我当时是从哪儿拉出来的我的开发分支
同样的,如果你在主分支上用rebase, rebase其他分支的修改,是不是要是别人想看主分支上有什么历史,他看到的就不是完整的历史课,这个历史已经被你篡改了
rebase和merge功能是相似的,假设目前master分支有m1-m2,然后A程序员在m2分支上继续开发,提交产生m3分支,之后B程序员从m2拉出一个分支dev,分别进行了dev1-dev2-dev3的commit,
然后B用户rebase master,则B用户的提交历史变成了m1-m2-m3-dev1-dev2-dev3
注意:公共分支master是不能rebase的
git reset的三种模式
git reset可以分为三种模式hard,mixed(也是默认的模式),soft模式
三种模式的区别:
--soft,使用这种模式,回滚的最后一个版本的代码会在暂存区以及工作区都存在。
--mixed模式 使用这种模式,回滚的最后一个版本的代码会在工作区存在,但是在暂存区不存在。
--hard模式 回滚的最后一个版本的代码在工作区和暂存区都不存在。