相信大家最开始用git管理代码时,在commit或者push时总会遇到各种各样的错误,然后再根据错误原因去百度原因,会得到各种各样的答案,然后问题也没得到解决。这就很苦恼了,继续又瞎掰扯一会又好了。
面试时看你写了git,也会问你相关问题,还比较细,为了不只是停留在git commit -m " "和git -push。
痛定思痛,我决定重新了解下这个东西。
1. 分布式和集中式
git是Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件,是一个开源的分布式版本控制系统。
什么是分布式和集中式呢?他们有什么区别?
集中式开发:是将项目集中存放在中央服务器中,在工作的时候,大家只在自己电脑上操作,从同一个地方下载最新版本,然后开始工作,做完的工作再提交给中央服务器保存。这种方式需要联网,现在云开发就是这样的处理方式。
分布式开发:只要提供一台电脑作为版本集中存的服务器放就够了,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它也一样干活,只是交换修改不方便而已。而每一台电脑有各自独立的开发环境,不需要联网,本地直接运行,相对集中式安全系数高很多。
2. git常见命令
1----初始化
git init --在当前目录下生成.git文件夹,里面包含相应的配置文件,亦可以直接用
git init projectname -->添加本地仓库
git remote add origin https://github.com/xxxx 添加远程链接,可以将代码放到对应的服务器上
2----添加用户信息及配置
git config --global user.name "xxxxx"
git config --global user.email "xxxxx"
不同系统之间文件结束标志可能不一样,所以需要配置
假如你正在Windows上写程序,又或者你正在和其他人合作,他们在Windows上编程,而你却在其他系统上,在这些情况下,你可能会遇到行尾结束符问题。这是因为Windows使用回车和换行两个字符来结束一行,而Mac和Linux只使用换行一个字符。虽然这是小问题,但它会极大地扰乱跨平台协作。
Git可以在你提交时自动地把行结束符CRLF转换成LF,而在迁出代码时把LF转换成CRLF。用core.autocrlf来打开此项功能,如果是在Windows系统上,把它设置成true,这样当迁出代码时,LF会被转换成CRLF:
git config --global core.autocrlf true
Linux或Mac系统使用LF作为行结束符,因此你不想 Git 在签出文件时进行自动的转换;当一个以CRLF为行结束符的文件不小心被引入时你
肯定想进行修正,把core.autocrlf设置成input来告诉 Git 在提交时把CRLF转换成LF,迁出时不转换
git config --global core.autocry input
3----颜色调整
git config --global color.ui auto
git config --global color.ui true
4----三个用户
local:优先级最高
sytem:
global:
5----查看状态
git status
命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。
一般在commit之前最好使用该命令
6----提交
git add filename -->将文件添加到暂存区
git commit -m "add meg" --->提交到版本控制系统,最好添加注释
7----diff
做了一个简单的改动,然后提交了它,git告诉你改动了什么,与暂存区作比较
git diff --staged 或 git diff --cached 暂存区与历史提交的改动作比较
git diff HEAD 显示工作目录与最后一次commit之间的文件变更,即显示所有未commit(包括未add和add两类)的文件变更
HEAD在git一个指向当前的指针
git diff --word diff 默认是一行的改动,这个命令可以看到字的改动
git diff --stat 要查看有哪些文件发生了变化,可以加上--stat参数
git diff <分支名1> <分支名2> :比较两个分支上最后 commit 的内容的差别
8----log版本
显示按时间顺序从上往下,上面的最新
git log --oneline 快速概要,将每条日志的输出为一行,关于我们提交的是什么
git log -[length] -[length]参数用于指定显示多少条日志
git log --stat --->每次提交包含的文件
git log --patch 修改的地方
git log --graph -graph参数会绘制提交的线索,如果有合并的话,也会更清晰地显示出来
--decorate 参数用来显示一些相关的信息,如HEAD、分支名、tag名等
git log --name-status 会带出每次提交对应的文件改动
git log --graph --all --decorate --oneline
git log --author yourname
git log --grep keywords
git log -p -- RELEASE-NOTE.md
通过组合使用--auther、--grep、-p这几个参数,几乎能满足大部分检索需求
9----remove移除
git add . ---->监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除 的文件
git add -u 已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区
git add -A 上面两个功能的合集
git rm filename 删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用git rm
git rm --cached -->当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制
git ignore file 保证以后不会被添加
10----move移动文件
git mv filename1 filename2 文件重命名并add
一个文件mv之后是不是原来的文件,不同的判断依据不同的版本控制系统
CVS ---->每一次改变后都不是
SVN ----->数字标识
git ------>相似度
11----branch分支
git checkout branchname 切换分支
git checkout -b branchname 创建并切换
12----checkout
git checkout **** 撤销丢弃编辑的文件
git checkout --filename 把文件从HEAD中签出
13----合并merge
两个文件相似度达到规定的值,会冲突,这个值也可以修改
三种合并方式
git merge 普通方式
git merge --squash 分支中的 commit 保留一个在 master 中
git merge --rebase 既合并 commits,又保留作者的信息如下:先切换到 要合并的 分支:git checkout test
变基:git rebase -i master
切换回目标分支:git checkout master
合并: git merge test
git merge --abort 该命令仅仅在合并后导致冲突时才使用,将会抛弃合并过程并且尝试重建合并前的状态
git branch -d 删除
14----reset回滚三种方式
reset --hard HEAD^ HEAD 和当前 branch 切到上一条commit 的同时,你工作目录里的新改动和已经add到stage区的新改动也会一起全都消失
reset --soft 保留工作目录(不影响原来本地的文件未提交的也不受影响),并把重置 HEAD 所带来的新的差异放进暂存区
git reset (–mixed) 保留工作目录,并将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态