Git相关指令的使用

git命令解释的官方链接

https://git-scm.com/docs/

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模式 回滚的最后一个版本的代码在工作区和暂存区都不存在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值