git基本总结
看了几次git,都没有很好的使用,不久就忘记了,为了方便自己,加深记忆,在这里总结一下,毕竟自己的东西看的懂。
借用一下别人的图:
注释 | 命令 | 备注 |
---|---|---|
初始化 | init | 在本地的当前目录里初始化git仓库,第一次建立仓库,要ssh对接的自己的仓库 |
clone 地址 | 从网络上某个地址拷贝仓库(repository)到本地,在.git里保存了自己或者其他源仓库的信息,直接push/pull | |
查看当前状态 | status | 查看当前仓库的状态。碰到问题不知道怎么办的时候,可以通过看它给出的提示来解决问题 |
查看不同 | diff | 查看当前状态和最新的commit之间不同的地方 |
diff 版本号1 版本号2 | 查看两个指定的版本之间不同的地方。这里的版本号指的是commit的hash值 | |
添加文件 | add -A | 这算是相当通用的了。在commit之前要先add |
撤回stage的东西 | checkout -- file/. | 这里用小数点表示撤回所有修改,在-- 的前后都有空格 |
提交 | commit -m "提交信息" | 提交信息最好能体现更改了什么 |
删除未tracked | clean -xf | 删除当前目录下所有没有track(追踪)过的文件。不管它是否是.gitignore文件里面指定的文件夹和文件 |
查看提交记录 | log | 查看当前版本及之前的commit记录 |
reflog | HEAD的变更记录 | |
版本回退 | reset --hard 版本号 | 回退到指定版本号的版本,该版本之后的修改都被删除。同时也是通过这个命令回到最新版本。需要reflog配合 |
2.个人使用远程仓库
行为 | 命令 | 备注 |
---|---|---|
设置用户名 | config --global user.name "你的用户名" | |
设置邮箱 | config --global user.email "你的邮箱" | |
生成ssh key | ssh-keygen -t rsa -C "你的邮箱" | 这条命令前面不用加git (window在~目录下生成) |
添加远程仓库 | remote add origin 你复制的地址 | 设置origin |
上传并指定默认 | push -u origin master | 指定origin为默认主机,以后push默认上传到origin上 |
提交到远程仓库 | push | 将当前分支增加的commit提交到远程仓库 |
从远程仓库同步 | pull | 在本地版本低于远程仓库版本的时候,获取远程仓库的commit |
命令解释
- changes to committed 提示语 表明可以commit提交到本地库中
- git restore file 回撤未add的文件
- git rm --cached file 表示从缓存移除文件
- tracked 追踪 表示被添加到缓存中的文件被索引
- git diff 默认跟最新的commit比较 红色-表示删除 +绿色表示添加
- git ckeckout -- file 撤销改变
- git gc 删除.git 的镜像文件
- git rebase -i 版本号 ^ 修改注释
- git branch -a 查看远程全部的分支,白色的表示本地有的,红色的表示本地没有,仅在远程存在。
- git push origin branch1:branch2 注意:将本地分支branch1推到远端的branch2操作步骤
- git branch -D/-d分支 删除分支
- git push origin --delete 分支 删除远程分支
- git stash 储藏更改:将当前更改的代码储藏起来,等以后恢复使用
- git stash pop //恢复的同时把stash内容删掉 ,恢复储藏的代码 或者 git stash apply 恢复stash,但是stash内容并不删除
- git stash drop 在上面操作的基础上,以此来删除stash
- git stash list 查看全部的stash列表
- git stash clear 将stash空间清空
- git stash pop 和 git stash apply 区别
- 原来git stash pop stash@{id}命令会在执行后将对应的stash id 从stash list里删除,
- 而 git stash apply stash@{id} 命令则会继续保存stash id。
4.版本回退
--soft – 缓存区和工作目录都不会被改变
--mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
--hard – 缓存区和工作目录都同步到你指定的提交,工作目录受影响
git reset --hard 版本号 (取版本号前7位就可以了)
git reset 版本号/HEAD^/HEAD~2
git reflog 查看版本 可以回到最新的版本 通过reset 可以查看历史commit log不可以查看删除的commit
www.cnblogs.com/schaepher/p/5561193.html
命令 | 作用域 | 常用情景 |
---|---|---|
git reset | 提交层面 | 在私有分支上舍弃一些没有提交的更改,删除回退 |
git reset | 文件层面 | 将文件从缓存区中移除 |
git checkout | 提交层面 | 切换分支或查看旧版本,查看以前版本,不回退 |
git checkout | 文件层面 | 舍弃工作目录中的更改 |
git revert | 提交层面 | 在公共分支上回滚更改 将回退版本新增在前面 |
git revert | 文件层面 | (然而并没有) |
https://www.cnblogs.com/houpeiyong/p/5890748.html
5.Git版本恢复命令reset和revert
一. 本地commit错误没有push到远程仓库
reset命令有3种方式:
git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,保留工作区源码,回退commit和index信息
git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
二. 如果我们某次修改了某些内容,已经commit到本地仓库,而且已经push到远程仓库了
这种情况下,我们想把本地和远程仓库都回退到某个版本,该怎么做呢?
前面讲到的git reset只是在本地仓库中回退版本,而远程仓库的版本不会变化
这样,即时本地reset了,但如果再git pull,那么,远程仓库的内容又会和本地之前版本的内容进行merge
这并不是我们想要的东西,这时可以有2种办法来解决这个问题:
1.直接在远程server的仓库目录下,执行git reset –soft 10efa来回退
2.在本地直接把远程的master分支给删除,然后再把reset后的分支内容给push上去,
以上2种方法可以回退远程分支的版本,但这2种方式,都挺危险的,
一,对于已经push的版本,进行回退
1、第一步:
git reset --hard 版本号 //本地回退到指定的版本
2、第二步:
git push -f origin dev //将远程的也回退到指定版本
本地同步远程删除的分支
git fetch origin -p //用来清除已经没有远程信息的分支,这样git branch -a 就不会拉取远程已经删除的分支了
二,删除掉没有与远程分支对应的本地分支
从gitlab上看不到的分支在本地可以通过git branch -a 查到,删掉没有与远程分支对应的本地分支: git fetch -p
三、查看远程库的一些信息,及与本地分支的信息
git remote show origin
三. git revert
对于已经把代码push到远程仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令
revert
git revert用于反转提交,执行revert命令时要求工作树必须是干净的.
git revert用一个新提交来消除一个历史提交所做的任何修改.
revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
看似达到的效果是一样的,其实完全不同.
第一:
上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会.
第二:
如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.
第三:
reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.
https://blog.csdn.net/lindexi_gd/article/details/52554159
总结:
1.初始化仓库时,本地仓库没有保存远程仓库的信息,所以要 remote add origin + 地址 在push -u origin master(分支),其中就保存了远程仓库的信息(ssh对接的仓库),如果远程仓库版本高,需要pull origin master(分支)
2.clone 后保存了远程仓库信息,直接push (提交管理员审核)
3.本地版本需要和远程同步,只能比远程的版本多个版本,才可以提交,不然会有冲突(需要远程仓库回退到相同的版本,才可以提交)
4.git pull origin master
fatal: refusing to merge unrelated histories
在Github新建一个仓库,把本地东西上传。这时会发现 github 的仓库和本地的没有一个共同的 commit 所以 git 不让提交,认为是写错了 origin ,如果这个 origin 就可以使用 --allow-unrelated-histories 告诉 git 自己确定
遇到无法提交的问题,一般先pull 也就是使用 git pull origin master 这里的 origin 就是仓库,因为两个仓库不同,发现 git 输出 refusing to merge unrelated histories 无法 pull 内容
因为他们是两个不同的项目,要把两个不同的项目合并,git需要添加一句代码,在 git pull 之后,这句代码是在git 2.9.2版本发生的,最新的版本需要添加 --allow-unrelated-histories 告诉 git 允许不相关历史合并
假如我们的源是origin,分支是master,那么我们需要这样写git pull origin master --allow-unrelated-histories
这个方法只解决因为两个仓库有不同的开始点,也就是两个仓库没有共同的 commit 出现的无法提交。