说来惭愧,虽然身为一个低端的android码农,但是我一直很害怕使用git,原因是进入工作后一直是一个人开发,刚开始接触git时,由于不知道什么是gitignore文件,导致将apk包提交推送上去了,也不知道为啥,后来一直就推送远端失败,结果我就一用硬盘保存我写的代码。再后来,新开了一个仓库,但是一个人也就随便用用 add ,commit和push这三个方法,直到今年的二月下旬,我终于忍不了了,下决心想学会git的命令。学完后,向众位大佬学习,写一篇文档,记录一下使用git的方方面面,以便于遗忘了进行查找。
git的历史大家随便百度就能知道,过去不会的时候感觉为啥会有git这个东西,现在稍微会了一些,感觉确实方便了不少。下来我来记录我学到的和常用的命令。
首先给大家推荐一个b站上的将git命令的课,这个课我觉得是讲的很详细的,我也是跟他学的,大家可以看看视频地址
配置用户名和邮箱
git config --global user.name "用户名" 配置或修改用户名
git config --global user.emal "[email protected]" 配置或修改邮箱
git config --list 查看配置项
git config user.name 查看用户名
git help 查看git帮助
git config --global --replace-all user.name “你的用户名” 修改你的用户名
git config --global --replace-all user.email “你的邮箱” 修改你的邮箱
其中,当输入--list的时候会发现git还停留在:这个状态,这个时候我们按回车键,会一直显示未显示的下一行,当出现(END)的时候我们按q就可以了,当然也可以直接按q,这样就退出了。
管理git项目
git init 生成.git文件 ,被git管理
git init [name] 如果加上文件名 则是先创建一个文件名,然后在生成.git文件
git add [filename] 添加文件被追踪,添加到暂存区
git add . 添加所有文件被追踪,添加到暂存区
git status 查看文件的状态
git commit -m “描述”
git commit -am 相当于 add. + -m
每次commit的时候都会生成一个版本。
当时用git status 查看状态的时候,只要文件有被更新过或者新创建一个文件,那就会显示出来,如果文件没有被add .,就会显示untracked files 该文件未被追踪 。
当时用git add 后在查看状态,就会变成 文件就会变色
当被commit 后, 会显示 master(提交的分支) , root-coomit (第一次提交),0c5ae36(版本号),提交(提交时的说明)
1 file 一个文件被改动,1 insertion 一个文件被添加
log追踪
git log 相当于你的提交日志
git log -p -2 最近两次提交内容的不同
git log --author
git log --oneline 简化版的git log,只显示一行。
git log --graph 查看版本线图
git log --pretty=format 打印出格式化的日志
追踪文件修改前后的不同
git diff 查看文件和之前的修改的不同
git diff --staged 在stage状态查看修改的不同 (就是当git add .的时候)
当你需要对比和上一次提交代码之前修改代码不同的时候,可以用这两个命令来实现
文件忽略.gitignore
/node_modules 忽略node_modules文件夹下所有文件
*.log 忽略.log结尾的文件
&.zip 忽略.zip结尾的文件
git rm -r -- cached. 把已追踪的文件忽略
撤销追踪操作 一键还原
git checkout -- [filename] 恢复到上一次的状态 就是切到上一步提交的版本
git reset HEAD [filename] 撤销当前文件的追踪
版本回退(慎用)
git reset --hard HEAD ^ 回退到上一个版本
git reset --hard HEAD ^^ 回退到上上一个版本
git reset --hard HEAD [hash号] 回退到指定hash的版本
git reflog 指针理解
回到旧版本(推荐)
git checkout [hash号] -- [filename] 将某一个文件切回到版本号
git checkout [hash好] -- . 将所有切回到这个版本
版本回退和回到版本的概念是不同的,如果是版本回退 :v1 -> v2 -> v3 ,如果我要回退到v2这个版本,那么v3这个版本就会被删掉。回到某个版本则不会删掉v3这个版本,而是v3的指针会指到v2,变成v1 -> v2 -> v3 -> v2。
建立切换分支删除分支(重点)
git branch [name] 创建一个分支,不加名字就是展示分支
git checkout [branch name] 切换分支
git checkout -b [branch name] 建立和切换同时进行
git branch [name] -d 删除一个分支
git branch [name] -D 强制删除分支
分支的作用就是当多人开发的时候,不影响生产分支的情况下 ,大家各自开发各自的,当需要合并的时候,再合并。
当你误删了分支怎么办?1.拿到被删分支的hash值。2.git branch [hash值] 分支就会回来了。这个方法我没试验过。
分支的创建和切换非常重要,我之前就怕合并(原罪是自己too young),一定要练习熟练。
合并分支和冲突的解决(重点)
git merge [branch name] 讲name分支合并到目前所处的分支
git status 查看分支冲突的原因
git merge --abort 忽略合并
手动选择正确内容
git commit
首先在dev-test的分支下修改了代码
这时commit代码,在test分支下已经生成了一个版本
这时我切换分支到develop并在相同的位置写了这样的代码并提交。
这时,我打算将develop分支上的内容合并到dev-test分支 于是有了以下的操作,当我打算合并的时候,git报错,分支冲突在myActivity这个类,翻译为(自动合并失败,修复冲突并提交结果)
在android studio中会显示出冲突的地方,HEAD到=代码 当前分支的内容 =到develop 代表develop分支(即你打算合并的分支)的内容,这个时候就可以取舍了,可以根据自己的需求删除或保留冲突的地方。(git status也可以查看出具体冲突的文件)
接下来就是用git add. ,git commit 这两个方法 然后会出现以下情况,这时候你将冲突的描述写完后
添加描述,然后摁下ESC 输入:wq。最后回车,这样冲突就解决了。
总结:当合并分支发生冲突的时候,有两种解决方式:1.手动解决冲突,看哪些代码需要留下,哪些代码需要删除。这种方式的前提是你知道哪些代码需要合并。2.忽略合并,当前代码不知道哪些需要留下,哪些需要删掉的时候,就是用--abort方法。
通过命令查看版本线图
git log --graph
git log --oneline --graph
git log --oneline --graph --all 查看所有分支下的线图
git log --oneline --graph -[number]
快转机制的意义
快转实际就是当前master的将来时
git merge branchname --no-ff
更多合并的方法
git merge --no-ff --no-commit [branchname]
git merge --squash [branchname] 不想在合并分支时体现你多次commit记录的话,就用这个方法
git reset --hard ORIG_HEAD 回退到源版本,也就是最初的版本
一次性删掉所有不想要的分支
git branch --merged i egrep -v "(^|maseter|develop)" | xargs git branch -d 括号里代表不想删的分支
今天先记录这么多,过两天补充跟远端有关的笔记。
补充一下
如何合并分支中的部分提交
1.首先查看需要合并的分支中提交的hash号
2.切换到主分支, 使用 git cherry-pick hash号 (这个hash号是分支中提交的hash号)
3.然后就ok了