Git-看这篇就够了
懵逼的开始
首先Git要想pull和push代码是要给gitLab或者GitHub你电脑的SSH Key的
我擦,懵逼了。我怎么给他SSH Key呢 别急!我手摸手教你
生成SSH密钥过程
1.查看是否已经有了ssh密钥:cd ~/.ssh 如果没有密钥则不会有此文件夹,有则备份删除 2.生存密钥:
$ ssh-keygen -t rsa -C “xxx@163.com”
按3个回车,密码为空,再次查看.ssh文件中得到了两个文件:id_rsa和id_rsa.pub 其中id_rsa.pub就是我们要使用的那个,复制里面的全部内容,粘贴给gitLab或者GitHub
Clone代码或者Push代码
工作中有两种情况
1.我是小喽啰,代码已经在Git仓库上了 这种情况下我只要找个干净的目录(为啥是要干净的呢,我怕你把xx老师的文件一起push上去),打开命令行工具,cd 到这个目录下
git clone 'git@github.com:lets-blade/blade.git'
项目就下载下来了
2.我是架构师,代码的原型还在我的电脑上呢。还没有进行Git管理呢
这种情况下,我要自己去GitLab或者GitHub上创建仓库,然后到你的项目的根目录下
git init #初始化
git status #获取状态
git add . # .或*代表全部添加或者-A
git commit -m "message" #将内容提交,在冒号里面最好填写英文注释
git remote add origin git@github.com ##此时本地工程与远程仓库已经建立了联系
git push -u origin master #将本地的内容同步到远程仓库中(要确认你的新建目录下有东西,git允许将空目录同步到远程)
忘记配置.gitigore
如果不配置.gitignore的文件,带push代码的时候就会把一写不必要的文件push到远程仓库,如.idea文件。如果不小心出现此文件在远程仓库可以通过一下步骤delete此文件:
1.配置.gitignore文件(新建/编辑)
*.iml
.gradle
/local.properties
.DS_Store
/build
/captures
.externalNativeBuild
.idea
2.将.gitignore文件上传到远程仓库
git pull
git add .gitignore
git commit -m 'edit .gitignore'
git push origin master
3.删除git的.idea文件
git rm --cached -r .idea //只针对某个目录的文件
git rm -r --cached . //清理全部
4.同步到远程仓库
git add .
git commit -m 'delete .idea'
git push origin master
工作中如何管理代码
作为架构师,哈哈,不能让小弟们乱改代码,然后随意提交,万一哪个实习生把代码提交了,然后不管了。就去约会小女友了。后面的人下载代码都是一堆冲突。这种情况我就要展示我的管理代码的超能力了,不吹了
查看目录下的远程地址
git remote -v
一般工作中我们都要有几个分支,
1.master #主分支
2.dev #开发分支
3.release #上线打包的分支 我的习惯是每次上线我都要建一个对应版本的分支 比如 release-1.0.1 防止今天上线明天要修改bug,我就可以在这个分支上修改然后打包。等下个版本上了后我就会把之前的删掉。
4.fix-bug #开发中有的bug需要有人去解决,我就会拉一个分支出来修改。然后在合拼会dev中
使用git stash命令保存和恢复进度
git stash
保存当前工作进度,会把暂存区和工作区的改动保存起来。执行完这个命令后,在运行git status命令,就会发现当前是一个干净的工作区,没有任何改动。
git stash save 'message...'可以添加一些注释
git stash list
显示保存进度的列表。也就意味着,git stash命令可以多次执行。
git stash pop [–index] [stash_id]
git stash pop 恢复最新的进度到工作区。git默认会把工作区和暂存区的改动都恢复到工作区。
git stash pop --index 恢复最新的进度到工作区和暂存区。(尝试将原来暂存区的改动还恢复到暂存区)
git stash pop stash@{1}恢复指定的进度到工作区。stash_id是通过git stash list命令得到的
通过git stash pop命令恢复进度后,会删除当前进度。
怎么建分支呢
假设我现在在master分支上:
git checkout -b dev
那么通过这行命令,我就在本地新建了一个dev分支;
接下来,如何将该分支推送到远程,不推到远程,小弟们怎么在dev上写代码呢
git push -u origin dev
这样,其他人通过
git fetch origin
git branch
这条命令就能在本地看到dev分支了
获取远程更新,就可以下载clone该条分支的代码,然后合作开发一些东西了
将远程分支dev 获取到本地 dev
git checkout -b dev origin/dev
怎么提交代码呢
回家四部曲
git add .
git commit -m 'fix 一大堆bug'
git pull
git push
怎么解决冲突的代码呢
你以为四部曲走完就能下班回家陪女友吗,天真了,代码冲突了!!!
当你提交代码前都会去pull一下别人提交的代码,除非你在别人前提交,然后隔壁工位上的那个队友4点钟就开始等着提交代码了。
关于代码冲突这里我们需要先了解一个命令 reset
有的时候我想看之前的某个版本,工作中很常见的情况就是我在之前的版本删除了某个文件。现在我想把它找回来。
git log 或者 git reflog 查看commit_id
我喜欢用git reflog 它可以查看到我们的每一次的提交log ,git log 不好的地方是他看不到版本回退后的commit_id ,比如我reset后关闭窗口,那就Git log 就看不到reset后的log了
git reset –hard commit_id 去到过去的某个版本,把我想要的文件拿出来后,在继续git reset –hard commit_id 到最新的版本。这样就可以在历史版本之间穿梭咯
git reset commit_id 可以对已经git add 和 git commit 的版本进行,完成Commit命令的撤销,但是不对代码修改进行撤销,可以直接通过git commit 重新提交对本地代码的修改。
如何撤销已经提交的代码
首先,通过git log查看提交信息,以便获取需要回退至的版本号:
然后,通过git reset --soft <版本号>重置至指定版本的提交,达到撤销提交的目的:参数soft指的是:保留当前工作区,以便重新提交
git reset --soft aa909cff2239536df14820fe086d96305b24e9f1
然后,通过git log确认是否成功撤销,
通过git push origin master --force强制提交当前版本号,以达到撤销版本号的目的:
git push origin master --force 这里需要注意一个地方就是master,你要看你看看你在哪个分支上,必须添加参数force进行强制提交,否则会提交失败,报错原因:本地项目版本号低于远端仓库版本号。
最后修改代码,重新提交和推送
如何比较diff
当前还没有提交代码,但是我想喝上次提交的代码做个比较
git diff HEAD
我想本次提交的代码和上次提交的代码做个比较
git diff HEAD^ HEAD
我想和某次提交的代码作比较
git diff SHA1 SHA2
那么如何删除一条本地分支和其对应的远程分支了
首先删除本地分支
git branch -d release-1.0.1 #就删除了本地的release-1.0.1分支
那么接下来删除其对应的远程分支:
git push --delete origin release-1.0.1
将dev分支上的代码合并到master上
版本上线后,我们要把之前的版本合拼到master分支上,然后打个tag。以防老板要回滚到某个版本
git checkout master #先切换到master分支上来
git merge --no-ff -m "合并版本1.0.1" dev
打标签操作
git tag v1.0.1 #即打了一个v1.0.0的标签.
tag是对历史一个提交id的引用,如何老板要回滚到之前的版本,
那就可以用tag命令来切换到目标版本
git checkout v1.0.1
切换到tag历史记录会处在分离头指针状态,这个修改是很危险的,
在切换回主线时如果没有合并,之前的修改提交基本都会丢失,如果需要修改可以尝试
git checkout -b test tag #创建一个基于指定tag的分支
推送本地分支tag到远程
git push origin --tags
git tag -d v1.0.1 #删除一个本地tag
git push origin --delete tag v1.0.1 #删除远程tag
也可以这样删除远程分支
git push origin :refs/tags/v1.0.1